diff options
author | Erich Eckner <git@eckner.net> | 2017-12-12 13:39:49 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2017-12-12 13:39:49 +0100 |
commit | 395d51482b8434de790ffa7703a8990fff6315b6 (patch) | |
tree | d46c157794c0f306d2b2329af2b13776e0d178a2 | |
parent | fd99b85a22059e22b7f98b1668fc6d0a60493d5c (diff) | |
download | epost-395d51482b8434de790ffa7703a8990fff6315b6.tar.xz |
epostunit.pas: skaliere neu
-rw-r--r-- | epostunit.pas | 55 | ||||
-rw-r--r-- | typenunit.pas | 51 |
2 files changed, 106 insertions, 0 deletions
diff --git a/epostunit.pas b/epostunit.pas index 24f36cc..e367ad0 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -4542,8 +4542,63 @@ begin end; function tWerte.skaliere(sT: boolean; f: tMyStringList; threads: longint): boolean; +var + bekannteBefehle: tMyStringList; + s: string; + skalierung: array['x'..'z'] of string; + c: char; + transformation: tLineareAchsenVerzerrTransformation; begin + result:=false; + bekannteBefehle:=tMyStringList.create; + for c:='x' to 'z' do + skalierung[c]:='1'; + repeat + if not f.metaReadln(s,true) then begin + gibAus('Unerwartetes Dateiende!',3); + exit; + end; + bekannteBefehle.clear; + if istDasBefehl('Ende',s,bekannteBefehle,false) then + break; + for c:='x' to 'z' do begin + if istDasBefehl(c+':',s,bekannteBefehle,true) then begin + if skalierung[c]<>'1' then begin + gibAus('Ich kann nicht mehrere '+c+'-Skalierungen gleichzeitig anwenden!',3); + bekannteBefehle.free; + exit; + end; + skalierung[c]:=s; + s:=''; + break; + end; + end; + if s='' then + continue; + bekannteBefehle.sort; + gibAus('Verstehe Option '''+s+''' nicht beim Skalieren!'#10'Ich kenne:'#10+bekannteBefehle.text,3); + bekannteBefehle.free; + exit; + until false; + + if (skalierung['x']<>'1') or + (skalierung['y']<>'1') then begin + transformation:=tLineareAchsenVerzerrTransformation.create; + for c:='x' to 'y' do + transformation.fak[c]:=abs(exprToFloat(sT,skalierung[c])); + transformation.fuegeVorgaengerHinzu(transformationen); + transformationen:=transformation; + end; + + if skalierung['z']<>'1' then + fehler('Werteskalierung ist noch nicht implementiert!'); + + if sT then begin + result:=true; + exit; + end; + result:=true; end; function tWerte.macheKomplex(sT: boolean; f: tMyStringList; threads: longint): boolean; diff --git a/typenunit.pas b/typenunit.pas index 7a0a3e9..2fd1bf6 100644 --- a/typenunit.pas +++ b/typenunit.pas @@ -446,6 +446,18 @@ type // keine Änderung der Achsenbegrenzungen, der Werte(skalierung) function dumpParams: string; override; end; + tLineareAchsenVerzerrTransformation = class (tKoordinatenTransformation) + private + procedure aktualisiereAchsen; override; + // keine Änderung der Punkt-Positionen + function transformiereAchseEinzeln(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; override; + function transformiereAchseEinzelnInvers(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; override; + // keine Änderung der Werte + public + fak: tExtPoint; + constructor create; + function dumpParams: string; override; + end; tLambdaZuOmegaTransformation = class (tKoordinatenTransformation) private _faktor: extended; @@ -2444,6 +2456,45 @@ begin outXSTS[c]:=gr[c,'y']-gr[c,'x']+1; end; +// tLineareAchsenVerzerrTransformation ***************************************** + +procedure tLineareAchsenVerzerrTransformation.aktualisiereAchsen; +var + c,d: char; +begin + for c:='x' to 'y' do + for d:='x' to 'y' do + outAchsen[c,d]:=inAchsen[c,d]*fak[c]; +end; + +function tLineareAchsenVerzerrTransformation.transformiereAchseEinzeln(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; +begin + result:=x*fak[paralleleRichtung[l]]; + if auszerhalbIstFehler then + testeAuszerhalb(l,result); +end; + +function tLineareAchsenVerzerrTransformation.transformiereAchseEinzelnInvers(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; +begin + if auszerhalbIstFehler then + testeAuszerhalb(l,x); + result:=x/fak[paralleleRichtung[l]]; +end; + +constructor tLineareAchsenVerzerrTransformation.create; +var + c: char; +begin + inherited create; + for c:='x' to 'y' do + fak[c]:=1; +end; + +function tLineareAchsenVerzerrTransformation.dumpParams: string; +begin + result:='* ' + tExtPointToStr(fak) + ' ' + inherited dumpParams; +end; + // tLambdaZuOmegaTransformation ************************************************ constructor tLambdaZuOmegaTransformation.create; |