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