summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-12-12 13:39:49 +0100
committerErich Eckner <git@eckner.net>2017-12-12 13:39:49 +0100
commit395d51482b8434de790ffa7703a8990fff6315b6 (patch)
treed46c157794c0f306d2b2329af2b13776e0d178a2
parentfd99b85a22059e22b7f98b1668fc6d0a60493d5c (diff)
downloadepost-395d51482b8434de790ffa7703a8990fff6315b6.tar.xz
epostunit.pas: skaliere neu
-rw-r--r--epostunit.pas55
-rw-r--r--typenunit.pas51
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;