summaryrefslogtreecommitdiff
path: root/typenunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-03-29 15:00:11 +0200
committerErich Eckner <git@eckner.net>2016-03-30 16:08:21 +0200
commit238e18a5ce087c3b2940722bda86b39a95a44065 (patch)
tree1520af6e6ae342de306905e2d64f01c1e7cbfb6e /typenunit.pas
parentda9fb8d996bbf50058d6ca40137fcc9eb14b4f82 (diff)
downloadepost-238e18a5ce087c3b2940722bda86b39a95a44065.tar.xz
Gaußfit eingebaut
Diffstat (limited to 'typenunit.pas')
-rw-r--r--typenunit.pas66
1 files changed, 66 insertions, 0 deletions
diff --git a/typenunit.pas b/typenunit.pas
index 5814925..6d24d16 100644
--- a/typenunit.pas
+++ b/typenunit.pas
@@ -397,6 +397,19 @@ type
// keine Änderung der Werte(skalierung)
function dumpParams: string; override;
end;
+ tFitTransformation = class(tKoordinatenTransformation)
+ private
+ _senkrecht: boolean;
+ _adLaenge: longint;
+ _adStao: tExtPoint;
+ public
+ constructor create(daten: tTransformation; senkrecht: boolean; adLaenge: longint; adStart,adStop: extended);
+ procedure aktualisiereXsTs; override;
+ procedure aktualisiereAchsen; override;
+ // keine Änderung der Werte(skalierung)
+ function wertZuPositionAufAchse(const l: tLage; x: extended): extended; override;
+ function dumpParams: string; override;
+ end;
tAgglomeration = class (tKoordinatenTransformation)
private
_nullposition: extended;
@@ -2059,6 +2072,59 @@ begin
result:='Koordinatenausschnitt: '+inttostr(gr['x','x'])+'..'+inttostr(gr['x','y'])+' x '+inttostr(gr['y','x'])+'..'+inttostr(gr['y','y']);
end;
+// tFitTransformation **********************************************************
+
+constructor tFitTransformation.create(daten: tTransformation; senkrecht: boolean; adLaenge: longint; adStart,adStop: extended);
+begin
+ inherited create;
+ wmiaExplizit:=true; // nicht sinnvoll berechenbar
+ _senkrecht:=senkrecht; // die Richtung, in der gefittet wurde ("andere Dimension") - also senkrecht zur übernommenen Ausdehnung
+ _adLaenge:=adLaenge; // Größe in der "anderen Dimension"
+ _adStao['x']:=adStart; // Start und
+ _adStao['y']:=adStop; // Stopp in der "anderen Dimension"
+ if (_adLaenge=1) xor (_adStao['x']=_adStao['y']) then
+ fehler('Die gefitteten Daten müssen genau dann eindimensional sein, wenn Start = Stopp ist. ('+inttostr(_adLaenge)+'-d vs. '+floattostr(_adStao['x'])+'..'+floattostr(_adStao['y'])+')');
+ fuegeVorgaengerHinzu(daten);
+end;
+
+procedure tFitTransformation.aktualisiereXsTs;
+var
+ c: char;
+begin
+ for c:='x' to 'y' do
+ out_xs_ts[c]:=_adLaenge+(in_xs_ts[c]-_adLaenge)*byte(_senkrecht xor (c='y'));
+end;
+
+procedure tFitTransformation.aktualisiereAchsen;
+var
+ c: char;
+begin
+ for c:='x' to 'y' do begin
+ out_achsen[char(ord('x')+byte(_senkrecht)),c]:=
+ in_achsen[char(ord('x')+byte(_senkrecht)),c];
+ out_achsen[char(ord('y')-byte(_senkrecht)),c]:=
+ _adStao[c];
+ end;
+end;
+
+function tFitTransformation.wertZuPositionAufAchse(const l: tLage; x: extended): extended;
+begin
+ if (l in [lOben,lUnten]) xor _senkrecht then
+ result:=0 // keine Ausdehnung in dieser Richtung!
+ else
+ result:=vorgaenger[0].wertZuPositionAufAchse(l,x);
+end;
+
+function tFitTransformation.dumpParams: string;
+begin
+ result:='FitTransformation: ';
+ if _senkrecht then
+ result:=result+'vertik'
+ else
+ result:=result+'horizont';
+ result:=result+'al';
+end;
+
// tAgglomeration **************************************************************
constructor tAgglomeration.create;