summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas724
1 files changed, 397 insertions, 327 deletions
diff --git a/epostunit.pas b/epostunit.pas
index 13640b3..cd66982 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -75,7 +75,7 @@ type
function findeAlleDateien(nam: string; var dat: tGenerischeInputDateiInfoArray; Vorlage: tGenerischeInputDateiInfo): boolean;
function ermittleExterneInputParameter(var f: tInputfile; out dateien: tGenerischeInputDateiInfoArray): boolean;
function ermittleInterneInputParameter(var dateien: tGenerischeInputDateiInfoArray): boolean;
- procedure initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tVerzerrung; ZPs: tPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
+ procedure initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tTransformationen; ZPs: tPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
function rXsteps: longint;
procedure wXsteps(xs: longint);
function rTsiz: longint;
@@ -100,6 +100,10 @@ type
function xscale: extended;
function tscale: extended;
function dichtenParameterErkannt(st: boolean; s: string; threads,xmin,xmax,tmin,tmax: longint): boolean;
+ function kont2disk(dir: char; x: extended): longint;
+ function kont2diskFak(dir: char; x: extended): extended;
+ function disk2kont(dir: char; x: longint): extended;
+ function disk2kontFak(dir: char; x: longint): extended;
public
eWerte: tLLWerteDouble;
sWerte: tLLWerteSingle;
@@ -107,8 +111,7 @@ type
bezeichner: string;
Konturen: pTKonturenArray;
wertes: pTWerteArray;
- Achsenskala: tAchsenskala;
- Werteskala: tWerteskala;
+ Transformationen: tTransformationen;
constructor create(Kont: pTKonturenArray; wert: pTWerteArray); overload;
constructor create(original: tWerte; xmin,xmax: longint); overload;
destructor destroy; override;
@@ -141,10 +144,10 @@ type
procedure beendeLeseThreadWennFertig;
property _xsteps: longint read rXsteps write wXsteps;
property _tsiz: longint read rTsiz write wTsiz;
- property _xstart: extended read rXstart write wXstart;
- property _xstop: extended read rXstop write wXstop;
- property _tstart: extended read rTstart write wTstart;
- property _tstop: extended read rTstop write wTstop;
+// property _xstart: extended read rXstart write wXstart;
+// property _xstop: extended read rXstop write wXstop;
+// property _tstart: extended read rTstart write wTstart;
+// property _tstop: extended read rTstop write wTstop;
property _np: extended read rNp write wNp;
property _beta: extended read rBeta write wBeta;
property _minw: extended read rMinw write wMinw;
@@ -161,7 +164,14 @@ type
linear: boolean;
end;
tLogThread = class(tThread)
- fertig: boolean;
+ private
+ _fertig: boolean;
+ raisedException: exception;
+ function rFertig: boolean;
+ public
+ property fertig: boolean
+ read rFertig
+ write _fertig;
constructor create;
destructor destroy; override;
procedure execute; override;
@@ -172,6 +182,7 @@ type
xMi,xMa,tMi,tMa,tOf,xOf: longint;
pW: tWerte;
constructor create(lk: pTLiKo; pWerte: tWerte; xMin,xMax,tMin,tMax,xOff,tOff: longint);
+ destructor destroy; override;
procedure stExecute; override;
end;
tQuotientThread = class(tLogThread)
@@ -179,6 +190,7 @@ type
xMi,xMa,tMi,tMa,tOf,xOf: longint;
dend,sor,quot: tWerte;
constructor create(dividend, divisor, quotient: tWerte; epsilon: extended; xMin,xMax,tMin,tMax,xOff,tOff: longint);
+ destructor destroy; override;
procedure stExecute; override;
end;
tBilderthread = class(tLogThread)
@@ -187,14 +199,14 @@ type
w: tWerte;
xmi,xma,tmi,tma,xpmi,xpma: Longint;
xz,yz: extended;
- nb: tBearbeitungen;
+ nb: tTransformationen;
farben: trgbArray;
werte: tExtendedArray;
anzahlen: tLongintArray;
pal: tRGBArray;
rahmen: boolean;
beschr: pTBeschriftungen;
- constructor create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const we: tWerte; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitung: tBearbeitungen; palette: pTPalette; beschri: pTBeschriftungen; rm: boolean);
+ constructor create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const we: tWerte; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitung: tTransformationen; palette: pTPalette; beschri: pTBeschriftungen; rm: boolean);
destructor destroy; override;
procedure stExecute; override;
end;
@@ -203,12 +215,14 @@ type
xmin,xmax,tmin,tmax: longint;
w: tWerte;
constructor create(xmi,xma,tmi,tma: longint; const werte: tWerte);
+ destructor destroy; override;
procedure stExecute; override;
end;
tSpiegelThread = class(tLogThread)
tmin,tmax: longint;
pW: tWerte;
constructor create(tmi,tma: longint; pWerte: tWerte);
+ destructor destroy; override;
procedure stExecute; override;
end;
tFFT2dNBThread = class(tLogThread)
@@ -216,6 +230,7 @@ type
pW: tWerte;
nb: tFFTDatenordnung;
constructor create(xmi,xma: longint; pWerte: tWerte; endordnung: tFFTDatenordnung);
+ destructor destroy; override;
procedure stExecute; override;
end;
tFFTThread = class(tLogThread)
@@ -226,6 +241,7 @@ type
pW: tWerte;
pvFehler: extended;
constructor create(werte: tWerte; xMin,xMax,tMin,tMax: longint; senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fenster: tFenster);
+ destructor destroy; override;
procedure stExecute; override;
end;
tKorrelThread = class(tLogThread)
@@ -234,6 +250,7 @@ type
qu,zi: tWerte;
pvFehler: extended;
constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,xOff,tOff: longint; wavelet: tWavelet);
+ destructor destroy; override;
procedure stExecute; override;
end;
tKonturAusWertenThread = class(tLogThread)
@@ -250,6 +267,7 @@ type
xmi,xma,tmi,tma,xof,tof: longint;
rtg: tIntegrationsRichtung;
constructor create(quelle, ziel: tWerte; xmin, xmax, tmin, tmax, xoff, toff: longint; richtung: tIntegrationsRichtung);
+ destructor destroy; override;
procedure stExecute; override;
end;
tSortiereNachYThread = class(tLogThread)
@@ -257,6 +275,7 @@ type
vo,bi,mt: longint;
erfolg: boolean;
constructor create(K: tKontur; threads,von,bis: longint);
+ destructor destroy; override;
procedure stExecute; override;
end;
tBefehlThread = class(tLogThread)
@@ -280,11 +299,11 @@ type
ZAs: tExtendedArray;
xMi,xMa,tMi,tMa,x0,t0,mt: longint; // bzgl. Ziel
eps: extended;
- verz: tVerzerrung;
+ verz: tTransformationen;
Warnstufe: tWarnstufe;
- constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tVerzerrung; zielpositionen: tPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
- procedure stExecute; override;
+ constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformationen; zielpositionen: tPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
destructor destroy; override;
+ procedure stExecute; override;
end;
tVerzerrThread = class(tLogThread)
qu,zi: tWerte;
@@ -292,8 +311,9 @@ type
ZGs: tExtPointArray;
ZAs: tExtendedArray;
xMi,xMa,tMi,tMa: longint; // bzgl. Ziel
- vb,nb: tBearbeitungen;
- constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tBearbeitungen);
+ vb,nb: tTransformationen;
+ constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformationen);
+ destructor destroy; override;
procedure stExecute; override;
end;
@@ -301,7 +321,7 @@ function neuePalette(var f: tInputfile): boolean;
function initBmpHeader(w,h: longint): tBmpHeader;
procedure schreibeBmpHeader(var f: file; w,h: longint);
function findePalette(out Palette: pTPalette; name: string): boolean;
-function erzeugeLegende(st: boolean; var f: tInputfile; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tBearbeitungen; pal: pTPalette): boolean;
+function erzeugeLegende(st: boolean; var f: tInputfile; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformationen; pal: pTPalette): boolean;
function strToFftDo(out fftDo: tFFTDatenordnung; s: string): boolean;
function findeWerte(s: String; pws: pTWerteArray; Kont: pTKonturenArray; darfErstellen: boolean): integer;
function findeKontur(s: String; pks: pTKonturenArray; darfErstellen: boolean): integer;
@@ -330,8 +350,7 @@ begin
eWerte:=tLLWerteDouble.create(ps);
Konturen:=Kont;
wertes:=wert;
- Achsenskala:=tAchsenskala.create;
- Werteskala:=tWerteskala.create;
+ Transformationen:=tTransformationen.create;
bezeichner:='';
end;
@@ -361,8 +380,7 @@ begin
end{of case};
if original.bezeichner='' then bezeichner:=''
else bezeichner:=original.bezeichner+'''';
- Achsenskala:=tAchsenskala.create(original.Achsenskala);
- Werteskala:=tWerteskala.create(original.Werteskala);
+ Transformationen:=tTransformationen.create(original.Transformationen);
wertes:=original.wertes;
end;
@@ -377,8 +395,7 @@ begin
freemem(sWerte.params,sizeof(tExtrainfos));
eWerte.free;
sWerte.free;
- Achsenskala.free;
- Werteskala.free;
+ Transformationen.free;
inherited destroy;
end;
@@ -404,8 +421,7 @@ var pSi: pTLLWerteSingle;
pEx: pTLLWerteDouble;
begin
original.warteAufBeendigungDesLeseThreads;
- Achsenskala.kopiereVon(original.Achsenskala);
- Werteskala.kopiereVon(original.Werteskala);
+ Transformationen.kopiereVon(original.Transformationen);
Genauigkeit:=original.Genauigkeit;
case Genauigkeit of
gSingle: begin
@@ -555,7 +571,7 @@ end;
procedure tWerte.wMinw(miw: extended);
begin
- werteskala.wmin:=miw;
+ Transformationen.wmin:=miw;
case genauigkeit of
gSingle: sWerte.params^.minw:=miw;
gExtended: eWerte.params^.minw:=miw;
@@ -572,7 +588,7 @@ end;
procedure tWerte.wMaxw(maw: extended);
begin
- werteskala.wmax:=maw;
+ Transformationen.wmax:=maw;
case genauigkeit of
gSingle: sWerte.params^.maxw:=maw;
gExtended: eWerte.params^.maxw:=maw;
@@ -1011,9 +1027,9 @@ begin
gExtended: blockread(f,tmpe,sizeof(extended));
end{of case};
tmpe:=tmpe*dateien[i].groeszenFaktor;
- if i=0 then _xstart:=tmpe;
- if tmpe<>_xstart then begin
- gibAus('Falscher linker Rand in '''+dateien[i].Name+''', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(_xstart)+'.',3);
+ if i=0 then Transformationen.xstart:=tmpe;
+ if tmpe<>Transformationen.xstart then begin
+ gibAus('Falscher linker Rand in '''+dateien[i].Name+''', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(Transformationen.xstart)+'.',3);
close(f);
exit;
end;
@@ -1025,9 +1041,9 @@ begin
gExtended: blockread(f,tmpe,sizeof(extended));
end{of case};
tmpe:=tmpe*dateien[i].groeszenFaktor;
- if i=0 then _xstop:=tmpe;
- if tmpe<>_xstop then begin
- gibAus('Falscher rechter Rand in '''+dateien[i].Name+''', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(_xstop)+'.',3);
+ if i=0 then Transformationen.xstop:=tmpe;
+ if tmpe<>Transformationen.xstop then begin
+ gibAus('Falscher rechter Rand in '''+dateien[i].Name+''', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(Transformationen.xstop)+'.',3);
close(f);
exit;
end;
@@ -1058,19 +1074,19 @@ begin
end;
end;
- _tstart:=Positionen[0]*dateien[0].groeszenFaktor;
- _tstop:=(Positionen[0]+1)*dateien[0].groeszenFaktor;
+ Transformationen.tstart:=Positionen[0]*dateien[0].groeszenFaktor;
+ Transformationen.tstop:=(Positionen[0]+1)*dateien[0].groeszenFaktor;
for i:=1 to length(Positionen)-1 do begin
- _tstart:=min(_tstart,Positionen[i]*dateien[i].groeszenFaktor);
- _tstop:=max(_tstop,(Positionen[i]+1)*dateien[i].groeszenFaktor);
+ Transformationen.tstart:=min(Transformationen.tstart,Positionen[i]*dateien[i].groeszenFaktor);
+ Transformationen.tstop:=max(Transformationen.tstop,(Positionen[i]+1)*dateien[i].groeszenFaktor);
end;
- if 0<>round(_tstart+length(dateien)*dateien[0].groeszenFaktor-_tstop) then begin
- gibAus('Die Dateien decken nicht den kompletten Zeitbereich von '+inttostr(round(_tstart))+'T bis '+inttostr(round(_tstop))+'T ab!',3);
+ if 0<>round(Transformationen.tstart+length(dateien)*dateien[0].groeszenFaktor-Transformationen.tstop) then begin
+ gibAus('Die Dateien decken nicht den kompletten Zeitbereich von '+inttostr(round(Transformationen.tstart))+'T bis '+inttostr(round(Transformationen.tstop))+'T ab!',3);
exit;
end;
setlength(sortiert,length(dateien));
for i:=0 to length(Positionen)-1 do
- sortiert[Positionen[i]-round(_tstart/dateien[i].groeszenFaktor)]:=dateien[i];
+ sortiert[Positionen[i]-round(Transformationen.tstart/dateien[i].groeszenFaktor)]:=dateien[i];
for i:=0 to length(Positionen)-1 do begin
dateien[i]:=sortiert[i];
if i=0 then begin
@@ -1093,7 +1109,7 @@ begin
result:=true;
end;
-procedure tWerte.initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tVerzerrung; ZPs: tPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
+procedure tWerte.initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tTransformationen; ZPs: tPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
var i,j: longint;
vits: array[boolean] of tVerzerrInitThread;
b: boolean;
@@ -1102,9 +1118,9 @@ begin
for i:=0 to _tsiz-1 do
for j:=0 to _xsteps-1 do
ZAs[j + i*_xsteps]:=0;
- for i:=tMin to tMax do begin
+ for i:=tMin to tMax do
for j:=xMin to xMax do begin
- ZGs[j+i*quelle._xsteps]:=verzerrung.ziel(j,i);
+ ZGs[j+i*quelle._xsteps]:=verzerrung.transformiereKoordinaten(j,i);
ZPs[j+i*quelle._xsteps].x:=floor(ZGs[j+i*quelle._xsteps].x);
ZPs[j+i*quelle._xsteps].y:=floor(ZGs[j+i*quelle._xsteps].y);
ZGs[j+i*quelle._xsteps].x:=
@@ -1122,7 +1138,6 @@ begin
ZAs[ZPs[j+i*quelle._xsteps].x + 1 + (ZPs[j+i*quelle._xsteps].y + 1)*_xsteps]:=
ZAs[ZPs[j+i*quelle._xsteps].x + 1 + (ZPs[j+i*quelle._xsteps].y + 1)*_xsteps] + ZGs[j+i*quelle._xsteps].x*ZGs[j+i*quelle._xsteps].y;
end;
- end;
end
else begin
for b:=false to true do
@@ -1162,12 +1177,13 @@ end;
function tWerte.xscale: extended;
begin
- result:=(_xstop-_xstart)/(_xsteps-1);
+ gibAus(floattostr(Transformationen.xstop)+' '+floattostr(Transformationen.xstart)+' '+inttostr(Transformationen.xsteps),3);
+ result:=(Transformationen.xstop-Transformationen.xstart)/(Transformationen.xsteps-1);
end;
function tWerte.tscale: extended;
begin
- result:=(_tstop-_tstart)/(_tsiz-1);
+ result:=(Transformationen.tstop-Transformationen.tstart)/(Transformationen.tsiz-1);
end;
function tWerte.dichtenParameterErkannt(st: boolean; s: string; threads,xmin,xmax,tmin,tmax: longint): boolean;
@@ -1188,6 +1204,54 @@ begin
result:=false;
end;
+function tWerte.kont2disk(dir: char; x: extended): longint;
+begin
+ case dir of
+ 'x':
+ result:=min(_xsteps-1,max(0,round(kont2diskFak(dir,x-Transformationen.xstart))));
+ 'y','t':
+ result:=min(_tsiz-1,max(0,round(kont2diskFak(dir,x-Transformationen.tstart))));
+ else
+ result:=-1;
+ end;
+end;
+
+function tWerte.kont2diskFak(dir: char; x: extended): extended;
+begin
+ case dir of
+ 'x':
+ result:=x*(_xsteps-1)/(Transformationen.xstop-Transformationen.xstart);
+ 'y','t':
+ result:=x*(_tsiz-1)/(Transformationen.tstop-Transformationen.tstart);
+ else
+ result:=-1;
+ end;
+end;
+
+function tWerte.disk2kont(dir: char; x: longint): extended;
+begin
+ case dir of
+ 'x':
+ result:=disk2kontFak(dir,x)+Transformationen.xstart;
+ 'y','t':
+ result:=disk2kontFak(dir,x)+Transformationen.tstart;
+ else
+ result:=nan;
+ end;
+end;
+
+function tWerte.disk2kontFak(dir: char; x: longint): extended;
+begin
+ case dir of
+ 'x':
+ result:=x/(_xsteps-1)*(Transformationen.xstop-Transformationen.xstart);
+ 'y','t':
+ result:=x/(_tsiz-1)*(Transformationen.tstop-Transformationen.tstart);
+ else
+ result:=nan;
+ end;
+end;
+
function tWerte.ladeDateien(st: boolean; var f: tInputfile; pl: boolean): boolean;
var inputs: tGenerischeInputDateiInfoArray;
@@ -1203,6 +1267,7 @@ end;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
+ Transformationen.clear;
Genauigkeit:=gSingle;
if not ermittleExterneInputParameter(f,inputs) then begin
aufraeumen;
@@ -1229,15 +1294,8 @@ begin
eWerte.liesDateien(inputs);
end{of case};
end;
- aufraeumen;
- Achsenskala.clear;
- Achsenskala.xstart:=_xstart;
- Achsenskala.xstop:=_xstop;
- Achsenskala.xsteps:=_xsteps;
- Achsenskala.tstart:=_tstart;
- Achsenskala.tstop:=_tstop;
- Achsenskala.tsiz:=_tsiz;
- Werteskala.clear;
+ Transformationen.xsteps:=_xsteps;
+ Transformationen.tsiz:=_tsiz;
result:=true;
end;
@@ -1251,11 +1309,11 @@ begin
warteaufBeendigungDesLeseThreads;
Genauigkeit:=gExtended;
_tsiz:=-100;
- _tstart:=-100;
- _tstop:=-100;
+ Transformationen.tstart:=-100;
+ Transformationen.tstop:=-100;
_xsteps:=-100;
- _xstart:=-100;
- _xstop:=-100;
+ Transformationen.xstart:=-100;
+ Transformationen.xstop:=-100;
_np:=-100;
_beta:=-100;
assignFile(g,datei);
@@ -1270,11 +1328,11 @@ begin
continue;
end;
if startetMit('tstart',s) then begin
- _tstart:=exprtofloat(st,s);
+ Transformationen.tstart:=exprtofloat(st,s);
continue;
end;
if startetMit('tstop',s) then begin
- _tstop:=exprtofloat(st,s);
+ Transformationen.tstop:=exprtofloat(st,s);
continue;
end;
if startetMit('xsteps',s) then begin
@@ -1282,11 +1340,11 @@ begin
continue;
end;
if startetMit('xstart',s) then begin
- _xstart:=exprtofloat(st,s);
+ Transformationen.xstart:=exprtofloat(st,s);
continue;
end;
if startetMit('xstop',s) then begin
- _xstop:=exprtofloat(st,s);
+ Transformationen.xstop:=exprtofloat(st,s);
continue;
end;
if startetMit('np',s) then begin
@@ -1305,7 +1363,14 @@ begin
closefile(g);
exit;
end;
- if (_tsiz=-100) or (_tstart=-100) or (_tstop=-100) or (_xsteps=-100) or (_xstart=-100) or (_xstop=-100) or (_np=-100) or (_beta=-100) then begin
+ if (_tsiz=-100) or
+ (Transformationen.tstart=-100) or
+ (Transformationen.tstop=-100) or
+ (_xsteps=-100) or
+ (Transformationen.xstart=-100) or
+ (Transformationen.xstop=-100) or
+ (_np=-100) or
+ (_beta=-100) then begin
gibAus('Ungenügende Informationen über Raumzeitfenster in Asci-Input-Datei '''+datei+'''!',3);
closefile(g);
exit;
@@ -1359,14 +1424,9 @@ begin
inc(k);
end;
end;
- Achsenskala.clear;
- Achsenskala.xstart:=_xstart;
- Achsenskala.xstop:=_xstop;
- Achsenskala.xsteps:=_xsteps;
- Achsenskala.tstart:=_tstart;
- Achsenskala.tstop:=_tstop;
- Achsenskala.tsiz:=_tsiz;
- Werteskala.clear;
+ Transformationen.clear;
+ Transformationen.xsteps:=_xsteps;
+ Transformationen.tsiz:=_tsiz;
gibAus('... fertig '+ZeitDarstellen(now-Zeit),3);
result:=true;
end;
@@ -1397,19 +1457,19 @@ begin
continue;
end;
if startetMit('xmin:',s) then begin
- xmin:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmin:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmax:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmin:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmax:=kont2disk('t',exprtofloat(st,s));
continue;
end;
setlength(liKo,length(liKo)+1);
@@ -1421,15 +1481,13 @@ begin
liKo[length(liKo)-1].werte:=wertes^[i mod (length(wertes^)-1)];
if _xsteps=0 then begin
_xsteps:=liKo[length(liKo)-1].werte._xsteps;
- _xstart:=liKo[length(liKo)-1].werte._xstart;
- _xstop:=liKo[length(liKo)-1].werte._xstop;
+ Transformationen.kopiereVon(liKo[length(liKo)-1].werte.Transformationen);
xmin:=0;
xmax:=_xsteps-1;
end;
if _tsiz=0 then begin
_tsiz:=liKo[length(liKo)-1].werte._tsiz;
- _tstart:=liKo[length(liKo)-1].werte._tstart;
- _tstop:=liKo[length(liKo)-1].werte._tstop;
+ Transformationen.kopiereVon(liKo[length(liKo)-1].werte.Transformationen);
tmin:=0;
tmax:=_tsiz-1;
end;
@@ -1445,20 +1503,20 @@ begin
gibAus('Ich bin dumm, ich kann nur Werte mit gleicher Genauigkeit zusammenrechnen!',3);
exit;
end;
- if liKo[length(liKo)-1].werte._xstart<>liKo[0].werte._xstart then begin
- gibAus('Anfangspostionen passen nicht zusammen ('+floattostr(liKo[0].werte._xstart)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte._xstart)+' bei '+inttostr(i)+')!',3);
+ if liKo[length(liKo)-1].werte.Transformationen.xstart<>liKo[0].werte.Transformationen.xstart then begin
+ gibAus('Anfangspostionen passen nicht zusammen ('+floattostr(liKo[0].werte.Transformationen.xstart)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte.Transformationen.xstart)+' bei '+inttostr(i)+')!',3);
exit;
end;
- if liKo[length(liKo)-1].werte._xstop<>liKo[0].werte._xstop then begin
- gibAus('Endpostionen passen nicht zusammen ('+floattostr(liKo[0].werte._xstop)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte._xstop)+' bei '+inttostr(i)+')!',3);
+ if liKo[length(liKo)-1].werte.Transformationen.xstop<>liKo[0].werte.Transformationen.xstop then begin
+ gibAus('Endpostionen passen nicht zusammen ('+floattostr(liKo[0].werte.Transformationen.xstop)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte.Transformationen.xstop)+' bei '+inttostr(i)+')!',3);
exit;
end;
- if liKo[length(liKo)-1].werte._tstart<>liKo[0].werte._tstart then begin
- gibAus('Anfangszeiten passen nicht zusammen ('+floattostr(liKo[0].werte._tstart)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte._tstart)+' bei '+inttostr(i)+')!',3);
+ if liKo[length(liKo)-1].werte.Transformationen.tstart<>liKo[0].werte.Transformationen.tstart then begin
+ gibAus('Anfangszeiten passen nicht zusammen ('+floattostr(liKo[0].werte.Transformationen.tstart)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte.Transformationen.tstart)+' bei '+inttostr(i)+')!',3);
exit;
end;
- if liKo[length(liKo)-1].werte._tstop<>liKo[0].werte._tstop then begin
- gibAus('Endzeiten passen nicht zusammen ('+floattostr(liKo[0].werte._tstop)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte._tstop)+' bei '+inttostr(i)+')!',3);
+ if liKo[length(liKo)-1].werte.Transformationen.tstop<>liKo[0].werte.Transformationen.tstop then begin
+ gibAus('Endzeiten passen nicht zusammen ('+floattostr(liKo[0].werte.Transformationen.tstop)+' bisher vs. '+floattostr(liKo[length(liKo)-1].werte.Transformationen.tstop)+' bei '+inttostr(i)+')!',3);
exit;
end;
until false;
@@ -1469,13 +1527,7 @@ begin
end;
_xsteps:=xmax-xmin+1;
_tsiz:=tmax-tmin+1;
- _xstart:=liKo[0].werte._xstart + xmin/(liKo[0].werte._xsteps-1)*(liKo[0].werte._xstop-liKo[0].werte._xstart);
- _xstop:=liKo[0].werte._xstart + xmax/(liKo[0].werte._xsteps-1)*(liKo[0].werte._xstop-liKo[0].werte._xstart);
- _tstart:=liKo[0].werte._tstart + tmin/(liKo[0].werte._tsiz-1)*(liKo[0].werte._tstop-liKo[0].werte._tstart);
- _tstop:=liKo[0].werte._tstart + tmax/(liKo[0].werte._tsiz-1)*(liKo[0].werte._tstop-liKo[0].werte._tstart);
- Achsenskala.kopiereVon(liKo[0].werte.Achsenskala);
- Achsenskala.addAusschnitt(liKo[0].werte._xsteps,liKo[0].werte._tsiz,xmin,xmax,tmin,tmax);
- Werteskala.append(liKo[0].werte.Werteskala);
+ Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
_np:=liKo[0].werte._np;
_beta:=liKo[0].werte._beta;
if st then begin
@@ -1510,16 +1562,13 @@ begin
result:=false;
warteaufBeendigungDesLeseThreads;
Zeit:=now;
+ Transformationen.kopiereVon(wertes^[dividend].Transformationen);
_xsteps:=wertes^[dividend]._xsteps;
xmin:=0;
xmax:=_xsteps-1;
- _xstart:=wertes^[dividend]._xstart;
- _xstop:=wertes^[dividend]._xstop;
_tsiz:=wertes^[dividend]._tsiz;
tmin:=0;
tmax:=_tsiz-1;
- _tstart:=wertes^[dividend]._tstart;
- _tstop:=wertes^[dividend]._tstop;
_np:=wertes^[dividend]._np;
_beta:=wertes^[dividend]._beta;
epsilon:=1e-9;
@@ -1535,23 +1584,23 @@ begin
continue;
end;
if startetMit('xmin:',s) then begin
- xmin:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmin:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmax:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmin:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmax:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('epsilon:',s) then begin
- epsilon:=strtoint(s);
+ epsilon:=exprtofloat(st,s);
continue;
end;
gibAus('Verstehe Option '''+s+''' nicht bei Teile!',3);
@@ -1560,24 +1609,17 @@ begin
_xsteps:=xmax-xmin+1;
_tsiz:=tmax-tmin+1;
- if // (wertes[dividend]^.genauigkeit<>wertes[divisor]^.genauigkeit) or
- (wertes^[dividend]._xstart<>wertes^[divisor]._xstart) or
- (wertes^[dividend]._xstop<>wertes^[divisor]._xstop) or
- (wertes^[dividend]._tstart<>wertes^[divisor]._tstart) or
- (wertes^[dividend]._tstop<>wertes^[divisor]._tstop) or
+ if (wertes^[dividend].Transformationen.xstart<>wertes^[divisor].Transformationen.xstart) or
+ (wertes^[dividend].Transformationen.xstop<>wertes^[divisor].Transformationen.xstop) or
+ (wertes^[dividend].Transformationen.tstart<>wertes^[divisor].Transformationen.tstart) or
+ (wertes^[dividend].Transformationen.tstop<>wertes^[divisor].Transformationen.tstop) or
(wertes^[dividend]._xsteps<>wertes^[divisor]._xsteps) or
(wertes^[dividend]._tsiz<>wertes^[divisor]._tsiz) then begin
// gibAus('Dividend und Divisor haben verschiedene Abmessungen oder verschiedene Genauigkeiten, sowas verstehe ich nicht!',3);
gibAus('Dividend und Divisor haben verschiedene Abmessungen, sowas verstehe ich nicht!',3);
exit;
end;
- Achsenskala.kopiereVon(wertes^[dividend].Achsenskala);
- Achsenskala.addAusschnitt(wertes^[dividend]._xsteps,wertes^[dividend]._tsiz,xmin,xmax,tmin,tmax);
- Werteskala.kopiereVon(wertes^[dividend].Werteskala);
- _xstart:=wertes^[dividend]._xstart + xmin/(wertes^[dividend]._xsteps-1)*(wertes^[dividend]._xstop-wertes^[dividend]._xstart);
- _xstop:=wertes^[dividend]._xstart + xmax/(wertes^[dividend]._xsteps-1)*(wertes^[dividend]._xstop-wertes^[dividend]._xstart);
- _tstart:=wertes^[dividend]._tstart + tmin/(wertes^[dividend]._tsiz-1)*(wertes^[dividend]._tstop-wertes^[dividend]._tstart);
- _tstop:=wertes^[dividend]._tstart + tmax/(wertes^[dividend]._tsiz-1)*(wertes^[dividend]._tstop-wertes^[dividend]._tstart);
+ Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
_np:=wertes^[dividend]._np;
_beta:=wertes^[dividend]._beta;
Genauigkeit:=gExtended;
@@ -1620,19 +1662,16 @@ begin
wavelet:=tWavelet.create;
wavelet.mitFFT:=false;
Zeit:=now;
+ Transformationen.kopiereVon(quelle.Transformationen);
wavelet.freq:=0;
wavelet.tfwhm:=1;
wavelet.typ:=wtSin2;
_xsteps:=quelle._xsteps;
xmin:=0;
xmax:=_xsteps-1;
- _xstart:=quelle._xstart;
- _xstop:=quelle._xstop;
_tsiz:=quelle._tsiz;
tmin:=0;
tmax:=_tsiz-1;
- _tstart:=quelle._tstart;
- _tstop:=quelle._tstop;
_np:=quelle._np;
_beta:=quelle._beta;
ausrichtung:=0;
@@ -1647,27 +1686,27 @@ begin
continue;
end;
if startetMit('xmin:',s) then begin
- xmin:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmin:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmax:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmin:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*_tsiz/(_tstop-_tstart))));
+ tmax:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('freq:',s) then begin
- wavelet.freq:=exprtofloat(st,s)/(_tsiz-1)*(_tstop-_tstart);
+ wavelet.freq:=1/kont2diskFak('t',1/exprtofloat(st,s));
continue;
end;
if startetMit('tfwhm:',s) then begin
- wavelet.tfwhm:=round(exprtofloat(st,s)*(_tsiz-1)/(_tstop-_tstart));
+ wavelet.tfwhm:=round(kont2diskFak('t',exprtofloat(st,s)));
continue;
end;
if startetMit('Wavelettyp:',s) then begin
@@ -1700,9 +1739,7 @@ begin
exit;
until false;
- Achsenskala.kopiereVon(quelle.Achsenskala);
- Achsenskala.addAusschnitt(quelle._xsteps,quelle._tsiz,xmin,xmax,tmin,tmax);
- Werteskala.kopiereVon(quelle.Werteskala);
+ Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
_xsteps:=xmax-xmin+1;
if wavelet.mitFFT then begin
i:=1;
@@ -1796,12 +1833,11 @@ begin
setlength(DTs,threads);
gibAus('Ermittle maximale und minimale Dichten ...',3);
j:=xmin;
- for i:=0 to length(DTs)-1 do
- begin
+ for i:=0 to length(DTs)-1 do begin
DTs[i]:=tDichteThread.create(j,Byte(i=length(DTs)-1)*xmax + Byte(i<length(DTs)-1)*(j+ ((xmax+1-xmin) div length(DTs))),tmin,tmax,self);
j:=Byte(i=length(DTs)-1)*xmax + Byte(i<length(DTs)-1)*(j+((xmax+1-xmin) div length(DTs)))+1;
gibAus('Dichtethread '+inttostr(i)+' gestartet!',1);
- end;
+ end;
repeat
sleep(100);
fertig:=true;
@@ -1811,12 +1847,11 @@ begin
gibAus('Alle Dichtethreads beendet!',1);
_maxW:=DTs[0].maxDichte;
_minW:=DTs[0].minDichte;
- for i:=1 to length(DTs)-1 do
- begin
+ for i:=1 to length(DTs)-1 do begin
_maxW:=max(_maxW,DTs[i].maxDichte);
_minW:=min(_minW,DTs[i].minDichte);
DTs[i].free;
- end;
+ end;
gibAus('... sie sind '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+ZeitDarstellen(now-Zeit),3);
if symmetrisch then begin
_minW:=min(_minW,-_maxW);
@@ -1918,13 +1953,15 @@ begin
end;
warteaufBeendigungDesLeseThreads;
Zeit:=now;
+ Transformationen.kopiereVon(quelle.Transformationen);
+ Transformationen.clearWerte;
Fenster.Breite:=0;
Fenster.aktiv:=false;
Fenster.Rand:=0;
Schritt:=round(sqrt(quelle._tsiz));
tmin:=0;
tmax:=quelle._tsiz-1;
- freqMax:=quelle._tsiz/(quelle._tstop-quelle._tstart);
+ freqMax:=quelle._tsiz/(quelle.Transformationen.tstop-quelle.Transformationen.tstart);
Genauigkeit:=gExtended;
repeat
if not f.gibZeile(s) then begin
@@ -1941,22 +1978,22 @@ begin
continue;
end;
if startetMit('Fenster:',s) then begin
- Fenster.Breite:=round(quelle.exprtofloat(st,erstesArgument(s,';'))*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
- Fenster.Rand:=round(quelle.exprtofloat(st,s)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ Fenster.Breite:=round(quelle.kont2diskFak('t',quelle.exprtofloat(st,erstesArgument(s,';'))));
+ Fenster.Rand:=round(quelle.kont2diskFak('t',quelle.exprtofloat(st,s)));
Fenster.aktiv:=true;
continue;
end;
if startetMit('Schritt:',s) then begin
- Schritt:=round(quelle.exprtofloat(st,s)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ Schritt:=round(quelle.kont2diskFak('t',quelle.exprtofloat(st,s)));
continue;
end;
if (quelle._xsteps=1) then begin
if startetMit('xmin:',s) then begin
- tmin:=round((quelle.exprtofloat(st,s)-quelle._xstart)*(quelle._xsteps-1)/(quelle._xstop-quelle._xstart));
+ tmin:=quelle.kont2disk('x',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- tmax:=round((quelle.exprtofloat(st,s)-quelle._xstart)*(quelle._xsteps-1)/(quelle._xstop-quelle._xstart));
+ tmax:=quelle.kont2disk('x',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('wmax:',s) or startetMit('omegamax:',s) or startetMit('ωmax:',s) then begin
@@ -1966,11 +2003,11 @@ begin
end;
if (quelle._tsiz=1) then begin
if startetMit('tmin:',s) then begin
- tmin:=round((quelle.exprtofloat(st,s)-quelle._tstart)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ tmin:=quelle.kont2disk('t',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=round((quelle.exprtofloat(st,s)-quelle._tstart)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ tmax:=quelle.kont2disk('t',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('kmax:',s) then begin
@@ -1984,27 +2021,28 @@ begin
tmin:=max(0,tmin);
tmax:=min(quelle._tsiz-1,tmax);
Schritt:=max(1,Schritt);
+
+ _tsiz:=round(power(2,ceil(ln(Fenster.Breite)/ln(2))));
+ _xsteps:=1 + ((tmax-tmin+1-(Fenster.Breite-1)) div Schritt);
+ if _xsteps<=0 then begin
+ gibAus('Das angegebene Fenster passt nicht zwischen Anfangs- und Endzeit! ('+
+ floattostrtrunc(disk2kontFak('t',Fenster.Breite),2,true)+'>='+
+ floattostrtrunc(disk2kontFak('t',tmax-tmin+1),2,true)+')',3);
+ exit;
+ end;
+ if quelle._tsiz<>1 then begin
+ Transformationen.xstart:=quelle.disk2kont('t',tmin); // quelle._tstart + tmin/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
+ Transformationen.xstop:= quelle.disk2kont('t',tmax); // quelle._tstart + tmax/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
+ Transformationen.tstart:=0;
+ Transformationen.tstop:=quelle.disk2kontFak('t',_tsiz-1); // _tsiz/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
+ end
+ else begin
+ Transformationen.xstart:=quelle.disk2kont('x',tmin); // _xstart:=quelle._xstart + tmin/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
+ Transformationen.xstop:= quelle.disk2kont('x',tmax); // _xstop:= quelle._xstart + tmax/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
+ Transformationen.tstart:=0;
+ Transformationen.tstop:=quelle.disk2kontFak('x',_tsiz-1); // _tstop:=_tsiz/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
+ end;
if not st then begin
- _tsiz:=round(power(2,ceil(ln(Fenster.Breite)/ln(2))));
- _xsteps:=1 + ((tmax-tmin+1-(Fenster.Breite-1)) div Schritt);
- if _xsteps<=0 then begin
- gibAus('Das angegebene Fenster passt nicht zwischen Anfangs- und Endzeit! ('+
- floattostrtrunc(Fenster.Breite/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart),2,true)+'>='+
- floattostrtrunc((tmax-tmin+1)/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart),2,true)+')',3);
- exit;
- end;
- if quelle._tsiz<>1 then begin
- _xstart:=quelle._tstart + tmin/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
- _xstop:= quelle._tstart + tmax/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
- _tstart:=0;
- _tstop:=_tsiz/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
- end
- else begin
- _xstart:=quelle._xstart + tmin/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
- _xstop:= quelle._xstart + tmax/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
- _tstart:=0;
- _tstop:=_tsiz/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
- end;
tOf:=(_tsiz-Fenster.Breite) div 2;
eWerte.holeRam(3);
gibAus('kopiere Inhalt ...',3);
@@ -2032,25 +2070,21 @@ begin
gibAus('Es traten Fehler auf!',3);
exit;
end;
- _tstop:=(_tsiz div 2-1)/(_tstop-_tstart)/2;
- _tstart:=0;
gibAus(' (Parseval-Fehler = '+floattostr(pvFehler)+')',3);
- if (_tstop<=freqmax) or (freqmax<=0) then
- _tsiz:=_tsiz div 2
- else begin
- freqmax:=_tstop * round((_tsiz div 2)/_tstop*freqmax) / (_tsiz div 2);
- _tsiz:=round((_tsiz div 2)/_tstop*freqmax);
- _tstop:=freqmax;
- end;
- eWerte.holeRAM(0);
end;
- Achsenskala.clear;
- Achsenskala.xsteps:=_xsteps;
- Achsenskala.tsiz:=_tsiz;
- Achsenskala.xstart:=_xstart;
- Achsenskala.xstop:=_xstop;
- Achsenskala.tstart:=_tstart;
- Achsenskala.tstop:=_tstop;
+ Transformationen.tstop:=(_tsiz div 2-1)/(Transformationen.tstop-Transformationen.tstart)/2;
+ Transformationen.tstart:=0;
+ if (Transformationen.tstop<=freqmax) or (freqmax<=0) then
+ _tsiz:=_tsiz div 2
+ else begin
+ freqmax:=Transformationen.tstop * round((_tsiz div 2)/Transformationen.tstop*freqmax) / (_tsiz div 2);
+ _tsiz:=round((_tsiz div 2)/Transformationen.tstop*freqmax);
+ Transformationen.tstop:=freqmax;
+ end; gibAus(inttostr(_xsteps)+' '+inttostr(_tsiz),3);
+ Transformationen.xsteps:=_xsteps;
+ Transformationen.tsiz:=_tsiz;
+ if not st then
+ eWerte.holeRAM(0);
gibAus('... fertig '+ZeitDarstellen(now-Zeit),3);
result:=true;
end;
@@ -2063,8 +2097,8 @@ var i,j: longint;
ZAs: tExtendedArray; // Anzahl Quellen, die auf entsprechende Zielposition abgebildet werden
Zeit,epsilon: extended;
Vorbearbeitung,
- Nachbearbeitung: tBearbeitungen;
- verzerrung: tVerzerrung;
+ Nachbearbeitung,
+ verzerrung: tTransformationen;
s: string;
verzerrThreads: array of tVerzerrThread;
fertig: boolean;
@@ -2075,16 +2109,9 @@ begin
if assigned(verzerrThreads[ii]) then
verzerrThreads[ii].free;
setlength(verzerrThreads,0);
- for ii:=0 to Vorbearbeitung.count-1 do
- if assigned(Vorbearbeitung[ii]) then
- Vorbearbeitung[ii].free;
Vorbearbeitung.free;
- for ii:=0 to Nachbearbeitung.count-1 do
- if assigned(Nachbearbeitung[ii]) then
- Nachbearbeitung[ii].free;
Nachbearbeitung.free;
- if assigned(verzerrung) then
- verzerrung.free;
+ verzerrung.free;
setlength(ZPs,0);
setlength(ZGs,0);
setlength(ZAs,0);
@@ -2094,11 +2121,13 @@ begin
warteaufBeendigungDesLeseThreads;
gibAus('Verzerrung berechnen ... ',3);
Zeit:=now;
- verzerrung:=tVerzerrung.create;
+ verzerrung:=tTransformationen.create;
+ verzerrung.xsteps:=quelle._xsteps;
+ verzerrung.tsiz:=quelle._tsiz;
epsilon:=1e-9;
Genauigkeit:=gExtended;
- Vorbearbeitung:=tBearbeitungen.create;
- Nachbearbeitung:=tBearbeitungen.create;
+ Vorbearbeitung:=tTransformationen.create;
+ Nachbearbeitung:=tTransformationen.create;
repeat
if not f.gibZeile(s) then begin
gibAus('Unerwartetes Dateiende!',3);
@@ -2120,7 +2149,7 @@ begin
continue;
end;
if startetMit('Abbildung:',s) then begin
- if not verzerrung.initAbbildung(st,s,quelle.xscale,quelle.tscale,@(exprtofloat)) then begin
+ if not verzerrung.add(st,s,quelle.xscale,quelle.tscale,@(exprtofloat)) then begin
gibAus('Syntaxfehler in der Funktion '''+s+'''!',3);
aufraeumen;
exit;
@@ -2129,21 +2158,21 @@ begin
gibAus(verzerrung.dumpParams,3);
for i:=0 to 1 do
for j:=0 to 1 do
- gibAus(inttostr(i*(quelle._xsteps-1))+';'+inttostr(j*(quelle._tsiz-1))+' -> '+floattostr(verzerrung.ziel(i*(quelle._xsteps-1),j*(quelle._tsiz-1)).x)+';'+floattostr(verzerrung.ziel(i*(quelle._xsteps-1),j*(quelle._tsiz-1)).y),3);
+ gibAus(
+ inttostr(i*(quelle._xsteps-1))+';'+inttostr(j*(quelle._tsiz-1))+' -> '+
+ tExtPointToStr(verzerrung.transformiereKoordinaten(i*(quelle._xsteps-1),j*(quelle._tsiz-1))),3);
end;
continue;
end;
if startetMit('Nachbearbeitung:',s) then begin
- Nachbearbeitung.addNew;
- if not Nachbearbeitung.last.init(st,s,f,@exprtofloat) then begin
+ if not Nachbearbeitung.add(st,s,f,@exprtofloat) then begin
aufraeumen;
exit;
end;
continue;
end;
if startetMit('Vorbearbeitung:',s) then begin
- Vorbearbeitung.addNew;
- if not Vorbearbeitung.last.init(st,s,f,@exprtofloat) then begin
+ if not Vorbearbeitung.add(st,s,f,@exprtofloat) then begin
aufraeumen;
exit;
end;
@@ -2153,23 +2182,20 @@ begin
aufraeumen;
exit;
until false;
- Achsenskala.add(Verzerrung);
- Werteskala.append(Vorbearbeitung);
- Werteskala.append(Nachbearbeitung);
+ Transformationen.kopiereVon(quelle.Transformationen);
+ Transformationen.append(Vorbearbeitung);
+ Transformationen.append(Verzerrung);
+ Transformationen.append(Nachbearbeitung);
if not st then begin
gibAus('... Zielausdehnung berechnen ... ',3);
- verzerrung.berechneZielausdehnung(quelle._xsteps,quelle._tsiz,grenzen);
+ verzerrung.berechneZielausdehnung(grenzen);
_xsteps:=grenzen['x','y']-grenzen['x','x']+2;
_tsiz:=grenzen['y','y']-grenzen['y','x']+2;
- if (_xsteps<=0) or (_tsiz<=0) then begin
+ if (_xsteps<=1) or (_tsiz<=1) then begin
gibAus('Es passt kein Rechteck des Ziels vollständig in die Quelldaten!',3);
aufraeumen;
exit;
end;
- _xstart:=quelle._xstart; // eher unzuverlässig, was sollte man auch jetzt von diesen Werten erwarten?
- _xstop:= quelle._xstop;
- _tstart:=quelle._tstart;
- _tstop:= quelle._tstop;
eWerte.holeRam(3);
gibAus('Positionen und Gewichte initialisieren ...',3);
setlength(ZPs,quelle._xsteps*quelle._tsiz);
@@ -2224,19 +2250,19 @@ begin
continue;
end;
if startetMit('xmin:',s) then begin
- xmin:=round((quelle.exprtofloat(st,s)-quelle._xstart)*(quelle._xsteps-1)/(quelle._xstop-quelle._xstart));
+ xmin:=quelle.kont2disk('x',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=round((quelle.exprtofloat(st,s)-quelle._xstart)*(quelle._xsteps-1)/(quelle._xstop-quelle._xstart));
+ xmax:=quelle.kont2disk('x',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=round((quelle.exprtofloat(st,s)-quelle._tstart)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ tmin:=quelle.kont2disk('t',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=round((quelle.exprtofloat(st,s)-quelle._tstart)*(quelle._tsiz-1)/(quelle._tstop-quelle._tstart));
+ tmax:=quelle.kont2disk('t',quelle.exprtofloat(st,s));
continue;
end;
if startetMit('Richtung:',s) then begin
@@ -2262,16 +2288,11 @@ begin
tmax:=min(quelle._tsiz-1,tmax);
xmin:=max(0,xmin);
xmax:=min(quelle._xsteps-1,xmax);
- Achsenskala.kopiereVon(quelle.Achsenskala);
- Achsenskala.addAusschnitt(quelle._xsteps,quelle._tsiz,xmin,xmax,tmin,tmax);
- Werteskala.kopiereVon(quelle.Werteskala);
+ Transformationen.kopiereVon(quelle.Transformationen);
+ Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
if not st then begin
_tsiz:=tmax-tmin+1;
_xsteps:=xmax-xmin+1;
- _xstart:=quelle._xstart + xmin/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
- _xstop:= quelle._xstart + xmax/(quelle._xsteps-1)*(quelle._xstop-quelle._xstart);
- _tstart:=quelle._tstart + tmin/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
- _tstop:= quelle._tstart + tmax/(quelle._tsiz-1)*(quelle._tstop-quelle._tstart);
eWerte.holeRam(3);
gibAus('Berechne Integrale ...',3);
@@ -2334,9 +2355,9 @@ begin
end;
if startetMit('Fenster:',s) then begin
if senkrecht then
- Fenster.Rand:=round(exprtofloat(st,s)*(_tsiz-1)/(_tstop-_tstart))
+ Fenster.Rand:=round(kont2diskFak('t',exprtofloat(st,s)))
else
- Fenster.Rand:=round(exprtofloat(st,s)*(_xsteps-1)/(_xstop-_xstart));
+ Fenster.Rand:=round(kont2diskFak('x',exprtofloat(st,s)));
Fenster.aktiv:=true;
continue;
end;
@@ -2363,25 +2384,32 @@ begin
end;
gibAus(' (Parseval-Fehler = '+floattostr(pvFehler)+')',3);
end;
- i:=1;
- while 2*i<=_tsiz do
- i:=i*2;
- _tstop:=_tstart+(_tstop-_tstart)*(i-1)/(_tsiz-1);
- _tsiz:=i;
+ if senkrecht then begin
+ i:=1;
+ while 2*i<=_tsiz do
+ i:=i*2;
+ Transformationen.addAusschnitt(0,_xsteps-1,(_tsiz-i) div 2,((_tsiz+i) div 2) - 1);
+ if not st then begin
+ gibAus('Die Länge wird von '+inttostr(_tsiz)+' auf '+inttostr(i)+' Zeitschritte gekürzt!',3);
+ _tsiz:=i;
+ end;
+ end
+ else begin
+ i:=1;
+ while 2*i<=_xsteps do
+ i:=i*2;
+ Transformationen.addAusschnitt((_xsteps-i) div 2,((_xsteps+i) div 2) - 1,0,_tsiz-1);
+ if not st then begin
+ gibAus('Die Länge wird von '+inttostr(_xsteps)+' auf '+inttostr(i)+' Ortsschritte gekürzt!',3);
+ _xsteps:=i;
+ end;
+ end;
+ Transformationen.addFFT(not senkrecht,senkrecht);
if not st then begin
- gibAus('Die Länge wird von '+inttostr(_tsiz)+' auf '+inttostr(i)+' Zeitschritte gekürzt!',3);
eWerte.holeRam(0);
gibAus('... fertig! '+ZeitDarstellen(now-Zeit),3);
end;
- _tstop:=(_tsiz-1)/(_tstop-_tstart);
- _tstart:=0;
- Achsenskala.clear;
- Achsenskala.xsteps:=_xsteps;
- Achsenskala.tsiz:=_tsiz;
- Achsenskala.xstart:=_xstart;
- Achsenskala.xstop:=_xstop;
- Achsenskala.tstart:=_tstart;
- Achsenskala.tstop:=_tstop;
+ _tsiz:=i;
result:=true;
end;
@@ -2420,8 +2448,8 @@ begin
b:=s[1]='t';
delete(s,1,pos(':',s));
s:=trim(s);
- if b then Fensters[b].Rand:=round(exprtofloat(st,s)*(_tsiz-1)/(_tstop-_tstart))
- else Fensters[b].Rand:=round(exprtofloat(st,s)*(_xsteps-1)/(_xstop-_xstart));
+ if b then Fensters[b].Rand:=round(kont2diskFak('t',exprtofloat(st,s)))
+ else Fensters[b].Rand:=round(kont2diskFak('x',exprtofloat(st,s)));
Fensters[b].aktiv:=true;
continue;
end;
@@ -2447,7 +2475,7 @@ begin
i:=i*2;
if _tsiz>i then begin
gibAus('Die Länge wird von '+inttostr(_tsiz)+' auf '+inttostr(i)+' Zeitschritte gekürzt!',3);
- _tstop:=_tstart+(_tstop-_tstart)*(i-1)/(_tsiz-1);
+ Transformationen.addAusschnitt(0,_xsteps-1,(_tsiz-i) div 2,((_tsiz+i) div 2) - 1);
_tsiz:=i;
eWerte.holeRam(0);
end;
@@ -2456,12 +2484,13 @@ begin
i:=i*2;
if _xsteps>i then begin
gibAus('Die Breite wird von '+inttostr(_xsteps)+' auf '+inttostr(i)+' Ortsschritte gekürzt!',3);
- _xstop:=_xstart+(_xstop-_xstart)*(i-1)/(_xsteps-1);
+ Transformationen.addAusschnitt((_xsteps-i) div 2,((_xsteps+i) div 2) - 1,0,_tsiz-1);
for k:=1 to _tsiz-1 do
Move(eWerte.werte[k*_xsteps],eWerte.werte[k*i],i*sizeof(extended));
_xsteps:=i;
eWerte.holeRam(0);
end;
+ Transformationen.addFFT(true,true);
gibAus('... fertig! '+ZeitDarstellen(now-Zeit),3);
if spiegeln then begin
gibAus('Werte spiegeln ...',3);
@@ -2474,8 +2503,6 @@ begin
exit;
end;
gibAus(' (Parseval-Fehler = '+floattostr(pvFehler)+')',3);
- _tstop:=(_tsiz-1)/(_tstop-_tstart);
- _tstart:=0;
gibAus('... fertig! '+ZeitDarstellen(now-Zeit),3);
gibAus('berechne x-FFT ...',3);
if not fft(threads,0,_xsteps-1,0,_tsiz-1,false,false,doRes,preOrd,Fensters[false],pvFehler,Warn) then begin
@@ -2483,8 +2510,6 @@ begin
exit;
end;
gibAus(' (Parseval-Fehler = '+floattostr(pvFehler)+')',3);
- _xstop:=(_xsteps-1)/(_xstop-_xstart);
- _xstart:=0;
gibAus('... fertig! '+ZeitDarstellen(now-Zeit),3);
gibAus('Wertenachbearbeiten ...',3);
case genauigkeit of
@@ -2495,13 +2520,6 @@ begin
doBetr,doBetrQdr:
fft2dNachbearbeitung(threads,nb); // die Hauptarbeit
end{of case};
- Achsenskala.clear;
- Achsenskala.xsteps:=_xsteps;
- Achsenskala.tsiz:=_tsiz;
- Achsenskala.xstart:=_xstart;
- Achsenskala.xstop:=_xstop;
- Achsenskala.tstart:=_tstart;
- Achsenskala.tstop:=_tstop;
gibAus('... fertig! '+ZeitDarstellen(now-Zeit),3);
result:=true;
end;
@@ -2513,7 +2531,7 @@ var s,datei: string;
xmin,xmax,tmin,tmax,xp,tp: longint;
breite,hoehe,lof,rof,oof,uof: longint;
Palette: pTPalette;
- Nachbearbeitung: tBearbeitungen;
+ Nachbearbeitung: tTransformationen;
BilderThreads: array of TBilderthread;
fertig,Rahmen: boolean;
img: file;
@@ -2556,7 +2574,7 @@ begin
tmin:=0;
tmax:=_tsiz-1;
schriftgroesze:=24;
- Nachbearbeitung:=tBearbeitungen.create;
+ Nachbearbeitung:=tTransformationen.create;
findePalette(Palette,'Graustufen');
setlength(Achsen,0);
setlength(verwKonturen,0);
@@ -2589,19 +2607,19 @@ begin
end;
if self.dichtenParameterErkannt(st,s,maxThreads,xmin,xmax,tmin,tmax) then continue;
if startetMit('xmin:',s) then begin
- xmin:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmin:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=min(_xsteps-1,max(0,round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart))));
+ xmax:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*(_tsiz-1)/(_tstop-_tstart))));
+ tmin:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=min(_tsiz-1,max(0,round((exprtofloat(st,s)-_tstart)*(_tsiz-1)/(_tstop-_tstart))));
+ tmax:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('Palette:',s) then begin
@@ -2621,8 +2639,7 @@ begin
continue;
end;
if startetMit('Nachbearbeitung:',s) then begin
- Nachbearbeitung.addNew;
- if not Nachbearbeitung.last.init(st,s,f,@exprtofloat) then begin
+ if not Nachbearbeitung.add(st,s,f,@exprtofloat) then begin
aufraeumen;
exit;
end;
@@ -2692,7 +2709,7 @@ begin
tmin:=max(tmin,0);
tmax:=min(tmax,_tsiz-1);
gibAus('('+inttostr(xmin)+'-'+inttostr(xmax)+'x'+inttostr(tmin)+'-'+inttostr(tmax)+')',3);
- gibAus(' ('+floattostr(_xstart)+'-'+floattostr(_xstop)+' x '+floattostr(_tstart)+'-'+floattostr(_tstop)+')',3);
+ gibAus(' ('+floattostr(Transformationen.xstart)+'-'+floattostr(Transformationen.xstop)+' x '+floattostr(Transformationen.tstart)+'-'+floattostr(Transformationen.tstop)+')',3);
breite:=round((xmax-xmin)*xzoom)+1;
hoehe:=round((tmax-tmin)*yzoom)+1;
@@ -2723,12 +2740,12 @@ begin
wert:=ceil(miw/schritt)*schritt;
while wert<=maw do *)
if Achsen[i].Lage in [lOben,lUnten] then begin
- maw:=xMax/(Achsenskala.xsteps-1)*(Achsenskala.xstop-Achsenskala.xstart)+Achsenskala.xstart;
- miw:=xMin/(Achsenskala.xsteps-1)*(Achsenskala.xstop-Achsenskala.xstart)+Achsenskala.xstart;
+ maw:=disk2kont('x',xMax);
+ miw:=disk2Kont('x',xMin);
end
else begin
- maw:=tMax/(Achsenskala.tsiz-1)*(Achsenskala.tstop-Achsenskala.tstart)+Achsenskala.tstart;
- miw:=tMin/(Achsenskala.tsiz-1)*(Achsenskala.tstop-Achsenskala.tstart)+Achsenskala.tstart;
+ maw:=disk2kont('t',tMax);
+ miw:=disk2kont('t',tMin);
end;
schritt:=(maw-miw)/Achsen[i].Striche;
j:=round(ln(schritt)/ln(10));
@@ -2744,7 +2761,10 @@ begin
fontRend:=fontRenderer;
lage:=Achsen[i].lage;
// position:=(wert-miw)/(maw-miw);
- position:=Achsenskala.gibPosition(Achsen[i].Lage,wert);
+ gibAus(' -> -> '+inttostr(Transformationen.count),3);
+ for j:=0 to Transformationen.count-1 do
+ gibAus(' '+inttostr(j)+' '+Transformationen.Inhalt[j].dumpParams,3);
+ position:=Transformationen.transformiereKoordinaten(Achsen[i].Lage,wert);
if (position<0) or (position>1) then begin
beschriftungen[length(beschriftungen)-1].free;
setlength(beschriftungen,length(beschriftungen)-1);
@@ -2790,8 +2810,8 @@ begin
gibAus('Alle Threads beendet, Konturen einfügen ...',1);
for i:=0 to length(verwKonturen)-1 do
for j:=0 to length(konturen^[verwKonturen[i]].orte)-1 do begin
- xp:=round((_xsteps-1)*(konturen^[verwKonturen[i]].orte[j].x-_xstart)/(_xstop-_xstart));
- tp:=round((_tsiz-1) * (konturen^[verwKonturen[i]].orte[j].y-_tstart)/(_tstop-_tstart));
+ xp:=kont2disk('x',konturen^[verwKonturen[i]].orte[j].x);
+ tp:=kont2disk('t',konturen^[verwKonturen[i]].orte[j].y);
if (xmin<=xp) and (xp<=xmax) and (tmin<=tp) and (tp<=tmax) then begin
k:=0;
@@ -2850,19 +2870,19 @@ begin
continue;
end;
if startetMit('xmin:',s) then begin
- xmin:=round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart));
+ xmin:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('xmax:',s) then begin
- xmax:=round((exprtofloat(st,s)-_xstart)*(_xsteps-1)/(_xstop-_xstart));
+ xmax:=kont2disk('x',exprtofloat(st,s));
continue;
end;
if startetMit('tmin:',s) then begin
- tmin:=round((exprtofloat(st,s)-_tstart)*(_tsiz-1)/(_tstop-_tstart));
+ tmin:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if startetMit('tmax:',s) then begin
- tmax:=round((exprtofloat(st,s)-_tstart)*(_tsiz-1)/(_tstop-_tstart));
+ tmax:=kont2disk('t',exprtofloat(st,s));
continue;
end;
if (s='Koordinaten einfügen') and ((_xsteps=1) or (_tsiz=1)) then begin
@@ -2917,26 +2937,26 @@ begin
case Genauigkeit of
gSingle:
for i:=max(0,xmin) to min(_xsteps-1,xmax) do
- writeln(outf,floattostr(i*(_xstop-_xstart)/_xsteps+_xstart)+separator+floattostr(sWerte.werte[i]));
+ writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(sWerte.werte[i]));
gExtended:
for i:=max(0,xmin) to min(_xsteps-1,xmax) do
- writeln(outf,floattostr(i*(_xstop-_xstart)/_xsteps+_xstart)+separator+floattostr(eWerte.werte[i]));
+ writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(eWerte.werte[i]));
end{of Case};
2:
case Genauigkeit of
gSingle:
for i:=max(0,tmin) to min(_tsiz-1,tmax) do
- writeln(outf,floattostr(i*(_tstop-_tstart)/_tsiz+_tstart)+separator+floattostr(sWerte.werte[i]));
+ writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(sWerte.werte[i]));
gExtended:
for i:=max(0,tmin) to min(_tsiz-1,tmax) do
- writeln(outf,floattostr(i*(_tstop-_tstart)/_tsiz+_tstart)+separator+floattostr(eWerte.werte[i]));
+ writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(eWerte.werte[i]));
end{of Case};
3:
case Genauigkeit of
gSingle:
- writeln(outf,floattostr(_xstart)+separator+floattostr(_tstart)+separator+floattostr(sWerte.werte[0]));
+ writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(sWerte.werte[0]));
gExtended:
- writeln(outf,floattostr(_xstart)+separator+floattostr(_tstart)+separator+floattostr(sWerte.werte[0]));
+ writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(eWerte.werte[0]));
end{of Case};
end{of Case};
close(outf);
@@ -2957,7 +2977,7 @@ begin
Zeit:=now;
if not st then begin
gibAus('erzeuge Lineout ...',3);
- gibAus('insgesamt: '+floattostr(_xstart)+'-'+floattostr(_xstop)+'x'+floattostr(_tstart)+'-'+floattostr(_tstop),3);
+ gibAus('insgesamt: '+floattostr(Transformationen.xstart)+'-'+floattostr(Transformationen.xstop)+'x'+floattostr(Transformationen.tstart)+'-'+floattostr(Transformationen.tstop),3);
end;
for b1:=false to true do
@@ -2968,9 +2988,9 @@ begin
for b1:=false to true do
if startetMit('(',params) then begin
s:=erstesArgument(params,',');
- ab[b1,false]:=max(0,min(_xsteps-1,round((exprtofloat(st,s)-_xstart)/(_xstop-_xstart)*(_xsteps-1))));
+ ab[b1,false]:=kont2disk('x',exprtofloat(st,s));
s:=erstesArgument(params,')');
- ab[b1,true]:=max(0,min(_tsiz-1,round((exprtofloat(st,s)-_tstart)/(_tstop-_tstart)*(_tsiz-1))));
+ ab[b1,true]:=kont2disk('t',exprtofloat(st,s));
end
else begin
ab[true,false]:=ab[b1,false];
@@ -3034,7 +3054,6 @@ procedure tWerte.spiegle(threads,tmin,tmax: longint);
var i: longint;
sts: array of tSpiegelthread;
fertig: boolean;
- tmp: extended;
begin
warteaufBeendigungDesLeseThreads;
setlength(sts,threads);
@@ -3051,9 +3070,7 @@ begin
until fertig;
for i:=0 to length(sts)-1 do
sts[i].free;
- tmp:=Achsenskala.xstart;
- Achsenskala.xstart:=Achsenskala.xstop;
- Achsenskala.xstop:=tmp;
+ Transformationen.AddSpiegelung;
gibAus('Alle Spiegelthreads fertig!',1);
end;
@@ -3113,14 +3130,14 @@ begin
gibAus('Finde Werte nicht!',3);
exit;
end;
- if s='xmin' then result:=wertes^[i]._xstart
- else if s='xmax' then result:=wertes^[i]._xstop
- else if s='tmin' then result:=wertes^[i]._tstart
- else if s='tmax' then result:=wertes^[i]._xstop
+ if s='xmin' then result:=wertes^[i].Transformationen.xstart
+ else if s='xmax' then result:=wertes^[i].Transformationen.xstop
+ else if s='tmin' then result:=wertes^[i].Transformationen.tstart
+ else if s='tmax' then result:=wertes^[i].Transformationen.xstop
else if (s='wmin') or (s='minw') then result:=wertes^[i]._minw
else if (s='wmax') or (s='maxw') then result:=wertes^[i]._maxw
- else if s='Breite' then result:=wertes^[i]._xstart-wertes^[i]._xstop
- else if s='Hoehe' then result:=wertes^[i]._tstart-wertes^[i]._tstop
+ else if s='Breite' then result:=wertes^[i].Transformationen.xstart-wertes^[i].Transformationen.xstop
+ else if s='Hoehe' then result:=wertes^[i].Transformationen.tstart-wertes^[i].Transformationen.tstop
else gibAus('Kenne Bezeichner '''+s+''' nicht als Eigenschaft von Werten!',3);
exit;
end;
@@ -3156,24 +3173,33 @@ end;
constructor tLogThread.create;
begin
inherited create(true);
+ raisedException:=nil;
freeonterminate:=false;
fertig:=false;
end;
destructor tLogThread.destroy;
begin
+ raisedException.free;
if not behalteLogs then cleanupLog(ThreadID);
inherited destroy;
end;
+function tLogThread.rFertig: boolean;
+begin
+ if assigned(raisedException) then
+ raise exception.Create('Fehler innerhalb eines Threads!');
+ result:=_fertig;
+end;
+
procedure tLogThread.execute;
begin
try
stExecute;
except
- on E: Exception do begin
- DumpExceptionCallStack(E);
- halt(1);
+ on E: exception do begin
+ dumpExceptionCallStack(E);
+ raisedException:=E;
end;
end;
fertig:=true;
@@ -3196,6 +3222,11 @@ begin
suspended:=false;
end;
+destructor tLiKoThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tLiKoThread.stExecute;
var i,j,k: longint;
out0,in0: boolean;
@@ -3262,6 +3293,11 @@ begin
suspended:=false;
end;
+destructor tQuotientThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tQuotientThread.stExecute;
var i,j: longint;
i0,o0: boolean;
@@ -3345,7 +3381,7 @@ end;
// tBilderthread ***************************************************************
-constructor tBilderthread.create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const we: tWerte; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitung: tBearbeitungen; palette: pTPalette; beschri: pTBeschriftungen; rm: boolean);
+constructor tBilderthread.create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const we: tWerte; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitung: tTransformationen; palette: pTPalette; beschri: pTBeschriftungen; rm: boolean);
begin
inherited create;
beschr:=beschri;
@@ -3385,6 +3421,14 @@ begin
gibAus('Thread '+inttostr(nummer)+' hat jetzt seinen Speicher.',1);
end;
+destructor tBilderthread.destroy;
+begin
+ setlength(farben,0);
+ setlength(werte,0);
+ setlength(anzahlen,0);
+ inherited destroy;
+end;
+
procedure tBilderthread.stExecute;
var i,j,k: longint;
wert: extended;
@@ -3407,8 +3451,7 @@ begin
if (j>=0) and (j<whoehe) and (i>=0) and (i<gesBreite) then begin // innerer Pixel
wert:=(werte[i-max(0,xpmi)+j*wbreite]/anzahlen[i-max(0,xpmi)+j*wbreite]-w._minW)/(w._maxW-w._minW);
wert:=max(0,min(wert,1));
- for k:=0 to nb.count-1 do
- nb[k].anwenden(wert);
+ wert:=nb.transformiereWert(wert);
farben[i-xpmi+(j+oof)*breite]:=wertZuFarbe(wert,pal); // farben startet bei Index 0 + 0*breite
end
else begin
@@ -3479,14 +3522,6 @@ begin
fertig:=true;
end;
-destructor tBilderthread.destroy;
-begin
- setlength(farben,0);
- setlength(werte,0);
- setlength(anzahlen,0);
- inherited destroy;
-end;
-
// tDichteThread ***************************************************************
constructor tDichteThread.create(xmi,xma,tmi,tma: longint; const werte: tWerte);
@@ -3502,6 +3537,11 @@ begin
suspended:=false;
end;
+destructor tDichteThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tDichteThread.stExecute;
begin
gibAus('Dichtethread gestartet!',1);
@@ -3533,6 +3573,11 @@ begin
suspended:=false;
end;
+destructor tFFTThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tFFTThread.stExecute;
begin
gibAus('FFTthread gestartet: '+inttostr(xMi)+'-'+inttostr(xMa)+' '+inttostr(tMi)+'-'+inttostr(tMa)+' ...',1);
@@ -3556,6 +3601,11 @@ begin
suspended:=false;
end;
+destructor tSpiegelThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tSpiegelThread.stExecute;
begin
gibAus('Spiegelthread gestartet: '+inttostr(tMin)+'-'+inttostr(tMax)+' ...',1);
@@ -3580,6 +3630,11 @@ begin
suspended:=false;
end;
+destructor tFFT2dNBThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tFFT2dNBThread.stExecute;
begin
gibAus('FFT2d-Nachbearbeitungsthread gestartet: '+inttostr(xMin)+'-'+inttostr(xMax)+' ...',1);
@@ -3609,6 +3664,11 @@ begin
suspended:=false;
end;
+destructor tKorrelThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tKorrelThread.stExecute;
var i,j,k,hl: longint;
sus,suc,tmp,pvF: extended;
@@ -3949,13 +4009,13 @@ begin
if i<0 then exit;
Schwelle:=w^[i].exprtofloat(false,s);
if _xmin='' then xmi:=1
- else xmi:=max(1,min(w^[i]._xsteps-1,round((w^[i].exprtofloat(st,_xmin)-w^[i]._xstart)*(w^[i]._xsteps-1)/(w^[i]._xstop-w^[i]._xstart))));
+ else xmi:=max(1,w^[i].kont2disk('x',w^[i].exprtofloat(st,_xmin)));
if _xmax='' then xma:=w^[i]._xsteps-1
- else xma:=max(1,min(w^[i]._xsteps-1,round((w^[i].exprtofloat(st,_xmax)-w^[i]._xstart)*(w^[i]._xsteps-1)/(w^[i]._xstop-w^[i]._xstart))));
+ else xma:=max(1,w^[i].kont2disk('x',w^[i].exprtofloat(st,_xmax)));
if _tmin='' then tmi:=1
- else tmi:=max(1,min(w^[i]._tsiz-1,round((w^[i].exprtofloat(st,_tmin)-w^[i]._tstart)*(w^[i]._tsiz-1)/(w^[i]._tstop-w^[i]._tstart))));
+ else tmi:=max(1,w^[i].kont2disk('t',w^[i].exprtofloat(st,_tmin)));
if _tmax='' then tma:=w^[i]._tsiz-1
- else tma:=max(1,min(w^[i]._tsiz-1,round((w^[i].exprtofloat(st,_tmax)-w^[i]._tstart)*(w^[i]._tsiz-1)/(w^[i]._tstop-w^[i]._tstart))));
+ else tma:=max(1,w^[i].kont2disk('x',w^[i].exprtofloat(st,_tmax)));
if st then begin
result:=true;
exit;
@@ -4101,6 +4161,11 @@ begin
suspended:=false;
end;
+destructor tIntegralThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tIntegralThread.stExecute;
begin
gibAus('Integralthread gestartet ('+inttostr(xmi)+'-'+inttostr(xma)+'x'+inttostr(tmi)+'-'+inttostr(tma)+') '+
@@ -4142,6 +4207,11 @@ begin
suspended:=false;
end;
+destructor tSortiereNachYThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tSortiereNachYThread.stExecute;
begin
gibAus('Sortierthread gestartet ('+inttostr(vo)+'-'+inttostr(bi)+') -> x'+inttostr(mt)+' ...',1);
@@ -4280,7 +4350,7 @@ end;
// tVerzerrInitThread **********************************************************
-constructor tVerzerrInitThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tVerzerrung; zielpositionen: tPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
+constructor tVerzerrInitThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformationen; zielpositionen: tPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
begin
inherited create;
qu:=quelle;
@@ -4302,6 +4372,12 @@ begin
suspended:=false;
end;
+destructor tVerzerrInitThread.destroy;
+begin
+ setlength(ZAs,0);
+ inherited destroy;
+end;
+
procedure tVerzerrInitThread.stExecute;
begin
gibAus('VerzerrInitThread gestartet ('+inttostr(xMi)+'-'+inttostr(xMa)+'/'+inttostr(tMi)+'-'+inttostr(tMa)+')',1);
@@ -4310,15 +4386,9 @@ begin
fertig:=true;
end;
-destructor tVerzerrInitThread.destroy;
-begin
- setlength(ZAs,0);
- inherited destroy;
-end;
-
// tVerzerrThread **************************************************************
-constructor tVerzerrThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tBearbeitungen);
+constructor tVerzerrThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformationen);
begin
inherited create;
qu:=quelle;
@@ -4336,6 +4406,11 @@ begin
suspended:=false;
end;
+destructor tVerzerrThread.destroy;
+begin
+ inherited destroy;
+end;
+
procedure tVerzerrThread.stExecute;
var sw: pTLLWerteSingle;
ew: pTLLWerteDouble;
@@ -4388,7 +4463,7 @@ begin
result:=false;
end;
-function erzeugeLegende(st: boolean; var f: tInputfile; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tBearbeitungen; pal: pTPalette): boolean;
+function erzeugeLegende(st: boolean; var f: tInputfile; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformationen; pal: pTPalette): boolean;
var s: string;
breite,hoehe,i,j,k,lo,ro,oo,uo,
schriftgroesze: longint;
@@ -4485,9 +4560,9 @@ begin
beschriftungsschritte[0].bis:=maxDichte*minDichte;
delete(s,1,pos(' ',s));
for i:=0 to nb.count-1 do
- if nb[i].typ=btLog then begin
- if nb[i].parameter[0]<>minDichte then begin
- gibAus('Die minimale Dichte der logarithmischen Farbskala ('+myfloattostr(minDichte)+') und der logarithmischen Nachbearbeitung ('+myfloattostr(nb[i].parameter[0])+') stimmen nicht überein!',3);
+ if nb[i] is tWerteLogTransformation then begin
+ if (nb[i] as tWerteLogTransformation).logMin<>minDichte then begin
+ gibAus('Die minimale Dichte der logarithmischen Farbskala ('+myfloattostr(minDichte)+') und der logarithmischen Nachbearbeitung ('+myfloattostr((nb[i] as tWerteLogTransformation).logMin)+') stimmen nicht überein!',3);
exit;
end;
minDichte:=minDichte*maxDichte;
@@ -4556,12 +4631,8 @@ begin
end;
if lineareFarbe then
- for i:=0 to length(beschriftungen)-1 do begin
- wert:=beschriftungen[i].position;
- for j:=0 to nb.count-1 do
- nb[j].anwenden(wert);
- beschriftungen[i].position:=wert;
- end;
+ for i:=0 to length(beschriftungen)-1 do
+ beschriftungen[i].position:=nb.transformiereWert(beschriftungen[i].position);
for i:=0 to length(beschriftungen)-1 do
beschriftungen[i].position:=beschriftungen[i].position*(hoehe+byte(waagerecht)*(breite-hoehe));
@@ -4582,8 +4653,7 @@ begin
for i:=0 to length(farben)-1 do begin
wert:=i/length(farben);
if not lineareFarbe then
- for j:=0 to nb.count-1 do
- nb[j].anwenden(wert);
+ wert:=nb.transformiereWert(wert);
farben[i]:=wertZuFarbe(wert,pal^.farben);
end;
assign(img,datei);