summaryrefslogtreecommitdiff
path: root/typenunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'typenunit.pas')
-rw-r--r--typenunit.pas75
1 files changed, 49 insertions, 26 deletions
diff --git a/typenunit.pas b/typenunit.pas
index 8c25fca..52a05d6 100644
--- a/typenunit.pas
+++ b/typenunit.pas
@@ -288,7 +288,7 @@ type
procedure aktualisiereWmia; virtual;
function transformiereKoordinatenEinzeln(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; virtual;
- function transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; virtual;
+ function transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; virtual;
// wie ändert sich die Position eines Punktes (Paradebeispiel: bei Spiegelung: x -> xSteps-1-x)
// ist für p veranwortlich?
// und die inverse Funktion
@@ -335,6 +335,7 @@ type
// wie lauten xStart,xStop,tStart,tStop?
function transformiereKoordinaten(const p: tExtPoint; const tiefe: longint = -1): tExtPoint; overload;
function transformiereKoordinaten(const x,y: longint; const tiefe: longint = -1): tExtPoint; overload;
+ function transformiereKoordinatenInvers(const p: tExtPoint; const tiefe: longint = -1): tExtPoint;
function wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; virtual;
function positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; virtual;
function transformiereWert(const x: extended; const tiefe: longint = -1): extended;
@@ -409,7 +410,7 @@ type
constructor create;
constructor create(vorg: tTransformation);
function transformiereKoordinatenEinzeln(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
- function transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
+ function transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
// keine Änderung der Achsenbegrenzungen, der Werte(skalierung), der Ausdehnung
function dumpParams: string; override;
end;
@@ -427,7 +428,7 @@ type
expFak: tExtPoint; // Vorfaktoren der Exponentialfunktionen
constructor create; overload;
function transformiereKoordinatenEinzeln(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
- function transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
+ function transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
function initAbbildung(syntaxTest: boolean; s: string; xScale,yScale: extended; etf: tExprToFloat): boolean;
function zielausdehnung: t2x2Longint;
procedure aktualisiereXsTs; override;
@@ -447,7 +448,7 @@ type
function positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; override;
procedure aktualisiereAchsen; override;
function transformiereKoordinatenEinzeln(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
- function transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
+ function transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
// keine Änderung der Werte(skalierung), der Ausdehnung
function dumpParams: string; override;
end;
@@ -458,7 +459,7 @@ type
procedure aktualisiereXsTs; override;
procedure aktualisiereAchsen; override;
function transformiereKoordinatenEinzeln(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
- function transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
+ function transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint; override;
// keine Änderung der Werte(skalierung)
function dumpParams: string; override;
end;
@@ -1842,7 +1843,7 @@ begin
testeAuszerhalb(p);
end;
-function tTransformation.transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
+function tTransformation.transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
begin
result:=p;
if auszerhalbIstFehler then
@@ -1867,11 +1868,21 @@ begin
result:=transformiereKoordinaten(p,tiefe);
end;
+function tTransformation.transformiereKoordinatenInvers(const p: tExtPoint; const tiefe: longint = -1): tExtPoint;
+begin
+ result:=transformiereKoordinatenEinzelnInvers(p);
+ if (length(vorgaenger)>0) and (tiefe<>0) then
+ result:=vorgaenger[0].transformiereKoordinaten(result,tiefe-1);
+end;
+
function tTransformation.wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
var
c,d: char;
p: tExtPoint;
begin
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,x);
+
// das generische Verhalten ist
c:=paralleleRichtung[l];
d:=senkrechteRichtung[l];
@@ -1888,7 +1899,8 @@ begin
p:=transformiereKoordinatenEinzeln(p,auszerhalbIstFehler);
// und in Anteile zurückzurechnen
- result:=p[c]/outXSTS[c];
+ result:=p[c]/(outXSTS[c]-1);
+
end;
function tTransformation.positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
@@ -1906,16 +1918,18 @@ begin
// in Koordinaten umrechnen
for d:='x' to 'y' do
- p[d]:=p[d] * (inXSTS[d]-1);
+ p[d]:=p[d] * (outXSTS[d]-1);
// transformieren
- p:=transformiereKoordinatenEinzelnIvers(p,auszerhalbIstFehler);
+ p:=transformiereKoordinatenEinzelnInvers(p,auszerhalbIstFehler);
// und in Anteile zurückrechnen
- p[c]:=p[c]/outXSTS[c];
+ p[c]:=p[c]/(inXSTS[c]-1);
// und vom Vorgänger weiter berechnen lassen
- result:=vorgaenger[0].positionAufAchseZuWert(l,p[c],auszerhalbIstFehler)
+ result:=vorgaenger[0].positionAufAchseZuWert(l,p[c],auszerhalbIstFehler);
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,result);
end;
function tTransformation.transformiereWertEinzeln(const x: extended): extended;
@@ -1976,14 +1990,15 @@ function tKeineTransformation.positionAufAchseZuWert(const l: tLage; x: extended
var
c: char;
begin
- if auszerhalbIstFehler then
- testeAuszerhalb(l,x);
// ein Wert am Anfang ist einfach linear zu interpolieren
c:=paralleleRichtung[l];
if x=0 then
result:=outAchsen[c,'x']
else
result:=x/(1-1/outXSTS[c])*(outAchsen[c,'y']-outAchsen[c,'x'])+outAchsen[c,'x'];
+
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,result);
end;
// tIdentitaet *****************************************************************
@@ -2057,7 +2072,7 @@ begin
// egal, wie die Werte vor der FFT aussahen, wir setzen die Frequenzen danach linear
c:=paralleleRichtung[l];
if x=outAchsen[c,'x'] then
- result:=0
+ result:=0
else
result:=(x-outAchsen[c,'x'])/(outAchsen[c,'y']-outAchsen[c,'x']);
@@ -2069,8 +2084,6 @@ function tFFTTransformation.positionAufAchseZuWert(const l: tLage; x: extended;
var
c: char;
begin
- if auszerhalbIstFehler then
- testeAuszerhalb(l,x);
if ((l in [lOben,lUnten]) and not horizontal) or // untransformierte Achse?
((not (l in [lOben,lUnten])) and not vertikal) then
result:=inherited positionAufAchseZuWert(l,x,auszerhalbIstFehler) // Vorfahren befragen
@@ -2082,6 +2095,8 @@ begin
else
result:=x/(1-1/outXSTS[c])*(outAchsen[c,'y']-outAchsen[c,'x'])+outAchsen[c,'x'];
end;
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,result);
end;
function tFFTTransformation.dumpParams: string;
@@ -2112,7 +2127,7 @@ begin
result['y']:=p['y'];
end;
-function tSpiegelungsTransformation.transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
+function tSpiegelungsTransformation.transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
begin
if auszerhalbIstFehler then
testeAuszerhalb(p);
@@ -2219,11 +2234,11 @@ begin
end;
end;
-function tKonkreteKoordinatenTransformation.transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
+function tKonkreteKoordinatenTransformation.transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
begin
if auszerhalbIstFehler then
testeAuszerhalb(p);
- fehler('tKonkreteKoordinatenTransformation: transformiereKoordinatenEinzelnIvers kann es nicht geben, weil transformiereKoordinatenEinzeln nicht umkehrbar sein muss!');
+ fehler('tKonkreteKoordinatenTransformation: transformiereKoordinatenEinzelnInvers kann es nicht geben, weil transformiereKoordinatenEinzeln nicht umkehrbar sein muss!');
result:=extPoint(0,0);
end;
@@ -2392,18 +2407,22 @@ end;
function tLambdaZuOmegaTransformation.wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
begin
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,x);
if ((l in [lOben,lUnten]) and horizontal) or // transformierte Achse?
((l in [lLinks,lRechts]) and vertikal) then
x:=_faktor/x;
- result:=vorgaenger[0].wertZuPositionAufAchse(l,x,auszerhalbIstFehler); // Vorfahren befragen
+ result:=vorgaenger[0].wertZuPositionAufAchse(l,x,auszerhalbIstFehler); // Vorgaenger befragen
end;
function tLambdaZuOmegaTransformation.positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
begin
+ result:=vorgaenger[0].positionAufAchseZuWert(l,x,auszerhalbIstFehler); // Vorfahren befragen
if ((l in [lOben,lUnten]) and horizontal) or // transformierte Achse?
((l in [lLinks,lRechts]) and vertikal) then
- x:=_faktor/x;
- result:=vorgaenger[0].positionAufAchseZuWert(l,x,auszerhalbIstFehler); // Vorfahren befragen
+ result:=_faktor/result;
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,result);
end;
procedure tLambdaZuOmegaTransformation.aktualisiereAchsen;
@@ -2450,7 +2469,7 @@ begin
result['y']:=p['y'];
end;
-function tLambdaZuOmegaTransformation.transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
+function tLambdaZuOmegaTransformation.transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
var
verh: extended;
begin
@@ -2539,7 +2558,7 @@ begin
result[c]:=max(0,min(outXSTS[c],p[c]-gr[c,'x']));
end;
-function tKoordinatenAusschnitt.transformiereKoordinatenEinzelnIvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
+function tKoordinatenAusschnitt.transformiereKoordinatenEinzelnInvers(const p: tExtPoint; auszerhalbIstFehler: boolean = true): tExtPoint;
var
c: char;
begin
@@ -2591,6 +2610,8 @@ end;
function tFitTransformation.wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
begin
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,x);
if (l in [lOben,lUnten]) xor _senkrecht then
result:=0 // keine Ausdehnung in dieser Richtung!
else
@@ -2603,6 +2624,8 @@ begin
fehler('Eine fit-Transformation hat keine Ausdehnung in dieser Richtung!')
else
result:=vorgaenger[0].positionAufAchseZuWert(l,x,auszerhalbIstFehler);
+ if auszerhalbIstFehler then
+ testeAuszerhalb(l,result);
end;
function tFitTransformation.dumpParams: string;
@@ -2738,7 +2761,7 @@ end;
function tAgglomeration.positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
begin
- if auszerhalbIstFehler then
+ if auszerhalbIstFehler then // intentionally wrong!
testeAuszerhalb(l,x);
fehler('tAgglomeration: positionAufAchseZuWert ist noch nicht implementiert');
result:=0;
@@ -2807,7 +2830,7 @@ end;
function tDiagonaleAgglomeration.positionAufAchseZuWert(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
begin
- if auszerhalbIstFehler then
+ if auszerhalbIstFehler then // intentionally wrong
testeAuszerhalb(l,x);
fehler('tDiagonaleAgglomeration: positionAufAchseZuWert ist noch nicht implementiert!');
result:=0;