summaryrefslogtreecommitdiff
path: root/typenunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'typenunit.pas')
-rw-r--r--typenunit.pas94
1 files changed, 94 insertions, 0 deletions
diff --git a/typenunit.pas b/typenunit.pas
index 8e9da0a..974090e 100644
--- a/typenunit.pas
+++ b/typenunit.pas
@@ -283,6 +283,18 @@ type
// keine Änderung der Werte(skalierung)
function dumpParams: string; override;
end;
+ tAgglomeration = class (tKoordinatenTransformation)
+ schritt: extended;
+ anzahl: longint;
+ horizontal: boolean;
+ constructor create; overload;
+ constructor create(original: tAgglomeration); overload;
+ function xsteps_tsiz: tIntPoint; override;
+ function achsen: t2x2Extended; override;
+ function transformiereKoordinaten(const p: tExtPoint): tExtPoint; override; overload;
+ // keine Änderung der Werte(skalierung)
+ function dumpParams: string; override;
+ end;
tBearbeitungstyp = (btUnbekannt,btKnick,btLog,btAbsLog,btAbs);
tWerteTransformation = class (tTransformation)
// eine generische Transformation der Werte
@@ -397,6 +409,7 @@ type
function add(st: boolean; s: string; f: tMyStringlist; etf: tExprToFloat): boolean; overload;
function add(syntaxtest: boolean; s: string; xscale,yscale: extended; etf: tExprToFloat): boolean; overload;
procedure addAusschnitt(xmin,xmax,tmin,tmax: longint);
+ function addAgglomeration(horizontal: boolean; schritt: extended; anzahl: longint): boolean;
function append(inhs: tTransformationen): boolean;
function transformiereKoordinaten(const lage: tLage; const x: extended): extended; overload;
function transformiereKoordinaten(const x,y: extended): tExtPoint; overload;
@@ -1468,6 +1481,67 @@ begin
result:='Koordinatenausschnitt: '+inttostr(gr['x','x'])+'..'+inttostr(gr['x','y'])+' x '+inttostr(gr['y','x'])+'..'+inttostr(gr['y','y']);
end;
+// tAgglomeration **************************************************************
+
+constructor tAgglomeration.create;
+begin
+ inherited create;
+ schritt:=0;
+ anzahl:=0;
+ horizontal:=false;
+end;
+
+constructor tAgglomeration.create(original: tAgglomeration);
+begin
+ inherited create;
+ schritt:=original.schritt;
+ anzahl:=original.anzahl;
+ horizontal:=original.horizontal;
+end;
+
+function tAgglomeration.xsteps_tsiz: tIntPoint;
+var
+ c: char;
+begin
+ for c:='x' to 'y' do
+ result[c]:=in_xs_ts[c]*(1+(anzahl-1)*byte(horizontal xor (c='y')));
+end;
+
+function tAgglomeration.achsen: t2x2Extended;
+var
+ c,d: char;
+begin
+ for c:='x' to 'y' do
+ if in_xs_ts[c]<=1 then begin
+ for d:='x' to 'y' do
+ result[c,d]:=in_achsen[c,d] + schritt*(anzahl-1)*byte((horizontal xor (c='y')) and (d='y'));
+ if in_achsen[c,'x']<>in_achsen[c,'y'] then
+ fehler('Nur eine Koordinate, aber '+floattostr(in_achsen[c,'x'])+' = '+c+'start <> '+c+'stop = '+floattostr(in_achsen[c,'y'])+'!');
+ end
+ else begin
+ if horizontal xor (c='y') then
+ fehler('In der Richtung der Agglomeration ('+c+') können nicht mehrere Daten liegen!');
+ for d:='x' to 'y' do
+ result[c,d]:=in_achsen[c,d];
+ end;
+end;
+
+function tAgglomeration.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
+begin
+ testeAuszerhalb(p);
+ result:=p; // es ist etwas unpräzise, schließlich landet p des i-ten Datensatzes auf p + i * schritt * (byte(horizontal);byte(not horizontal))
+end;
+
+function tAgglomeration.dumpParams: string;
+begin
+ result:='Agglomeration: '+inttostr(anzahl)+'x ';
+ if horizontal then
+ result:=result+'horizont'
+ else
+ result:=result+'vertik';
+ result:=result+'al um '+floattostr(schritt)+' versetzt';
+end;
+
// tWerteKnickTransformation ***************************************************
constructor tWerteKnickTransformation.create;
@@ -1932,6 +2006,26 @@ begin
achsenUndGroeszeAktualisieren;
end;
+function tTransformationen.addAgglomeration(horizontal: boolean; schritt: extended; anzahl: longint): boolean;
+begin
+ result:=false;
+ if horizontal and (xsteps<>1) then begin
+ gibAus('Horizontale Agglomeration über in x-Richtung ausgedehnte Werte ist nicht erlaubt!',3);
+ exit;
+ end;
+ if (not horizontal) and (tsiz<>1) then begin
+ gibAus('Vertikale Agglomeration über in t-Richtung ausgedehnte Werte ist nicht erlaubt!',3);
+ exit;
+ end;
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tAgglomeration.create;
+ (last as tAgglomeration).horizontal:=horizontal;
+ (last as tAgglomeration).schritt:=schritt;
+ (last as tAgglomeration).anzahl:=anzahl;
+ achsenUndGroeszeAktualisieren;
+ result:=true;
+end;
+
function tTransformationen.kopiereVon(original: tTransformationen): boolean;
begin
clear;