diff options
Diffstat (limited to 'typenunit.pas')
-rw-r--r-- | typenunit.pas | 75 |
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; |