summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-02-04 14:46:40 +0100
committerErich Eckner <git@eckner.net>2016-02-04 14:46:40 +0100
commit7b784d17de7002aa656832944083b70f40b12350 (patch)
tree01fd83db2299f30c78eefe2eec7b552d4a1d9e4a
parentb40828e98bef8529855afa50d32b7f695bd31f5d (diff)
downloadepost-7b784d17de7002aa656832944083b70f40b12350.tar.xz
ich fühl mich unwohl, wenn die Arbeit nicht im git liegt
-rw-r--r--epost.lpr900
-rw-r--r--epost.lps131
-rw-r--r--epostunit.pas5696
-rw-r--r--typenunit.pas2495
-rw-r--r--werteunit.pas1015
5 files changed, 5407 insertions, 4830 deletions
diff --git a/epost.lpr b/epost.lpr
index b53b6e6..2d95c48 100644
--- a/epost.lpr
+++ b/epost.lpr
@@ -12,467 +12,469 @@ uses
{ you can add units after this }
sysutils, epostunit, mystringlistunit, typenunit, lowlevelunit;
-var maxthreads,i,j,k: longint;
- inf: tMyStringlist;
- s: string;
- b,syntaxtest,parallelLesen: boolean;
- wertes: tWerteArray;
- Konturen: tKonturenArray;
- Warnstufe: tWarnstufe;
+var
+ maxthreads,i,j,k: longint;
+ inf: tMyStringlist;
+ s: string;
+ b,syntaxtest,parallelLesen: boolean;
+ wertes: tWerteArray;
+ Konturen: tKonturenArray;
+ Warnstufe: tWarnstufe;
procedure werte_aufraeumen;
-var i: integer;
+var
+ i: integer;
begin
- for i:=0 to length(wertes)-1 do
- if assigned(wertes[i]) then
- wertes[i].free;
- setlength(wertes,0);
- for i:=0 to length(Konturen)-1 do
- if assigned(Konturen[i]) then
- Konturen[i].free;
- setlength(Konturen,0);
+ for i:=0 to length(wertes)-1 do
+ if assigned(wertes[i]) then
+ wertes[i].free;
+ setlength(wertes,0);
+ for i:=0 to length(Konturen)-1 do
+ if assigned(Konturen[i]) then
+ Konturen[i].free;
+ setlength(Konturen,0);
end;
procedure aufraeumen;
begin
- warte_auf_externeBefehle;
- werte_aufraeumen;
- inf.free;
+ warte_auf_externeBefehle;
+ werte_aufraeumen;
+ inf.free;
end;
begin
- cleanupLogs;
- if (not (paramcount in [1,2])) or
+ cleanupLogs;
+ if (not (paramcount in [1,2])) or
((paramcount=2) and (paramstr(2)<>'-L')) or
not fileexists(paramstr(1)) then begin
- gibAus('Verwendung: '+paramstr(0)+' input.epost',3);
- gibAus('oder: '+paramstr(0)+' input.epost -L',3);
- halt(1);
- end;
- maxthreads:=1;
- Warnstufe:=wsStreng;
- parallelLesen:=false;
- setlength(wertes,0);
- setlength(Konturen,0);
- behalteLogs:=(paramcount=2) and (paramstr(2)='-L');
- inf:=tMyStringlist.create(nil,'');
- inf.nichtInSubRoutine('^lösche Werte '); // Zeilen, die hierauf passen, werden nicht an subRoutinen-Aufrufe
- inf.nichtInSubRoutine('^lösche Kontur '); // von metaReadln gegeben, sondern nach hinten ans Hauptprogramm verschoben
- inf.loadFromFile(paramstr(1));
- if not inf.unfoldMacros then begin
- gibAus('Fehlerhafte input-Datei '''+paramstr(1)+'''!',3);
- halt(1);
- end;
+ gibAus('Verwendung: '+paramstr(0)+' input.epost',3);
+ gibAus('oder: '+paramstr(0)+' input.epost -L',3);
+ halt(1);
+ end;
+ maxthreads:=1;
+ Warnstufe:=wsStreng;
+ parallelLesen:=false;
+ setlength(wertes,0);
+ setlength(Konturen,0);
+ behalteLogs:=(paramcount=2) and (paramstr(2)='-L');
+ inf:=tMyStringlist.create(nil,'');
+ inf.nichtInSubRoutine('^lösche Werte '); // Zeilen, die hierauf passen, werden nicht an subRoutinen-Aufrufe
+ inf.nichtInSubRoutine('^lösche Kontur '); // von metaReadln gegeben, sondern nach hinten ans Hauptprogramm verschoben
+ inf.loadFromFile(paramstr(1));
+ if not inf.unfoldMacros then begin
+ gibAus('Fehlerhafte input-Datei '''+paramstr(1)+'''!',3);
+ halt(1);
+ end;
- for syntaxtest:=true downto false do begin
- if not syntaxtest then
- gibAus('Syntaxtest bestanden!',3);
- inf.rewind;
- while inf.metaReadln(s,false) do begin
- for i:=0 to length(wertes)-1 do
- wertes[i].beendeLeseThreadWennFertig;
- beendeExterneBefehleWennFertig;
- if s='streng warnen' then begin
- Warnstufe:=wsStreng;
- continue;
- end;
- if s='lasch warnen' then begin
- Warnstufe:=wsLasch;
- continue;
- end;
- if s='parallel lesen' then begin
- parallelLesen:=true;
- continue;
- end;
- if s='sequentiell lesen' then begin
- parallelLesen:=false;
- continue;
- end;
- if s='ohne Logdateien' then begin
- __ausgabenMaske:=__ausgabenMaske or 1;
- continue;
- end;
- if s='mit Logdateien' then begin
- __ausgabenMaske:=__ausgabenMaske and not 1;
- continue;
- end;
- if s='ohne Bildschirmausgaben' then begin
- __ausgabenMaske:=__ausgabenMaske or 2;
- continue;
- end;
- if s='mit Bildschirmausgaben' then begin
- __ausgabenMaske:=__ausgabenMaske and not 2;
- continue;
- end;
- if startetMit('externer Befehl:',s) then begin
- if externerBefehl(syntaxtest,s) then continue;
- aufraeumen;
- halt(1);
- end;
- if s='warte auf externe Befehle' then begin
- if not syntaxtest then begin
- warte_auf_externeBefehle;
- for i:=0 to length(wertes)-1 do
- wertes[i].warteAufBeendigungDesLeseThreads;
- end;
- continue;
- end;
- if startetMit('exprtofloat-Test:',s) then begin
- gibAus('exprtofloat-Test: '+s+'='+floattostr(wertes[length(wertes)-1].exprtofloat(syntaxtest,s)),3);
- continue;
- end;
- if startetMit('dupliziere ',s) then begin
- i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''dupliziere $Original zu $Kopie''',3);
- aufraeumen;
- halt(1);
- end;
- j:=findeWerte(s,inf,@wertes,@Konturen,true);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- wertes[j].kopiereVon(syntaxtest,wertes[i]);
- continue;
- end;
- if startetMit('erzeuge Dummy-Werte ',s) then begin
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- wertes[i].free;
- wertes[i]:=tWerte.create(@Konturen,@wertes);
- wertes[i].bezeichner:=s;
- continue;
- end;
- if startetMit('Daten einlesen ',s) then begin
- b:=not startetMit('(ohne Ausgaben)',s);
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].ladeDateien(syntaxtest,inf,parallelLesen,b) then begin
- continue;
- end;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Ascii laden ',s) then begin
- i:=findeWerte(erstesArgument(s),inf,@wertes,@Konturen,true);
- if wertes[i].ladeAscii(syntaxtest,s) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Linearkombination ',s) then begin
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneLiKo(syntaxtest,inf,maxthreads) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Agglomeration ',s) then begin
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneAgglomeration(syntaxtest,inf) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('teile ',s) then begin
- i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('durch ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''teile $Dividend durch $Divisor zu $Quotient''',3);
- aufraeumen;
- halt(1);
- end;
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''teile $Dividend durch $Divisor zu $Quotient''',3);
- aufraeumen;
- halt(1);
- end;
- k:=findeWerte(s,inf,@wertes,@Konturen,true);
- if k<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[k].berechneQuotient(syntaxtest,inf,maxthreads,i,j) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('multipliziere ',s) then begin
- i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('mal ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''multipliziere $Faktor mal $Faktor zu $Produkt''',3);
- aufraeumen;
- halt(1);
- end;
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''multipliziere $Faktor mal $Faktor zu $Produkt''',3);
- aufraeumen;
- halt(1);
- end;
- k:=findeWerte(s,inf,@wertes,@Konturen,true);
- if k<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[k].berechneProdukt(syntaxtest,inf,maxthreads,i,j) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('FFT2d ',s) then begin
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneFFT2d(syntaxtest,inf,maxthreads,Warnstufe) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('FFT ',s) then begin
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneFFT(syntaxtest,inf,maxthreads,Warnstufe) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Zeitfrequenzanalyse ',s) then begin
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''Zeitfrequenzanalyse $Original zu $Analyse''',3);
- aufraeumen;
- halt(1);
- end;
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneZeitfrequenzanalyse(syntaxtest,inf,maxthreads,wertes[j],Warnstufe) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Verzerrung ',s) then begin
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''Verzerrung $Original zu $Bild''',3);
- aufraeumen;
- halt(1);
- end;
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneVerzerrung(syntaxtest,inf,maxthreads,wertes[j],Warnstufe) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('integriere ',s) then begin
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''integriere $Funktion zu $Stammfunktion''',3);
- aufraeumen;
- halt(1);
- end;
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneIntegral(syntaxtest,inf,maxthreads,wertes[j]) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('korreliere ',s) then begin
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not startetMit('zu ',s) then begin
- gibAus('Fehlende Parameter, erwartet: ''korreliere $Original zu $Korrelation''',3);
- aufraeumen;
- halt(1);
- end;
- i:=findeWerte(s,inf,@wertes,@Konturen,true);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if wertes[i].berechneKorrelation(syntaxtest,inf,maxthreads,wertes[j]) then
- continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Threadanzahl:',s) then begin
- maxThreads:=strtoint(s);
- continue;
- end;
- if startetMit('maximale und minimale Dichten bestimmen ',s) then begin
- b:=startetMit('(symmetrisch) ',s);
- i:=findeWerte(s,nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- wertes[i].ermittleMinMaxDichten(syntaxtest,maxThreads,b);
- continue;
- end;
- if startetMit('maximale und minimale Dichten angleichen ',s) then begin
- b:=startetMit('(symmetrisch) ',s);
- i:=findeWerte(s,nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- wertes[i].gleicheMinMaxDichtenAn(syntaxtest,inf,b);
- continue;
- end;
- if startetMit('lineares Bild ',s) then begin
- i:=findeWerte(s,nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not wertes[i].erzeugeLinearesBild(syntaxtest,inf,maxthreads) then begin
- aufraeumen;
- halt(1);
- end;
- continue;
- end;
- if startetMit('Ascii ',s) then begin
- i:=findeWerte(s,nil,@wertes,@Konturen,false);
- if i<0 then begin
- aufraeumen;
- halt(1);
- end;
- if not wertes[i].erzeugeAscii(syntaxtest,inf) then begin
- aufraeumen;
- halt(1);
- end;
- continue;
- end;
- if startetMit('Lineout ',s) then begin
- i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if (i<0) or not wertes[i].erzeugeLineout(syntaxtest,s) then begin
- aufraeumen;
- halt(1);
- end;
- continue;
- end;
- if startetMit('Binning ',s) then begin
- i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if (i<0) or not wertes[i].erzeugeBinning(syntaxtest,s) then begin
- aufraeumen;
- halt(1);
- end;
- continue;
- end;
- if startetMit('lösche Werte ',s) then begin
- while s<>'' do begin
- j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- wertes[j].free;
- for i:=j+1 to length(wertes)-1 do
- wertes[i-1]:=wertes[i];
- setlength(wertes,length(wertes)-1);
- end;
- continue;
- end;
- if startetMit('lösche Kontur ',s) then begin
- while s<>'' do begin
- j:=findeKontur(erstesArgument(s),nil,@Konturen,false);
- if j<0 then begin
- aufraeumen;
- halt(1);
- end;
- konturen[j].free;
- for i:=j+1 to length(konturen)-1 do
- konturen[i-1]:=konturen[i];
- setlength(konturen,length(konturen)-1);
- end;
- continue;
- end;
- if s='Palette' then begin
- if neuePalette(inf) then continue;
- aufraeumen;
- halt(1);
- end;
- if startetMit('Kontur',s) then begin
- i:=findeKontur(s,inf,@Konturen,true);
- if (i>=0) and Konturen[i].Init(syntaxtest,inf,@wertes,maxthreads) then continue;
- aufraeumen;
- halt(1);
- end;
- if s='Dateiende' then
- break;
- gibAus('Befehl '''+s+''' ist unverständlich in '''+paramstr(1)+'''!',3);
- aufraeumen;
- halt(1);
- end;
- werte_aufraeumen;
- end;
- aufraeumen;
- if not behalteLogs then cleanupLogs;
+ for syntaxtest:=true downto false do begin
+ if not syntaxtest then
+ gibAus('Syntaxtest bestanden!',3);
+ inf.rewind;
+ while inf.metaReadln(s,false) do begin
+ for i:=0 to length(wertes)-1 do
+ wertes[i].beendeLeseThreadWennFertig;
+ beendeExterneBefehleWennFertig;
+ if s='streng warnen' then begin
+ Warnstufe:=wsStreng;
+ continue;
+ end;
+ if s='lasch warnen' then begin
+ Warnstufe:=wsLasch;
+ continue;
+ end;
+ if s='parallel lesen' then begin
+ parallelLesen:=true;
+ continue;
+ end;
+ if s='sequentiell lesen' then begin
+ parallelLesen:=false;
+ continue;
+ end;
+ if s='ohne Logdateien' then begin
+ __ausgabenMaske:=__ausgabenMaske or 1;
+ continue;
+ end;
+ if s='mit Logdateien' then begin
+ __ausgabenMaske:=__ausgabenMaske and not 1;
+ continue;
+ end;
+ if s='ohne Bildschirmausgaben' then begin
+ __ausgabenMaske:=__ausgabenMaske or 2;
+ continue;
+ end;
+ if s='mit Bildschirmausgaben' then begin
+ __ausgabenMaske:=__ausgabenMaske and not 2;
+ continue;
+ end;
+ if startetMit('externer Befehl:',s) then begin
+ if externerBefehl(syntaxtest,s) then continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if s='warte auf externe Befehle' then begin
+ if not syntaxtest then begin
+ warte_auf_externeBefehle;
+ for i:=0 to length(wertes)-1 do
+ wertes[i].warteAufBeendigungDesLeseThreads;
+ end;
+ continue;
+ end;
+ if startetMit('exprtofloat-Test:',s) then begin
+ gibAus('exprtofloat-Test: '+s+'='+floattostr(wertes[length(wertes)-1].exprtofloat(syntaxtest,s)),3);
+ continue;
+ end;
+ if startetMit('dupliziere ',s) then begin
+ i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''dupliziere $Original zu $Kopie''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ j:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ wertes[j].kopiereVon(syntaxtest,wertes[i]);
+ continue;
+ end;
+ if startetMit('erzeuge Dummy-Werte ',s) then begin
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ wertes[i].free;
+ wertes[i]:=tWerte.create(@Konturen,@wertes);
+ wertes[i].bezeichner:=s;
+ continue;
+ end;
+ if startetMit('Daten einlesen ',s) then begin
+ b:=not startetMit('(ohne Ausgaben)',s);
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].ladeDateien(syntaxtest,inf,parallelLesen,b) then begin
+ continue;
+ end;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Ascii laden ',s) then begin
+ i:=findeWerte(erstesArgument(s),inf,@wertes,@Konturen,true);
+ if wertes[i].ladeAscii(syntaxtest,s) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Linearkombination ',s) then begin
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneLiKo(syntaxtest,inf,maxthreads) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Agglomeration ',s) then begin
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneAgglomeration(syntaxtest,inf) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('teile ',s) then begin
+ i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('durch ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''teile $Dividend durch $Divisor zu $Quotient''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''teile $Dividend durch $Divisor zu $Quotient''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ k:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if k<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[k].berechneQuotient(syntaxtest,inf,maxthreads,i,j) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('multipliziere ',s) then begin
+ i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('mal ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''multipliziere $Faktor mal $Faktor zu $Produkt''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''multipliziere $Faktor mal $Faktor zu $Produkt''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ k:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if k<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[k].berechneProdukt(syntaxtest,inf,maxthreads,i,j) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('FFT2d ',s) then begin
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneFFT2d(syntaxtest,inf,maxthreads,Warnstufe) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('FFT ',s) then begin
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneFFT(syntaxtest,inf,maxthreads,Warnstufe) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Zeitfrequenzanalyse ',s) then begin
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''Zeitfrequenzanalyse $Original zu $Analyse''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneZeitfrequenzanalyse(syntaxtest,inf,maxthreads,wertes[j],Warnstufe) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Verzerrung ',s) then begin
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''Verzerrung $Original zu $Bild''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneVerzerrung(syntaxtest,inf,maxthreads,wertes[j],Warnstufe) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('integriere ',s) then begin
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''integriere $Funktion zu $Stammfunktion''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneIntegral(syntaxtest,inf,maxthreads,wertes[j]) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('korreliere ',s) then begin
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not startetMit('zu ',s) then begin
+ gibAus('Fehlende Parameter, erwartet: ''korreliere $Original zu $Korrelation''',3);
+ aufraeumen;
+ halt(1);
+ end;
+ i:=findeWerte(s,inf,@wertes,@Konturen,true);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if wertes[i].berechneKorrelation(syntaxtest,inf,maxthreads,wertes[j]) then
+ continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Threadanzahl:',s) then begin
+ maxThreads:=strtoint(s);
+ continue;
+ end;
+ if startetMit('maximale und minimale Dichten bestimmen ',s) then begin
+ b:=startetMit('(symmetrisch) ',s);
+ i:=findeWerte(s,nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ wertes[i].ermittleMinMaxDichten(syntaxtest,maxThreads,b);
+ continue;
+ end;
+ if startetMit('maximale und minimale Dichten angleichen ',s) then begin
+ b:=startetMit('(symmetrisch) ',s);
+ i:=findeWerte(s,nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ wertes[i].gleicheMinMaxDichtenAn(syntaxtest,inf,b);
+ continue;
+ end;
+ if startetMit('lineares Bild ',s) then begin
+ i:=findeWerte(s,nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not wertes[i].erzeugeLinearesBild(syntaxtest,inf,maxthreads) then begin
+ aufraeumen;
+ halt(1);
+ end;
+ continue;
+ end;
+ if startetMit('Ascii ',s) then begin
+ i:=findeWerte(s,nil,@wertes,@Konturen,false);
+ if i<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ if not wertes[i].erzeugeAscii(syntaxtest,inf) then begin
+ aufraeumen;
+ halt(1);
+ end;
+ continue;
+ end;
+ if startetMit('Lineout ',s) then begin
+ i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if (i<0) or not wertes[i].erzeugeLineout(syntaxtest,s) then begin
+ aufraeumen;
+ halt(1);
+ end;
+ continue;
+ end;
+ if startetMit('Binning ',s) then begin
+ i:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if (i<0) or not wertes[i].erzeugeBinning(syntaxtest,s) then begin
+ aufraeumen;
+ halt(1);
+ end;
+ continue;
+ end;
+ if startetMit('lösche Werte ',s) then begin
+ while s<>'' do begin
+ j:=findeWerte(erstesArgument(s),nil,@wertes,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ wertes[j].free;
+ for i:=j+1 to length(wertes)-1 do
+ wertes[i-1]:=wertes[i];
+ setlength(wertes,length(wertes)-1);
+ end;
+ continue;
+ end;
+ if startetMit('lösche Kontur ',s) then begin
+ while s<>'' do begin
+ j:=findeKontur(erstesArgument(s),nil,@Konturen,false);
+ if j<0 then begin
+ aufraeumen;
+ halt(1);
+ end;
+ konturen[j].free;
+ for i:=j+1 to length(konturen)-1 do
+ konturen[i-1]:=konturen[i];
+ setlength(konturen,length(konturen)-1);
+ end;
+ continue;
+ end;
+ if s='Palette' then begin
+ if neuePalette(inf) then continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if startetMit('Kontur',s) then begin
+ i:=findeKontur(s,inf,@Konturen,true);
+ if (i>=0) and Konturen[i].Init(syntaxtest,inf,@wertes,maxthreads) then continue;
+ aufraeumen;
+ halt(1);
+ end;
+ if s='Dateiende' then
+ break;
+ gibAus('Befehl '''+s+''' ist unverständlich in '''+paramstr(1)+'''!',3);
+ aufraeumen;
+ halt(1);
+ end;
+ werte_aufraeumen;
+ end;
+ aufraeumen;
+ if not behalteLogs then cleanupLogs;
end.
diff --git a/epost.lps b/epost.lps
index d68027d..d60b270 100644
--- a/epost.lps
+++ b/epost.lps
@@ -3,12 +3,11 @@
<ProjectSession>
<Version Value="9"/>
<BuildModes Active="Default"/>
- <Units Count="13">
+ <Units Count="14">
<Unit0>
<Filename Value="epost.lpr"/>
<IsPartOfProject Value="True"/>
- <TopLine Value="72"/>
- <CursorPos Y="185"/>
+ <CursorPos X="3" Y="26"/>
<UsageCount Value="202"/>
<Loaded Value="True"/>
</Unit0>
@@ -23,8 +22,8 @@
<Filename Value="epostunit.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="1"/>
- <TopLine Value="1885"/>
- <CursorPos X="5" Y="1905"/>
+ <TopLine Value="788"/>
+ <CursorPos X="3" Y="809"/>
<UsageCount Value="201"/>
<Loaded Value="True"/>
</Unit2>
@@ -38,9 +37,9 @@
<Unit4>
<Filename Value="werteunit.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="4"/>
- <TopLine Value="210"/>
- <CursorPos X="60" Y="219"/>
+ <EditorIndex Value="2"/>
+ <TopLine Value="152"/>
+ <CursorPos X="3" Y="173"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit4>
@@ -48,9 +47,9 @@
<Filename Value="typenunit.pas"/>
<IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/>
- <EditorIndex Value="5"/>
- <TopLine Value="214"/>
- <CursorPos Y="216"/>
+ <EditorIndex Value="3"/>
+ <TopLine Value="1980"/>
+ <CursorPos X="3" Y="2001"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit5>
@@ -59,27 +58,26 @@
<EditorIndex Value="-1"/>
<TopLine Value="1612"/>
<CursorPos X="2" Y="1675"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit6>
<Unit7>
<Filename Value="../units/mystringlistunit.pas"/>
<EditorIndex Value="-1"/>
- <TopLine Value="344"/>
- <CursorPos X="17" Y="344"/>
- <UsageCount Value="19"/>
+ <TopLine Value="356"/>
+ <CursorPos X="43" Y="378"/>
+ <UsageCount Value="18"/>
</Unit7>
<Unit8>
<Filename Value="../units/lowlevelunit.pas"/>
- <EditorIndex Value="3"/>
- <TopLine Value="17"/>
- <CursorPos X="3" Y="37"/>
- <UsageCount Value="28"/>
- <Loaded Value="True"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="23"/>
+ <CursorPos X="51" Y="44"/>
+ <UsageCount Value="27"/>
</Unit8>
<Unit9>
<Filename Value="../units/randomunit.pas"/>
<EditorIndex Value="-1"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit9>
<Unit10>
<Filename Value="../units/matheunit.pas"/>
@@ -87,143 +85,150 @@
<TopLine Value="544"/>
<CursorPos X="53" Y="567"/>
<FoldState Value=" T3q50{m012A"/>
- <UsageCount Value="19"/>
+ <UsageCount Value="18"/>
</Unit10>
<Unit11>
<Filename Value="../units/systemunit.pas"/>
- <EditorIndex Value="2"/>
+ <EditorIndex Value="-1"/>
<TopLine Value="65"/>
<CursorPos X="26" Y="80"/>
- <UsageCount Value="20"/>
- <Loaded Value="True"/>
+ <UsageCount Value="19"/>
</Unit11>
<Unit12>
<Filename Value="../fpGUI/src/corelib/render/software/agg_2D.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="807"/>
<CursorPos Y="818"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="9"/>
</Unit12>
+ <Unit13>
+ <Filename Value="../units/protokollunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="82"/>
+ <CursorPos X="15" Y="30"/>
+ <UsageCount Value="9"/>
+ </Unit13>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
- <Filename Value="werteunit.pas"/>
- <Caret Line="251" TopLine="211"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="6035" Column="3" TopLine="5949"/>
</Position1>
<Position2>
<Filename Value="epostunit.pas"/>
- <Caret Line="1926" Column="16" TopLine="1906"/>
+ <Caret Line="6041" TopLine="6021"/>
</Position2>
<Position3>
<Filename Value="epostunit.pas"/>
- <Caret Line="1947" Column="33" TopLine="1912"/>
+ <Caret Line="5452" Column="3" TopLine="5444"/>
</Position3>
<Position4>
<Filename Value="epostunit.pas"/>
- <Caret Line="1927" Column="36" TopLine="1912"/>
+ <Caret Line="5342" Column="3" TopLine="5320"/>
</Position4>
<Position5>
<Filename Value="epostunit.pas"/>
+ <Caret Line="5165" Column="3" TopLine="5141"/>
</Position5>
<Position6>
<Filename Value="epostunit.pas"/>
- <Caret Line="122" Column="25" TopLine="90"/>
+ <Caret Line="5108" Column="3" TopLine="5084"/>
</Position6>
<Position7>
<Filename Value="epostunit.pas"/>
- <Caret Line="123" Column="25" TopLine="91"/>
+ <Caret Line="5073" Column="3" TopLine="5050"/>
</Position7>
<Position8>
<Filename Value="epostunit.pas"/>
- <Caret Line="407" Column="29" TopLine="375"/>
+ <Caret Line="4504" Column="10" TopLine="4487"/>
</Position8>
<Position9>
<Filename Value="epostunit.pas"/>
- <Caret Line="442" Column="32" TopLine="403"/>
+ <Caret Line="4307" Column="3" TopLine="4286"/>
</Position9>
<Position10>
<Filename Value="epostunit.pas"/>
- <Caret Line="1803" Column="26" TopLine="1780"/>
+ <Caret Line="4099" Column="3" TopLine="4077"/>
</Position10>
<Position11>
<Filename Value="epostunit.pas"/>
- <Caret Line="1929" Column="35" TopLine="1910"/>
+ <Caret Line="4013" Column="3" TopLine="3991"/>
</Position11>
<Position12>
<Filename Value="epostunit.pas"/>
- <Caret Line="1941" Column="14" TopLine="1920"/>
+ <Caret Line="4011" TopLine="3991"/>
</Position12>
<Position13>
- <Filename Value="epostunit.pas"/>
- <Caret Line="1904" Column="33" TopLine="1885"/>
+ <Filename Value="typenunit.pas"/>
+ <Caret Line="863" Column="3" TopLine="842"/>
</Position13>
<Position14>
<Filename Value="epostunit.pas"/>
- <Caret Line="151" Column="14" TopLine="132"/>
+ <Caret Line="3834" Column="128" TopLine="3828"/>
</Position14>
<Position15>
<Filename Value="epostunit.pas"/>
- <Caret Line="1903" Column="5" TopLine="1897"/>
+ <Caret Line="3166" Column="3" TopLine="3132"/>
</Position15>
<Position16>
<Filename Value="epostunit.pas"/>
- <Caret Line="153" Column="14" TopLine="134"/>
+ <Caret Line="2860" Column="3" TopLine="2836"/>
</Position16>
<Position17>
<Filename Value="epostunit.pas"/>
- <Caret Line="82" Column="22" TopLine="61"/>
+ <Caret Line="2727" Column="3" TopLine="2706"/>
</Position17>
<Position18>
<Filename Value="epostunit.pas"/>
- <Caret Line="153" Column="57" TopLine="121"/>
+ <Caret Line="2410" Column="3" TopLine="2386"/>
</Position18>
<Position19>
- <Filename Value="typenunit.pas"/>
- <Caret Line="350" Column="19" TopLine="342"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="2368" Column="3" TopLine="2344"/>
</Position19>
<Position20>
- <Filename Value="typenunit.pas"/>
- <Caret Line="377" Column="20" TopLine="345"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="2197" Column="3" TopLine="2167"/>
</Position20>
<Position21>
- <Filename Value="typenunit.pas"/>
- <Caret Line="831" Column="42" TopLine="820"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="2105" Column="3" TopLine="2080"/>
</Position21>
<Position22>
<Filename Value="epostunit.pas"/>
- <Caret Line="475" Column="8" TopLine="394"/>
+ <Caret Line="2012" Column="3" TopLine="1987"/>
</Position22>
<Position23>
- <Filename Value="typenunit.pas"/>
- <Caret Line="1935" TopLine="1912"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="1718" Column="3" TopLine="1692"/>
</Position23>
<Position24>
- <Filename Value="typenunit.pas"/>
- <Caret Line="408" Column="59" TopLine="391"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="1584" Column="3" TopLine="1560"/>
</Position24>
<Position25>
- <Filename Value="typenunit.pas"/>
- <Caret Line="1937" Column="22" TopLine="1917"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="1525" Column="3" TopLine="1507"/>
</Position25>
<Position26>
<Filename Value="epostunit.pas"/>
- <Caret Line="1904" Column="71" TopLine="1883"/>
+ <Caret Line="1370" Column="3" TopLine="1356"/>
</Position26>
<Position27>
<Filename Value="epostunit.pas"/>
- <Caret Line="1901" Column="37" TopLine="1882"/>
+ <Caret Line="1036" Column="3" TopLine="1006"/>
</Position27>
<Position28>
<Filename Value="typenunit.pas"/>
- <Caret Line="1943" Column="7" TopLine="1918"/>
+ <Caret Line="413" Column="5" TopLine="393"/>
</Position28>
<Position29>
<Filename Value="typenunit.pas"/>
- <Caret Line="400" Column="96" TopLine="374"/>
+ <Caret Line="2136" Column="3" TopLine="2084"/>
</Position29>
<Position30>
<Filename Value="typenunit.pas"/>
- <Caret Line="1514" Column="15" TopLine="1494"/>
+ <Caret Line="200" TopLine="180"/>
</Position30>
</JumpHistory>
</ProjectSession>
diff --git a/epostunit.pas b/epostunit.pas
index 45cdb26..81bdaf7 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -36,8 +36,8 @@ type
pTPalettenArray = array of pTPalette;
tWerte = class;
tLiKo = array of record
- alpha: extended;
- werte: tWerte;
+ alpha: extended;
+ werte: tWerte;
end;
pTLiKo = ^tLiKo;
pTWerteArray = ^tWerteArray;
@@ -77,7 +77,9 @@ type
function findeAlleDateien(nam: string; var dat: tGenerischeInputDateiInfoArray; Vorlage: tGenerischeInputDateiInfo): boolean;
function ermittleExterneInputParameter(var f: tMyStringlist; 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: tTransformationen; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
+ procedure initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tTransformation; verzerrAnzahl: longint; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
+ function rTransformationen: tTransformation;
+ procedure wTransformationen(tr: tTransformation);
function rXsteps: longint;
procedure wXsteps(xs: longint);
function rTsiz: longint;
@@ -148,8 +150,8 @@ type
procedure schreibeWert(var f: textfile; x,y: longint);
function exprtofloat(st: boolean; s: string): extended;
function paramsdump: string;
- function Transformationen: tTransformationen;
procedure beendeLeseThreadWennFertig;
+ property Transformationen: tTransformation read rTransformationen write wTransformationen;
property _xsteps: longint read rXsteps write wXsteps;
property _tsiz: longint read rTsiz write wTsiz;
// property _xstart: extended read rXstart write wXstart;
@@ -214,14 +216,14 @@ type
ws: tWerteArray;
xmi,xma,tmi,tma,xpmi,xpma: Longint;
xz,yz: extended;
- nbs: tTransformationenArray;
+ nbs: tTransformationArray;
farben: trgbArray;
wertes: array of tExtendedArray;
anzahlens: array of tLongintArray;
pals: tRGBArrayArray;
rahmen: boolean;
beschr: pTBeschriftungen;
- constructor create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const wes: tWerteArray; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitungen: tTransformationenArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
+ constructor create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const wes: tWerteArray; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitungen: tTransformationArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
destructor destroy; override;
procedure stExecute; override;
end;
@@ -308,15 +310,15 @@ type
procedure stExecute; override;
end;
tVerzerrInitThread = class(tLogThread)
- qu,zi: tWerte;
- ZPs: tIntPointArray;
- ZGs: tExtPointArray;
- ZAs: tExtendedArray;
- xMi,xMa,tMi,tMa,x0,t0,mt: longint; // bzgl. Ziel
- eps: extended;
- verz: tTransformationen;
- Warnstufe: tWarnstufe;
- constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformationen; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
+ qu,zi: tWerte;
+ ZPs: tIntPointArray;
+ ZGs: tExtPointArray;
+ ZAs: tExtendedArray;
+ xMi,xMa,tMi,tMa,x0,t0,mt,va: longint; // bzgl. Ziel
+ eps: extended;
+ verz: tTransformation;
+ Warnstufe: tWarnstufe;
+ constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformation; verzerrAnz: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
destructor destroy; override;
procedure stExecute; override;
end;
@@ -326,8 +328,9 @@ type
ZGs: tExtPointArray;
ZAs: tExtendedArray;
xMi,xMa,tMi,tMa: longint; // bzgl. Ziel
- vb,nb: tTransformationen;
- constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformationen);
+ vb,nb: tTransformation;
+ va,na: longint;
+ constructor create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformation; vorAnz,nachAnz: longint);
destructor destroy; override;
procedure stExecute; override;
end;
@@ -336,7 +339,7 @@ function neuePalette(var f: tMyStringlist): 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: tMyStringlist; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformationen; pal: pTPalette): boolean;
+function erzeugeLegende(st: boolean; var f: tMyStringlist; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformation; pal: pTPalette): boolean;
function strToFftDo(out fftDo: tFFTDatenordnung; s: string): boolean;
function findeWerte(s: String; f: tMyStringlist; pws: pTWerteArray; Kont: pTKonturenArray; darfErstellen: boolean): integer;
function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer;
@@ -356,82 +359,84 @@ uses math, systemunit;
// tWerte **********************************************************************
constructor tWerte.create(Kont: pTKonturenArray; wert: pTWerteArray);
-var ps: tExtrainfos;
+var
+ ps: tExtrainfos;
begin
- inherited create;
- ps:=tExtrainfos.create;
- Genauigkeit:=gSingle;
- leseThread:=nil;
- sWerte:=tLLWerteSingle.create(ps);
- dWerte:=tLLWerteDouble.create(ps);
- eWerte:=tLLWerteExtended.create(ps);
- Konturen:=Kont;
- wertes:=wert;
- bezeichner:='';
+ inherited create;
+ ps:=tExtrainfos.create;
+ Genauigkeit:=gSingle;
+ leseThread:=nil;
+ sWerte:=tLLWerteSingle.create(ps);
+ dWerte:=tLLWerteDouble.create(ps);
+ eWerte:=tLLWerteExtended.create(ps);
+ Konturen:=Kont;
+ wertes:=wert;
+ bezeichner:='';
end;
constructor tWerte.create(original: tWerte; xmin,xmax: longint);
-var ps: tExtrainfos;
- pSi: pTLLWerteSingle;
- pDo: pTLLWerteDouble;
- pEx: pTLLWerteExtended;
-begin
- inherited create;
- original.warteAufBeendigungDesLeseThreads;
- ps:=tExtrainfos.create;
- leseThread:=nil;
- Genauigkeit:=original.Genauigkeit;
- Konturen:=original.Konturen;
- case Genauigkeit of
- gSingle: begin
- pSi:=@(original.sWerte);
- sWerte:=tLLWerteSingle.create(pSi,ps,xmin,xmax);
- dWerte:=tLLWerteDouble.create(ps);
- eWerte:=tLLWerteExtended.create(ps);
- end;
- gDouble: begin
- pDo:=@(original.dWerte);
- sWerte:=tLLWerteSingle.create(ps);
- dWerte:=tLLWerteDouble.create(pDo,ps,xmin,xmax);
- eWerte:=tLLWerteExtended.create(ps);
- end;
- gExtended: begin
- sWerte:=tLLWerteSingle.create(ps);
- dWerte:=tLLWerteDouble.create(ps);
- pEx:=@(original.eWerte);
- eWerte:=tLLWerteExtended.create(pEx,ps,xmin,xmax);
- end;
- end{of case};
- if original.bezeichner='' then bezeichner:=''
- else bezeichner:=original.bezeichner+'''';
- Transformationen.kopiereVon(original.Transformationen);
- wertes:=original.wertes;
+var
+ ps: tExtrainfos;
+ pSi: pTLLWerteSingle;
+ pDo: pTLLWerteDouble;
+ pEx: pTLLWerteExtended;
+begin
+ inherited create;
+ original.warteAufBeendigungDesLeseThreads;
+ ps:=tExtrainfos.create;
+ leseThread:=nil;
+ Genauigkeit:=original.Genauigkeit;
+ Konturen:=original.Konturen;
+ case Genauigkeit of
+ gSingle: begin
+ pSi:=@(original.sWerte);
+ sWerte:=tLLWerteSingle.create(pSi,ps,xmin,xmax);
+ dWerte:=tLLWerteDouble.create(ps);
+ eWerte:=tLLWerteExtended.create(ps);
+ end;
+ gDouble: begin
+ pDo:=@(original.dWerte);
+ sWerte:=tLLWerteSingle.create(ps);
+ dWerte:=tLLWerteDouble.create(pDo,ps,xmin,xmax);
+ eWerte:=tLLWerteExtended.create(ps);
+ end;
+ gExtended: begin
+ sWerte:=tLLWerteSingle.create(ps);
+ dWerte:=tLLWerteDouble.create(ps);
+ pEx:=@(original.eWerte);
+ eWerte:=tLLWerteExtended.create(pEx,ps,xmin,xmax);
+ end;
+ end{of case};
+ if original.bezeichner='' then bezeichner:=''
+ else bezeichner:=original.bezeichner+'''';
+ Transformationen:=original.Transformationen;
+ wertes:=original.wertes;
end;
destructor tWerte.destroy;
begin
- warteAufBeendigungDesLeseThreads;
- if eWerte.params<>sWerte.params then begin
- eWerte.params.free;
- gibAus('Die Werteparameter sind verschieden instaziiert!!!',3);
- end;
- sWerte.params.free;
- eWerte.free;
- dWerte.free;
- sWerte.free;
- inherited destroy;
+ warteAufBeendigungDesLeseThreads;
+ if eWerte.params<>sWerte.params then begin
+ eWerte.params.free;
+ gibAus('Die Werteparameter sind verschieden instaziiert!!!',3);
+ end;
+ sWerte.params.free;
+ eWerte.free;
+ dWerte.free;
+ sWerte.free;
+ inherited destroy;
end;
procedure tWerte.warteAufBeendigungDesLeseThreads;
begin
- if assigned(leseThread) then begin
- gibAus('Warte auf Beendigung des Lesethreads von '''+bezeichner+''' ...',3);
- while not leseThread.fertig do
- sleep(10);
- leseThread.free;
- leseThread:=nil;
- gibAus('... ist fertig',3);
- end;
+ if assigned(leseThread) then begin
+ gibAus('Warte auf Beendigung des Lesethreads von '''+bezeichner+''' ...',3);
+ while not leseThread.fertig do
+ sleep(10);
+ leseThread.free;
+ leseThread:=nil;
+ gibAus('... ist fertig',3);
+ end;
end;
procedure tWerte.kopiereVon(st: boolean; original: tWerte); overload;
@@ -440,27 +445,47 @@ begin
end;
procedure tWerte.kopiereVon(st: boolean; original: tWerte; xmin,xmax: longint); overload;
-var pSi: pTLLWerteSingle;
- pDo: pTLLWerteDouble;
- pEx: pTLLWerteExtended;
-begin
- original.warteAufBeendigungDesLeseThreads;
- Transformationen.kopiereVon(original.Transformationen);
- Genauigkeit:=original.Genauigkeit;
- case Genauigkeit of
- gSingle: begin
- pSi:=@(original.sWerte);
- sWerte.kopiereVon(st,pSi,xmin,xmax);
- end;
- gDouble: begin
- pDo:=@(original.dWerte);
- dWerte.kopiereVon(st,pDo,xmin,xmax);
- end;
- gExtended: begin
- pEx:=@(original.eWerte);
- eWerte.kopiereVon(st,pEx,xmin,xmax);
- end;
- end{of case};
+var
+ pSi: pTLLWerteSingle;
+ pDo: pTLLWerteDouble;
+ pEx: pTLLWerteExtended;
+begin
+ original.warteAufBeendigungDesLeseThreads;
+ Transformationen:=original.Transformationen;
+ Genauigkeit:=original.Genauigkeit;
+ case Genauigkeit of
+ gSingle: begin
+ pSi:=@(original.sWerte);
+ sWerte.kopiereVon(st,pSi,xmin,xmax);
+ end;
+ gDouble: begin
+ pDo:=@(original.dWerte);
+ dWerte.kopiereVon(st,pDo,xmin,xmax);
+ end;
+ gExtended: begin
+ pEx:=@(original.eWerte);
+ eWerte.kopiereVon(st,pEx,xmin,xmax);
+ end;
+ end{of case};
+end;
+
+
+function tWerte.rTransformationen: tTransformation;
+begin
+ case genauigkeit of
+ gSingle: result:=sWerte.params.transformationen;
+ gDouble: result:=dWerte.params.transformationen;
+ gExtended: result:=eWerte.params.transformationen;
+ end{of case};
+end;
+
+procedure tWerte.wTransformationen(tr: tTransformation);
+begin
+ case genauigkeit of
+ gSingle: sWerte.params.transformationen:=tr;
+ gDouble: dWerte.params.transformationen:=tr;
+ gExtended: eWerte.params.transformationen:=tr;
+ end{of case};
end;
function tWerte.rXsteps: longint;
@@ -484,11 +509,11 @@ end;
function tWerte.rTsiz: longint;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.tsiz;
- gDouble: result:=dWerte.params.tsiz;
- gExtended: result:=eWerte.params.tsiz;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.tsiz;
+ gDouble: result:=dWerte.params.tsiz;
+ gExtended: result:=eWerte.params.tsiz;
+ end{of case};
end;
procedure tWerte.wTsiz(ts: longint);
@@ -503,1059 +528,1075 @@ end;
function tWerte.rXstart: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.xstart;
- gDouble: result:=dWerte.params.xstart;
- gExtended: result:=eWerte.params.xstart;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.xstart;
+ gDouble: result:=dWerte.params.xstart;
+ gExtended: result:=eWerte.params.xstart;
+ end{of case};
end;
procedure tWerte.wXstart(xs: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.transformationen.xstart:=xs;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.transformationen.xstart:=xs;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.transformationen.xstart:=xs;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.transformationen.xstart:=xs;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.transformationen.xstart:=xs;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.transformationen.xstart:=xs;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rXstop: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.xstop;
- gDouble: result:=dWerte.params.xstop;
- gExtended: result:=eWerte.params.xstop;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.xstop;
+ gDouble: result:=dWerte.params.xstop;
+ gExtended: result:=eWerte.params.xstop;
+ end{of case};
end;
procedure tWerte.wXstop(xs: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.transformationen.xstop:=xs;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.transformationen.xstop:=xs;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.transformationen.xstop:=xs;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.transformationen.xstop:=xs;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.transformationen.xstop:=xs;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.transformationen.xstop:=xs;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rTstart: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.tstart;
- gDouble: result:=dWerte.params.tstart;
- gExtended: result:=eWerte.params.tstart;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.tstart;
+ gDouble: result:=dWerte.params.tstart;
+ gExtended: result:=eWerte.params.tstart;
+ end{of case};
end;
procedure tWerte.wTstart(ts: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.transformationen.tstart:=ts;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.transformationen.tstart:=ts;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.transformationen.tstart:=ts;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.transformationen.tstart:=ts;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.transformationen.tstart:=ts;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.transformationen.tstart:=ts;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rTstop: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.tstop;
- gDouble: result:=dWerte.params.tstop;
- gExtended: result:=eWerte.params.tstop;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.tstop;
+ gDouble: result:=dWerte.params.tstop;
+ gExtended: result:=eWerte.params.tstop;
+ end{of case};
end;
procedure tWerte.wTstop(ts: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.transformationen.tstop:=ts;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.transformationen.tstop:=ts;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.transformationen.tstop:=ts;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.transformationen.tstop:=ts;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.transformationen.tstop:=ts;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.transformationen.tstop:=ts;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rNp: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.np;
- gDouble: result:=dWerte.params.np;
- gExtended: result:=eWerte.params.np;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.np;
+ gDouble: result:=dWerte.params.np;
+ gExtended: result:=eWerte.params.np;
+ end{of case};
end;
procedure tWerte.wNp(np: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.np:=np;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.np:=np;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.np:=np;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.np:=np;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.np:=np;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.np:=np;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rBeta: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.beta;
- gDouble: result:=dWerte.params.beta;
- gExtended: result:=eWerte.params.beta;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.beta;
+ gDouble: result:=dWerte.params.beta;
+ gExtended: result:=eWerte.params.beta;
+ end{of case};
end;
procedure tWerte.wBeta(beta: extended);
begin
- case genauigkeit of
- gSingle: begin
- sWerte.params.beta:=beta;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.beta:=beta;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.beta:=beta;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.beta:=beta;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.beta:=beta;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.beta:=beta;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rMinw: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.minw;
- gDouble: result:=dWerte.params.minw;
- gExtended: result:=eWerte.params.minw;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.minw;
+ gDouble: result:=dWerte.params.minw;
+ gExtended: result:=eWerte.params.minw;
+ end{of case};
end;
procedure tWerte.wMinw(miw: extended);
begin
- Transformationen.wmin:=miw;
- case genauigkeit of
- gSingle: begin
- sWerte.params.minw:=miw;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.minw:=miw;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.minw:=miw;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ Transformationen.wmin:=miw;
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.minw:=miw;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.minw:=miw;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.minw:=miw;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.rMaxw: extended;
begin
- case genauigkeit of
- gSingle: result:=sWerte.params.maxw;
- gDouble: result:=dWerte.params.maxw;
- gExtended: result:=eWerte.params.maxw;
- end{of case};
+ case genauigkeit of
+ gSingle: result:=sWerte.params.maxw;
+ gDouble: result:=dWerte.params.maxw;
+ gExtended: result:=eWerte.params.maxw;
+ end{of case};
end;
procedure tWerte.wMaxw(maw: extended);
begin
- Transformationen.wmax:=maw;
- case genauigkeit of
- gSingle: begin
- sWerte.params.maxw:=maw;
- sWerte.params.refreshKnownValues;
- end;
- gDouble: begin
- dWerte.params.maxw:=maw;
- dWerte.params.refreshKnownValues;
- end;
- gExtended: begin
- eWerte.params.maxw:=maw;
- eWerte.params.refreshKnownValues;
- end;
- end{of case};
+ Transformationen.wmax:=maw;
+ case genauigkeit of
+ gSingle: begin
+ sWerte.params.maxw:=maw;
+ sWerte.params.refreshKnownValues;
+ end;
+ gDouble: begin
+ dWerte.params.maxw:=maw;
+ dWerte.params.refreshKnownValues;
+ end;
+ gExtended: begin
+ eWerte.params.maxw:=maw;
+ eWerte.params.refreshKnownValues;
+ end;
+ end{of case};
end;
function tWerte.findeAlleDateien(nam: string; var dat: tGenerischeInputDateiInfoArray; Vorlage: tGenerischeInputDateiInfo): boolean;
-var err: longint;
- s,prae,post: string;
- i,mi,ma: longint;
- sr: tSearchRec;
-begin
- result:=false;
- if pos('{',nam)>0 then begin
- s:=copy(nam,pos('{',nam)+1,pos('}',nam)-pos('{',nam)-1);
- if pos('..',s)=0 then begin
- gibAus('Syntaxfehler im Dateinamen!',3);
- exit;
- end;
- mi:=strtoint(copy(s,1,pos('..',s)-1));
- ma:=strtoint(copy(s,pos('..',s)+length('..'),length(s)));
- prae:=copy(nam,1,pos('{',nam)-1);
- post:=copy(nam,pos('}',nam)+1,length(nam));
- for i:=mi to ma do
- result:=findeAlleDateien(prae+inttostr(i)+post,dat,Vorlage) or result;
- if not result then begin
- gibAus('Keine Datei passt zum Muster '''+nam+'''!',3);
- exit;
- end;
- end
- else begin
- err:=findfirst(nam,$3f,sr);
- if err<>0 then begin
- findclose(sr);
- gibAus('Keine Datei passt zum Muster '''+nam+'''!',3);
- exit;
- end;
- while err=0 do begin
- setlength(dat,length(dat)+1);
- if Vorlage is tTraceInputDateiInfo then
- dat[length(dat)-1]:=tTraceInputDateiInfo.create(Vorlage);
- if Vorlage is tPhaseSpaceInputDateiInfo then
- dat[length(dat)-1]:=tPhaseSpaceInputDateiInfo.create(Vorlage);
- if Vorlage is tSpaceTimeInputDateiInfo then
- dat[length(dat)-1]:=tSpaceTimeInputDateiInfo.create(Vorlage);
- if Vorlage is tPipeInputDateiInfo then
- dat[length(dat)-1]:=tPipeInputDateiInfo.create(Vorlage);
- dat[length(dat)-1].Name:=extractfilepath(nam)+extractfilename(sr.Name);
- err:=findnext(sr);
- end;
- findclose(sr);
- result:=true;
- end;
+var
+ err: longint;
+ s,prae,post: string;
+ i,mi,ma: longint;
+ sr: tSearchRec;
+begin
+ result:=false;
+ if pos('{',nam)>0 then begin
+ s:=copy(nam,pos('{',nam)+1,pos('}',nam)-pos('{',nam)-1);
+ if pos('..',s)=0 then begin
+ gibAus('Syntaxfehler im Dateinamen!',3);
+ exit;
+ end;
+ mi:=strtoint(copy(s,1,pos('..',s)-1));
+ ma:=strtoint(copy(s,pos('..',s)+length('..'),length(s)));
+ prae:=copy(nam,1,pos('{',nam)-1);
+ post:=copy(nam,pos('}',nam)+1,length(nam));
+ for i:=mi to ma do
+ result:=findeAlleDateien(prae+inttostr(i)+post,dat,Vorlage) or result;
+ if not result then begin
+ gibAus('Keine Datei passt zum Muster '''+nam+'''!',3);
+ exit;
+ end;
+ end
+ else begin
+ err:=findfirst(nam,$3f,sr);
+ if err<>0 then begin
+ findclose(sr);
+ gibAus('Keine Datei passt zum Muster '''+nam+'''!',3);
+ exit;
+ end;
+ while err=0 do begin
+ setlength(dat,length(dat)+1);
+ if Vorlage is tTraceInputDateiInfo then
+ dat[length(dat)-1]:=tTraceInputDateiInfo.create(Vorlage);
+ if Vorlage is tPhaseSpaceInputDateiInfo then
+ dat[length(dat)-1]:=tPhaseSpaceInputDateiInfo.create(Vorlage);
+ if Vorlage is tSpaceTimeInputDateiInfo then
+ dat[length(dat)-1]:=tSpaceTimeInputDateiInfo.create(Vorlage);
+ if Vorlage is tPipeInputDateiInfo then
+ dat[length(dat)-1]:=tPipeInputDateiInfo.create(Vorlage);
+ dat[length(dat)-1].Name:=extractfilepath(nam)+extractfilename(sr.Name);
+ err:=findnext(sr);
+ end;
+ findclose(sr);
+ result:=true;
+ end;
end;
function tWerte.ermittleExterneInputParameter(var f: tMyStringlist; out dateien: tGenerischeInputDateiInfoArray): boolean;
// Parameter ermitteln, die in der Config-Datei stehen
-var s: string;
- ne,be,maxAmp: extended;
- Vorlagen: tInputDateiInfoVorlagen;
- g: textfile;
- erfolg: Word;
- i: Longint;
- mitGewalt: boolean;
+var
+ s: string;
+ ne,be,maxAmp: extended;
+ Vorlagen: tInputDateiInfoVorlagen;
+ g: textfile;
+ erfolg: Word;
+ i: Longint;
+ mitGewalt: boolean;
procedure aufraeumen;
-var ii: longint;
-begin
- if assigned(Vorlagen) then Vorlagen.free;
- for ii:=0 to length(dateien)-1 do
- if assigned(dateien[ii]) then
- dateien[ii].free;
- setlength(dateien,0);
-end;
-
-begin
- result:=false;
- setlength(dateien,0);
- Vorlagen:=tInputDateiInfoVorlagen.create;
- Vorlagen.params:=sWerte.params;
- ne:=0;
- maxAmp:=0;
- sWerte.params.beta:=-1;
- sWerte.params.maxW:=0;
- sWerte.params.minW:=0;
- sWerte.params.np:=0;
- sWerte.params.transformationen.tstart:=0;
- sWerte.params.transformationen.tstop:=0;
- sWerte.params.transformationen.xstart:=0;
- sWerte.params.transformationen.xstop:=0;
- mitGewalt:=false;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende!',3);
- aufraeumen;
- exit;
- end;
- if s='Ende' then
- break;
- if s='mit Gewalt' then begin
- mitGewalt:=true;
- continue;
- end;
- if startetMit('Genauigkeit:',s) then begin
- if not Vorlagen.GenauigkeitFromStr(s) then begin
- aufraeumen;
- exit;
- end;
- if (Genauigkeit < Vorlagen.Genauigkeit) then
- Genauigkeit:=Vorlagen.Genauigkeit;
- continue;
- end;
- if startetMit('Gamma:',s) then begin
- Vorlagen.Gamma:=exprtofloat(false,s);
- continue;
- end;
- if startetMit('tmin:',s) then begin
- Vorlagen.tstart:=exprtofloat(false,s);
- continue;
- end;
- if startetMit('tmax:',s) then begin
- Vorlagen.tstop:=exprtofloat(false,s);
- continue;
- end;
- if startetMit('xmin:',s) then begin
- Vorlagen.xstart:=exprtofloat(false,s);
- continue;
- end;
- if startetMit('xmax:',s) then begin
- Vorlagen.xstop:=exprtofloat(false,s);
- continue;
- end;
- if startetMit('Inputparameterdatei:',s) then begin
- if (not mitGewalt) and (not fileexists(extractfilepath(s)+'times-1')) and
+var
+ ii: longint;
+begin
+ if assigned(Vorlagen) then Vorlagen.free;
+ for ii:=0 to length(dateien)-1 do
+ if assigned(dateien[ii]) then
+ dateien[ii].free;
+ setlength(dateien,0);
+end;
+
+begin
+ result:=false;
+ setlength(dateien,0);
+ Vorlagen:=tInputDateiInfoVorlagen.create;
+ Vorlagen.params:=sWerte.params;
+ ne:=0;
+ maxAmp:=0;
+ sWerte.params.beta:=-1;
+ sWerte.params.maxW:=0;
+ sWerte.params.minW:=0;
+ sWerte.params.np:=0;
+ sWerte.params.transformationen.tstart:=0;
+ sWerte.params.transformationen.tstop:=0;
+ sWerte.params.transformationen.xstart:=0;
+ sWerte.params.transformationen.xstop:=0;
+ mitGewalt:=false;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende!',3);
+ aufraeumen;
+ exit;
+ end;
+ if s='Ende' then
+ break;
+ if s='mit Gewalt' then begin
+ mitGewalt:=true;
+ continue;
+ end;
+ if startetMit('Genauigkeit:',s) then begin
+ if not Vorlagen.GenauigkeitFromStr(s) then begin
+ aufraeumen;
+ exit;
+ end;
+ if (Genauigkeit < Vorlagen.Genauigkeit) then
+ Genauigkeit:=Vorlagen.Genauigkeit;
+ continue;
+ end;
+ if startetMit('Gamma:',s) then begin
+ Vorlagen.Gamma:=exprtofloat(false,s);
+ continue;
+ end;
+ if startetMit('tmin:',s) then begin
+ Vorlagen.tstart:=exprtofloat(false,s);
+ continue;
+ end;
+ if startetMit('tmax:',s) then begin
+ Vorlagen.tstop:=exprtofloat(false,s);
+ continue;
+ end;
+ if startetMit('xmin:',s) then begin
+ Vorlagen.xstart:=exprtofloat(false,s);
+ continue;
+ end;
+ if startetMit('xmax:',s) then begin
+ Vorlagen.xstop:=exprtofloat(false,s);
+ continue;
+ end;
+ if startetMit('Inputparameterdatei:',s) then begin
+ if (not mitGewalt) and (not fileexists(extractfilepath(s)+'times-1')) and
((Vorlagen.Fehlerbehebungskommando='') or
- (sysutils.ExecuteProcess(Vorlagen.Fehlerbehebungsprogramm,Vorlagen.Fehlerbehebungsparameter,[])<>0) or
- not fileexists(extractfilepath(s)+'times-1')) then begin
- gibAus('Die Simulation in '''+extractfilepath(s)+''' ist nicht abgeschlossen!',3);
- aufraeumen;
- exit;
- end;
- assignfile(g,s);
- reset(g);
- erfolg:=0;
- while not eof(g) do begin
- readln(g,s);
- s:=erstesArgument(s,'#');
- if startetMit('Gamma :',s) then begin
- Vorlagen.Gamma:=strtofloat(s);
- erfolg:=erfolg or 1;
- continue;
- end;
- if startetMit('Beta :',s) then begin
- be:=strtofloat(s);
- erfolg:=erfolg or 2;
- continue;
- end;
- if startetMit('n_el_over_nc :',s) then begin
- ne:=strtofloat(s);
- erfolg:=erfolg or 4;
- continue;
- end;
- if startetMit('.a0 :',s) then begin
- if strtofloat(s)>maxAmp then begin
- maxAmp:=strtofloat(s);
- erfolg:=erfolg or 8;
- end;
- continue;
- end;
- if startetMit('pulse component # ',s) then begin
- erfolg:=erfolg and (not 8);
- continue;
- end;
- if odd(erfolg shr 3) and startetMit('.frequency :',s) then begin
- Vorlagen.groeszenFaktor:=strtofloat(s);
- erfolg:=erfolg and (not 8);
- continue;
- end;
- end;
- close(g);
- if erfolg<>7 then begin
- gibAus('Die Inputparameterdatei enthält die gesuchten Parameter nicht!',3);
- aufraeumen;
- exit;
- end;
- ne:=sqrt(ne)/Vorlagen.groeszenFaktor;
- if (sWerte.params.np<>0) and (ne<>sWerte.params.np) then begin
- gibAus('Die Plasmafrequenzen in den Eingangsdateien unterscheiden sich ('+floattostr(sWerte.params.np)+' vs. '+floattostr(ne)+')!',3);
- aufraeumen;
- exit;
- end;
- sWerte.params.np:=ne;
- if (sWerte.params.beta<>-1) and (be<>sWerte.params.beta) then begin
- gibAus('Die Bezugssystemgeschwindigkeiten in den Eingangsdateien unterscheiden sich ('+floattostr(sWerte.params.beta)+' vs. '+floattostr(be)+')!',3);
- aufraeumen;
- exit;
- end;
- sWerte.params.beta:=be;
- continue;
- end;
- if startetMit('Fehlerbehebungskommando:',s) then begin
- Vorlagen.Fehlerbehebungskommando:=s;
- continue;
- end;
- if startetMit('Spurnummer:',s) then begin
- Vorlagen.SpurNummer:=strtoint(s);
- continue;
- end;
- if startetMit('Feldnummer:',s) then begin
- Vorlagen.FeldNummer:=strtoint(s);
- continue;
- end;
- if startetMit('Feld:',s) then begin
- Vorlagen.FeldNummer:=-1;
- for i:=0 to length(FeldgroeszenNamen)-1 do
- if uppercase(s)=FeldgroeszenNamen[i] then begin
- Vorlagen.FeldNummer:=i;
- break;
- end;
- if Vorlagen.FeldNummer>=0 then continue;
- gibAus('Unbekannte Feldgröße '''+s+'''!',3);
- aufraeumen;
- exit;
- end;
- if startetMit('Analysator:',s) then begin
- Vorlagen.Analysator:=s;
- continue;
- end;
- if startetMit('PhaseSpace-Datei:',s) then begin
- if fileexists(s) then begin
- setlength(dateien,length(dateien)+1);
- dateien[length(dateien)-1]:=tPhaseSpaceInputDateiInfo.create(Vorlagen.PhaseSpaceVorlage);
- dateien[length(dateien)-1].Name:=s;
- continue;
- end;
- if not findeAlleDateien(s,dateien,Vorlagen.PhaseSpaceVorlage) then begin
- aufraeumen;
- exit;
- end;
- continue;
- end;
- if startetMit('SpaceTime-Datei:',s) then begin
- if fileexists(s) then begin
- setlength(dateien,length(dateien)+1);
- dateien[length(dateien)-1]:=tSpaceTimeInputDateiInfo.create(Vorlagen.SpaceTimeVorlage);
- dateien[length(dateien)-1].Name:=s;
- continue;
- end;
- if not findeAlleDateien(s,dateien,Vorlagen.SpaceTimeVorlage) then begin
- aufraeumen;
- exit;
- end;
- continue;
- end;
- if startetMit('Trace-Datei:',s) then begin
- if fileexists(s) then begin
- setlength(dateien,length(dateien)+1);
- dateien[length(dateien)-1]:=tTraceInputDateiInfo.create(Vorlagen.TraceVorlage);
- dateien[length(dateien)-1].Name:=s;
- continue;
- end;
- if not findeAlleDateien(s,dateien,Vorlagen.TraceVorlage) then begin
- aufraeumen;
- exit;
- end;
- continue;
- end;
- if startetMit('Pipe:',s) then begin
- setlength(dateien,length(dateien)+1);
- dateien[length(dateien)-1]:=tPipeInputDateiInfo.create(Vorlagen.PipeVorlage);
- dateien[length(dateien)-1].Name:=s;
- continue;
- end;
- gibAus('Verstehe Parameter '''+s+''' nicht beim Einlesen!',3);
- aufraeumen;
- exit;
- until false;
- sWerte.params.refreshKnownValues;
- Vorlagen.free;
- result:=true;
+ (sysutils.ExecuteProcess(Vorlagen.Fehlerbehebungsprogramm,Vorlagen.Fehlerbehebungsparameter,[])<>0) or
+ not fileexists(extractfilepath(s)+'times-1')) then begin
+ gibAus('Die Simulation in '''+extractfilepath(s)+''' ist nicht abgeschlossen!',3);
+ aufraeumen;
+ exit;
+ end;
+ assignfile(g,s);
+ reset(g);
+ erfolg:=0;
+ while not eof(g) do begin
+ readln(g,s);
+ s:=erstesArgument(s,'#');
+ if startetMit('Gamma :',s) then begin
+ Vorlagen.Gamma:=strtofloat(s);
+ erfolg:=erfolg or 1;
+ continue;
+ end;
+ if startetMit('Beta :',s) then begin
+ be:=strtofloat(s);
+ erfolg:=erfolg or 2;
+ continue;
+ end;
+ if startetMit('n_el_over_nc :',s) then begin
+ ne:=strtofloat(s);
+ erfolg:=erfolg or 4;
+ continue;
+ end;
+ if startetMit('.a0 :',s) then begin
+ if strtofloat(s)>maxAmp then begin
+ maxAmp:=strtofloat(s);
+ erfolg:=erfolg or 8;
+ end;
+ continue;
+ end;
+ if startetMit('pulse component # ',s) then begin
+ erfolg:=erfolg and (not 8);
+ continue;
+ end;
+ if odd(erfolg shr 3) and startetMit('.frequency :',s) then begin
+ Vorlagen.groeszenFaktor:=strtofloat(s);
+ erfolg:=erfolg and (not 8);
+ continue;
+ end;
+ end;
+ close(g);
+ if erfolg<>7 then begin
+ gibAus('Die Inputparameterdatei enthält die gesuchten Parameter nicht!',3);
+ aufraeumen;
+ exit;
+ end;
+ ne:=sqrt(ne)/Vorlagen.groeszenFaktor;
+ if (sWerte.params.np<>0) and (ne<>sWerte.params.np) then begin
+ gibAus('Die Plasmafrequenzen in den Eingangsdateien unterscheiden sich ('+floattostr(sWerte.params.np)+' vs. '+floattostr(ne)+')!',3);
+ aufraeumen;
+ exit;
+ end;
+ sWerte.params.np:=ne;
+ if (sWerte.params.beta<>-1) and (be<>sWerte.params.beta) then begin
+ gibAus('Die Bezugssystemgeschwindigkeiten in den Eingangsdateien unterscheiden sich ('+floattostr(sWerte.params.beta)+' vs. '+floattostr(be)+')!',3);
+ aufraeumen;
+ exit;
+ end;
+ sWerte.params.beta:=be;
+ continue;
+ end;
+ if startetMit('Fehlerbehebungskommando:',s) then begin
+ Vorlagen.Fehlerbehebungskommando:=s;
+ continue;
+ end;
+ if startetMit('Spurnummer:',s) then begin
+ Vorlagen.SpurNummer:=strtoint(s);
+ continue;
+ end;
+ if startetMit('Feldnummer:',s) then begin
+ Vorlagen.FeldNummer:=strtoint(s);
+ continue;
+ end;
+ if startetMit('Feld:',s) then begin
+ Vorlagen.FeldNummer:=-1;
+ for i:=0 to length(FeldgroeszenNamen)-1 do
+ if uppercase(s)=FeldgroeszenNamen[i] then begin
+ Vorlagen.FeldNummer:=i;
+ break;
+ end;
+ if Vorlagen.FeldNummer>=0 then continue;
+ gibAus('Unbekannte Feldgröße '''+s+'''!',3);
+ aufraeumen;
+ exit;
+ end;
+ if startetMit('Analysator:',s) then begin
+ Vorlagen.Analysator:=s;
+ continue;
+ end;
+ if startetMit('PhaseSpace-Datei:',s) then begin
+ if fileexists(s) then begin
+ setlength(dateien,length(dateien)+1);
+ dateien[length(dateien)-1]:=tPhaseSpaceInputDateiInfo.create(Vorlagen.PhaseSpaceVorlage);
+ dateien[length(dateien)-1].Name:=s;
+ continue;
+ end;
+ if not findeAlleDateien(s,dateien,Vorlagen.PhaseSpaceVorlage) then begin
+ aufraeumen;
+ exit;
+ end;
+ continue;
+ end;
+ if startetMit('SpaceTime-Datei:',s) then begin
+ if fileexists(s) then begin
+ setlength(dateien,length(dateien)+1);
+ dateien[length(dateien)-1]:=tSpaceTimeInputDateiInfo.create(Vorlagen.SpaceTimeVorlage);
+ dateien[length(dateien)-1].Name:=s;
+ continue;
+ end;
+ if not findeAlleDateien(s,dateien,Vorlagen.SpaceTimeVorlage) then begin
+ aufraeumen;
+ exit;
+ end;
+ continue;
+ end;
+ if startetMit('Trace-Datei:',s) then begin
+ if fileexists(s) then begin
+ setlength(dateien,length(dateien)+1);
+ dateien[length(dateien)-1]:=tTraceInputDateiInfo.create(Vorlagen.TraceVorlage);
+ dateien[length(dateien)-1].Name:=s;
+ continue;
+ end;
+ if not findeAlleDateien(s,dateien,Vorlagen.TraceVorlage) then begin
+ aufraeumen;
+ exit;
+ end;
+ continue;
+ end;
+ if startetMit('Pipe:',s) then begin
+ setlength(dateien,length(dateien)+1);
+ dateien[length(dateien)-1]:=tPipeInputDateiInfo.create(Vorlagen.PipeVorlage);
+ dateien[length(dateien)-1].Name:=s;
+ continue;
+ end;
+ gibAus('Verstehe Parameter '''+s+''' nicht beim Einlesen!',3);
+ aufraeumen;
+ exit;
+ until false;
+ sWerte.params.refreshKnownValues;
+ Vorlagen.free;
+ result:=true;
end;
function tWerte.ermittleInterneInputParameter(var Dateien: tGenerischeInputDateiInfoArray): boolean;
// Parameter ermitteln, die aus der einzulesenden Datei hervorgehen
-var i,j,k,num,tmpi,br,SpAnz: longint;
- tmps: single;
- tmpd: double;
- tmpe: extended;
- f: file;
- Positionen: tLongintArray;
- Sortiert: tGenerischeInputDateiInfoArray;
- ipp,ipap: tProcess;
- buf: array of byte;
- s,t: string;
-begin
- result:=false;
- if length(Dateien)=0 then begin
- gibAus('Keine Dateien zum Einlesen!',3);
- exit;
- end;
-
- genauigkeit:=gSingle;
- for i:=0 to length(dateien)-1 do
- genauigkeit:=tGenauigkeit(max(genauigkeit,dateien[i].genauigkeit));
- tmpi:=0;
- num:=0;
- tmps:=0;
- tmpd:=0;
- SpAnz:=-1;
- setlength(Positionen,length(dateien));
- for i:=0 to length(Positionen)-1 do
- Positionen[i]:=-1;
- for i:=0 to length(dateien)-1 do begin
- if dateien[i] is tPipeInputDateiInfo then begin
- ipp:=tProcess.create(nil); // dieser Prozess generiert die Daten
- ipp.Executable:=(dateien[i] as tPipeInputDateiInfo).Executable;
- ipp.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).ParametersText;
- ipp.Options:=ipp.Options + [poUsePipes];
- ipap:=tProcess.create(nil); // dieser Prozess analysiert die Daten
- ipap.Executable:=(dateien[i] as tPipeInputDateiInfo).AnalysatorExecutable;
- ipap.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).AnalysatorParametersText;
- ipap.Options:=ipp.Options + [poUsePipes];
- ipp.execute;
- ipap.execute;
- s:='';
- br:=0;
- while (ipp.running or (ipp.Output.NumBytesAvailable > 0)) and ipap.running do begin
- if ipap.Output.NumBytesAvailable>0 then begin
- setlength(s,br+ipap.Output.NumBytesAvailable);
- br:=br+ipap.Output.Read(s[br+1],length(s)-br);
- continue;
- end;
- if ipp.Output.NumBytesAvailable > 0 then begin
- setlength(buf,ipp.Output.NumBytesAvailable);
- setlength(buf,ipp.Output.Read(buf[0],length(buf)));
- j:=0;
- k:=-1;
- while (j<length(buf)) and (k<>0) do begin
- k:=ipap.Input.Write(buf[j],length(buf)-j);
- j:=j+k;
- end;
- sleep(100); // SEHR DRECKIG !!!
- continue;
- end;
- sleep(10);
- end;
-
- if not ipap.running then
- ipp.CloseOutput;
- if not ipp.running then
- ipap.CloseInput;
-
- setlength(buf,0);
-
- while ipap.running or (ipap.Output.NumBytesAvailable>0) do begin
- setlength(s,br+ipap.Output.NumBytesAvailable);
- br:=br+ipap.Output.Read(s[br+1],length(s)-br);
- if ipap.running then
- sleep(10);
- end;
-
- if not ipp.waitOnExit then begin
- gibAus('ErmittleInterneInputParameter hat ohne Erfolg auf Ende von ipp gewartet!',3);
- exit;
- end;
- if not ipap.waitOnExit then begin
- gibAus('ErmittleInterneInputParameter hat ohne Erfolg auf Ende von ipap gewartet!',3);
- exit;
- end;
-
- ipp.free;
- ipap.free;
-
- dateien[i].groeszenFaktor:=1;
-
- s:=s+#10;
- while (pos(#13,s)>0) or (pos(#10,s)>0) do begin
- t:=copy(s,1,max(pos(#13,s),pos(#10,s))-1);
- if pos(#13,t)>0 then t:=copy(t,1,pos(#13,t)-1);
- if pos(#10,t)>0 then t:=copy(t,1,pos(#10,t)-1);
- delete(s,1,length(t)+1);
- t:=trim(t);
- if startetMit('Channels',t) and startetMit(':',t) then begin
- dateien[i].xsteps:=strtoint(t);
- continue;
- end;
- if startetMit('Sample Rate',t) and startetMit(':',t) then begin
- dateien[i].groeszenFaktor:=dateien[i].groeszenFaktor/strtofloat(t);
- continue;
- end;
- if startetMit('Precision',t) and startetMit(':',t) then begin
- if rightStr(t,4)<>'-bit' then begin
- gibAus('Ich verstehe die Genauigkeitsangabe '''+t+''' nicht bei einer Pipe!',3);
- exit;
- end;
- delete(t,length(t)-3,4);
- (dateien[i] as tPipeInputDateiInfo).bytesPerSample:=ceil(strtofloat(trim(t))/8);
- continue;
- end;
- if startetMit('Duration',t) and startetMit(':',t) then begin
- erstesArgument(t,'=');
- t:=erstesArgument(t);
- dateien[i].tsiz:=strtoint(t);
- dateien[i].groeszenFaktor:=dateien[i].groeszenFaktor*dateien[i].tsiz;
- continue;
- end;
- if startetMit('Sample Encoding',t) and startetMit(':',t) then begin
- if t='32-bit Signed Integer PCM' then begin
- (dateien[i] as tPipeInputDateiInfo).Kodierung:=k32BitSignedInteger;
- continue;
- end;
- gibAus('Ich kenne die Kodierung '''+t+''' nicht bei einer Pipe!',3);
- exit;
- end;
- end;
- num:=0;
- repeat
- k:=-1;
- for j:=0 to i-1 do
- if Positionen[j]=num then begin
- inc(k);
- inc(num);
- end;
- until k=-1;
- Positionen[i]:=num;
- end;
- if (dateien[i] is tSpaceTimeInputDateiInfo) or
+var
+ i,j,k,num,tmpi,br,SpAnz: longint;
+ tmps: single;
+ tmpd: double;
+ tmpe: extended;
+ f: file;
+ Positionen: tLongintArray;
+ Sortiert: tGenerischeInputDateiInfoArray;
+ ipp,ipap: tProcess;
+ buf: array of byte;
+ s,t: string;
+begin
+ result:=false;
+ if length(Dateien)=0 then begin
+ gibAus('Keine Dateien zum Einlesen!',3);
+ exit;
+ end;
+
+ genauigkeit:=gSingle;
+ for i:=0 to length(dateien)-1 do
+ genauigkeit:=tGenauigkeit(max(genauigkeit,dateien[i].genauigkeit));
+ tmpi:=0;
+ num:=0;
+ tmps:=0;
+ tmpd:=0;
+ SpAnz:=-1;
+ setlength(Positionen,length(dateien));
+ for i:=0 to length(Positionen)-1 do
+ Positionen[i]:=-1;
+ for i:=0 to length(dateien)-1 do begin
+ if dateien[i] is tPipeInputDateiInfo then begin
+ ipp:=tProcess.create(nil); // dieser Prozess generiert die Daten
+ ipp.Executable:=(dateien[i] as tPipeInputDateiInfo).Executable;
+ ipp.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).ParametersText;
+ ipp.Options:=ipp.Options + [poUsePipes];
+ ipap:=tProcess.create(nil); // dieser Prozess analysiert die Daten
+ ipap.Executable:=(dateien[i] as tPipeInputDateiInfo).AnalysatorExecutable;
+ ipap.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).AnalysatorParametersText;
+ ipap.Options:=ipp.Options + [poUsePipes];
+ ipp.execute;
+ ipap.execute;
+ s:='';
+ br:=0;
+ while (ipp.running or (ipp.Output.NumBytesAvailable > 0)) and ipap.running do begin
+ if ipap.Output.NumBytesAvailable>0 then begin
+ setlength(s,br+ipap.Output.NumBytesAvailable);
+ br:=br+ipap.Output.Read(s[br+1],length(s)-br);
+ continue;
+ end;
+ if ipp.Output.NumBytesAvailable > 0 then begin
+ setlength(buf,ipp.Output.NumBytesAvailable);
+ setlength(buf,ipp.Output.Read(buf[0],length(buf)));
+ j:=0;
+ k:=-1;
+ while (j<length(buf)) and (k<>0) do begin
+ k:=ipap.Input.Write(buf[j],length(buf)-j);
+ j:=j+k;
+ end;
+ sleep(100); // SEHR DRECKIG !!!
+ continue;
+ end;
+ sleep(10);
+ end;
+
+ if not ipap.running then
+ ipp.CloseOutput;
+ if not ipp.running then
+ ipap.CloseInput;
+
+ setlength(buf,0);
+
+ while ipap.running or (ipap.Output.NumBytesAvailable>0) do begin
+ setlength(s,br+ipap.Output.NumBytesAvailable);
+ br:=br+ipap.Output.Read(s[br+1],length(s)-br);
+ if ipap.running then
+ sleep(10);
+ end;
+
+ if not ipp.waitOnExit then begin
+ gibAus('ErmittleInterneInputParameter hat ohne Erfolg auf Ende von ipp gewartet!',3);
+ exit;
+ end;
+ if not ipap.waitOnExit then begin
+ gibAus('ErmittleInterneInputParameter hat ohne Erfolg auf Ende von ipap gewartet!',3);
+ exit;
+ end;
+
+ ipp.free;
+ ipap.free;
+
+ dateien[i].groeszenFaktor:=1;
+
+ s:=s+#10;
+ while (pos(#13,s)>0) or (pos(#10,s)>0) do begin
+ t:=copy(s,1,max(pos(#13,s),pos(#10,s))-1);
+ if pos(#13,t)>0 then t:=copy(t,1,pos(#13,t)-1);
+ if pos(#10,t)>0 then t:=copy(t,1,pos(#10,t)-1);
+ delete(s,1,length(t)+1);
+ t:=trim(t);
+ if startetMit('Channels',t) and startetMit(':',t) then begin
+ dateien[i].xsteps:=strtoint(t);
+ continue;
+ end;
+ if startetMit('Sample Rate',t) and startetMit(':',t) then begin
+ dateien[i].groeszenFaktor:=dateien[i].groeszenFaktor/strtofloat(t);
+ continue;
+ end;
+ if startetMit('Precision',t) and startetMit(':',t) then begin
+ if rightStr(t,4)<>'-bit' then begin
+ gibAus('Ich verstehe die Genauigkeitsangabe '''+t+''' nicht bei einer Pipe!',3);
+ exit;
+ end;
+ delete(t,length(t)-3,4);
+ (dateien[i] as tPipeInputDateiInfo).bytesPerSample:=ceil(strtofloat(trim(t))/8);
+ continue;
+ end;
+ if startetMit('Duration',t) and startetMit(':',t) then begin
+ erstesArgument(t,'=');
+ t:=erstesArgument(t);
+ dateien[i].tsiz:=strtoint(t);
+ dateien[i].groeszenFaktor:=dateien[i].groeszenFaktor*dateien[i].tsiz;
+ continue;
+ end;
+ if startetMit('Sample Encoding',t) and startetMit(':',t) then begin
+ if t='32-bit Signed Integer PCM' then begin
+ (dateien[i] as tPipeInputDateiInfo).Kodierung:=k32BitSignedInteger;
+ continue;
+ end;
+ gibAus('Ich kenne die Kodierung '''+t+''' nicht bei einer Pipe!',3);
+ exit;
+ end;
+ end;
+ num:=0;
+ repeat
+ k:=-1;
+ for j:=0 to i-1 do
+ if Positionen[j]=num then begin
+ inc(k);
+ inc(num);
+ end;
+ until k=-1;
+ Positionen[i]:=num;
+ end;
+ if (dateien[i] is tSpaceTimeInputDateiInfo) or
(dateien[i] is tTraceInputDateiInfo) then begin
- assign(f,dateien[i].Name);
- reset(f,1);
- blockread(f,num,sizeof(longint));
- dec(num);
- if dateien[i] is tTraceInputDateiInfo then begin
- dateien[i].xsteps:=1;
- dateien[i].xstop:=dateien[i].xstart;
- blockread(f,tmpi,sizeof(longint));
- if spAnz<0 then spAnz:=tmpi;
- if spAnz<>tmpi then begin
- gibAus('Falsche Anzahl an Spuren ('+inttostr(tmpi)+' statt '+inttostr(spAnz)+') in Datei '''+dateien[i].Name+'''!',3);
- close(f);
- exit;
- end;
- if ((dateien[i] as TTraceInputDateiInfo).Spurnummer<0) or ((dateien[i] as TTraceInputDateiInfo).Spurnummer>=spAnz) then begin
- gibAus('Ausgewählte Spurnummer ('+inttostr((dateien[i] as TTraceInputDateiInfo).Spurnummer)+') liegt außerhalb des verfügbaren Bereiches (0..'+inttostr(spAnz-1)+')!',3);
- close(f);
- exit;
- end;
- if ((dateien[i] as TTraceInputDateiInfo).Feldnummer<0) or ((dateien[i] as TTraceInputDateiInfo).Feldnummer>=length(FeldgroeszenNamen)) then begin
- gibAus('Ausgewählte Feldnummer ('+inttostr((dateien[i] as TTraceInputDateiInfo).Feldnummer)+') liegt außerhalb des verfügbaren Bereiches (0..'+inttostr(length(FeldgroeszenNamen)-1)+')!',3);
- close(f);
- exit;
- end;
- end;
- blockread(f,tmpi,sizeof(longint));
- dateien[i].tsiz:=tmpi;
- if dateien[i] is tSpaceTimeInputDateiInfo then begin
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- 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;
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- 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;
- blockread(f,tmpi,sizeof(longint));
- dateien[i].xsteps:=tmpi;
- end;
- close(f);
- for j:=0 to i-1 do
- if Positionen[j]=num then begin
- gibAus('Datei '''+dateien[i].Name+''' ist redundant zu '''+dateien[j].Name+'''.',3);
- exit;
- end;
- Positionen[i]:=num;
- end;
- if dateien[i] is tPhaseSpaceInputDateiInfo then begin
- if (i<>0) or (length(dateien)<>1) then begin
- gibAus('Ich kann Phasenraumdateien nicht kaskadieren!',3);
- close(f);
- exit;
- end;
- assign(f,dateien[i].Name);
- reset(f,1);
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- Transformationen.tstart:=tmpe;
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- Transformationen.tstop:=tmpe;
- blockread(f,tmpi,sizeof(longint));
- dateien[i].tsiz:=tmpi;
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- Transformationen.xstart:=tmpe;
- case dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single));
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double));
- tmpe:=tmpd;
- end;
- gExtended: blockread(f,tmpe,sizeof(extended));
- end{of case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- Transformationen.xstop:=tmpe;
- blockread(f,tmpi,sizeof(longint));
- dateien[i].xsteps:=tmpi;
- close(f);
- Positionen[i]:=0;
- end;
- end;
-
- _tsiz:=0;
- _xsteps:=dateien[0].xsteps;
- for i:=0 to length(dateien)-1 do begin
- if dateien[i].xsteps<>_xsteps then begin
- gibAus('Falsche Anzahl an x-Werten in '''+dateien[i].Name+''', nämlich '+inttostr(dateien[i].xsteps)+' statt '+inttostr(_xsteps)+'.',3);
- exit;
- end;
- _tsiz:=_tsiz+dateien[i].tsiz;
- if dateien[i].groeszenFaktor<>dateien[0].groeszenFaktor then begin
- gibAus('Die Dateien haben nicht alle den gleichen Größenfaktor!',3);
- exit;
- end;
- end;
-
- if not (dateien[0] is tPhaseSpaceInputDateiInfo) then begin
- Transformationen.tstart:=Positionen[0]*dateien[0].groeszenFaktor;
- Transformationen.tstop:=(Positionen[0]+1)*dateien[0].groeszenFaktor;
- for i:=1 to length(Positionen)-1 do begin
- 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(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(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
- dateien[i].t0abs:=0;
- sWerte.params.tsiz_:=dateien[i].tmax-dateien[i].tmin+1;
- sWerte.params.xsteps_:=dateien[i].xmax-dateien[i].xmin+1;
- end
- else begin
- dateien[i].t0abs:=
- dateien[i-1].t0abs + dateien[i-1].tsiz;
- sWerte.params.tsiz_:=
- sWerte.params.tsiz_ + dateien[i].tmax-dateien[i].tmin+1;
- if sWerte.params.xsteps_<>dateien[i].xmax-dateien[i].xmin+1 then begin
- gibAus('Die Dateien haben unterschiedliche Anzahlen an x-Werten im ausgewählten Bereich!',3);
- exit;
- end;
- end;
- end;
- end;
-
- sWerte.params.refreshKnownValues;
- result:=true;
-end;
-
-procedure tWerte.initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tTransformationen; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
-var i,j: longint;
- vits: array[boolean] of tVerzerrInitThread;
- b: boolean;
-begin
- if mt<=1 then 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
- for j:=xMin to xMax do begin
- 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']:=
- ZGs[j+i*quelle._xsteps]['x'] - ZPs[j+i*quelle._xsteps]['x'];
- ZGs[j+i*quelle._xsteps]['y']:=
- ZGs[j+i*quelle._xsteps]['y'] - ZPs[j+i*quelle._xsteps]['y'];
- ZPs[j+i*quelle._xsteps]['x']:=ZPs[j+i*quelle._xsteps]['x'] - x0Abs; // Zielpositionen um die Nullposition verschieben
- ZPs[j+i*quelle._xsteps]['y']:=ZPs[j+i*quelle._xsteps]['y'] - t0Abs;
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + ZPs[j+i*quelle._xsteps]['y']*_xsteps]:=
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + ZPs[j+i*quelle._xsteps]['y']*_xsteps] + (1-ZGs[j+i*quelle._xsteps]['x'])*(1-ZGs[j+i*quelle._xsteps]['y']);
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + 1 + ZPs[j+i*quelle._xsteps]['y']*_xsteps]:=
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + 1 + ZPs[j+i*quelle._xsteps]['y']*_xsteps] + ZGs[j+i*quelle._xsteps]['x']*(1-ZGs[j+i*quelle._xsteps]['y']);
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + (ZPs[j+i*quelle._xsteps]['y'] + 1)*_xsteps]:=
- ZAs[ZPs[j+i*quelle._xsteps]['x'] + (ZPs[j+i*quelle._xsteps]['y'] + 1)*_xsteps] + (1-ZGs[j+i*quelle._xsteps]['x'])*ZGs[j+i*quelle._xsteps]['y'];
- 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
- else begin
- for b:=false to true do
- vits[b]:=
- tVerzerrInitThread.create(
- quelle,
- self,
- byte(not b)*xMin + byte(b)*((xMax+xMin) div 2 + 1),
- byte(not b)*((xMax+xMin) div 2) + byte(b)*xMax,
- tMin,
- tMax,
- x0Abs,
- t0Abs,
- mt div 2 + byte(odd(mt) and b),
- epsilon,
- verzerrung,
- ZPs,
- ZGs,
- Warn);
- while not (vits[false].fertig and vits[true].fertig) do
- sleep(10);
- for i:=0 to length(ZAs)-1 do
- ZAs[i]:=
- vits[false].ZAs[i] +
- vits[true].ZAs[i];
- for b:=false to true do
- vits[b].free;
- end;
- if oberst then
- for i:=0 to length(ZAs)-1 do
- if ZAs[i]<epsilon then begin
- if Warn=wsStreng then
- gibAus('Warnung: Erhöhe Divisor ['+inttostr(i)+':'+inttostr(i mod _xsteps)+','+inttostr(i div _xsteps)+'] von '+floattostr(ZAs[i])+' auf epsilon='+floattostr(epsilon)+'.',1);
- ZAs[i]:=epsilon;
- end;
+ assign(f,dateien[i].Name);
+ reset(f,1);
+ blockread(f,num,sizeof(longint));
+ dec(num);
+ if dateien[i] is tTraceInputDateiInfo then begin
+ dateien[i].xsteps:=1;
+ dateien[i].xstop:=dateien[i].xstart;
+ blockread(f,tmpi,sizeof(longint));
+ if spAnz<0 then spAnz:=tmpi;
+ if spAnz<>tmpi then begin
+ gibAus('Falsche Anzahl an Spuren ('+inttostr(tmpi)+' statt '+inttostr(spAnz)+') in Datei '''+dateien[i].Name+'''!',3);
+ close(f);
+ exit;
+ end;
+ if ((dateien[i] as TTraceInputDateiInfo).Spurnummer<0) or ((dateien[i] as TTraceInputDateiInfo).Spurnummer>=spAnz) then begin
+ gibAus('Ausgewählte Spurnummer ('+inttostr((dateien[i] as TTraceInputDateiInfo).Spurnummer)+') liegt außerhalb des verfügbaren Bereiches (0..'+inttostr(spAnz-1)+')!',3);
+ close(f);
+ exit;
+ end;
+ if ((dateien[i] as TTraceInputDateiInfo).Feldnummer<0) or ((dateien[i] as TTraceInputDateiInfo).Feldnummer>=length(FeldgroeszenNamen)) then begin
+ gibAus('Ausgewählte Feldnummer ('+inttostr((dateien[i] as TTraceInputDateiInfo).Feldnummer)+') liegt außerhalb des verfügbaren Bereiches (0..'+inttostr(length(FeldgroeszenNamen)-1)+')!',3);
+ close(f);
+ exit;
+ end;
+ end;
+ blockread(f,tmpi,sizeof(longint));
+ dateien[i].tsiz:=tmpi;
+ if dateien[i] is tSpaceTimeInputDateiInfo then begin
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ 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;
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ 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;
+ blockread(f,tmpi,sizeof(longint));
+ dateien[i].xsteps:=tmpi;
+ end;
+ close(f);
+ for j:=0 to i-1 do
+ if Positionen[j]=num then begin
+ gibAus('Datei '''+dateien[i].Name+''' ist redundant zu '''+dateien[j].Name+'''.',3);
+ exit;
+ end;
+ Positionen[i]:=num;
+ end;
+ if dateien[i] is tPhaseSpaceInputDateiInfo then begin
+ if (i<>0) or (length(dateien)<>1) then begin
+ gibAus('Ich kann Phasenraumdateien nicht kaskadieren!',3);
+ close(f);
+ exit;
+ end;
+ assign(f,dateien[i].Name);
+ reset(f,1);
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ Transformationen.tstart:=tmpe;
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ Transformationen.tstop:=tmpe;
+ blockread(f,tmpi,sizeof(longint));
+ dateien[i].tsiz:=tmpi;
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ Transformationen.xstart:=tmpe;
+ case dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single));
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double));
+ tmpe:=tmpd;
+ end;
+ gExtended: blockread(f,tmpe,sizeof(extended));
+ end{of case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ Transformationen.xstop:=tmpe;
+ blockread(f,tmpi,sizeof(longint));
+ dateien[i].xsteps:=tmpi;
+ close(f);
+ Positionen[i]:=0;
+ end;
+ end;
+
+ _tsiz:=0;
+ _xsteps:=dateien[0].xsteps;
+ for i:=0 to length(dateien)-1 do begin
+ if dateien[i].xsteps<>_xsteps then begin
+ gibAus('Falsche Anzahl an x-Werten in '''+dateien[i].Name+''', nämlich '+inttostr(dateien[i].xsteps)+' statt '+inttostr(_xsteps)+'.',3);
+ exit;
+ end;
+ _tsiz:=_tsiz+dateien[i].tsiz;
+ if dateien[i].groeszenFaktor<>dateien[0].groeszenFaktor then begin
+ gibAus('Die Dateien haben nicht alle den gleichen Größenfaktor!',3);
+ exit;
+ end;
+ end;
+
+ if not (dateien[0] is tPhaseSpaceInputDateiInfo) then begin
+ Transformationen.tstart:=Positionen[0]*dateien[0].groeszenFaktor;
+ Transformationen.tstop:=(Positionen[0]+1)*dateien[0].groeszenFaktor;
+ for i:=1 to length(Positionen)-1 do begin
+ 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(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(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
+ dateien[i].t0abs:=0;
+ sWerte.params.tsiz_:=dateien[i].tmax-dateien[i].tmin+1;
+ sWerte.params.xsteps_:=dateien[i].xmax-dateien[i].xmin+1;
+ end
+ else begin
+ dateien[i].t0abs:=
+ dateien[i-1].t0abs + dateien[i-1].tsiz;
+ sWerte.params.tsiz_:=
+ sWerte.params.tsiz_ + dateien[i].tmax-dateien[i].tmin+1;
+ if sWerte.params.xsteps_<>dateien[i].xmax-dateien[i].xmin+1 then begin
+ gibAus('Die Dateien haben unterschiedliche Anzahlen an x-Werten im ausgewählten Bereich!',3);
+ exit;
+ end;
+ end;
+ end;
+ end;
+
+ sWerte.params.refreshKnownValues;
+ result:=true;
+end;
+
+procedure tWerte.initVerzerrung(quelle: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,mt: longint; oberst: boolean; epsilon: extended; verzerrung: tTransformation; verzerrAnzahl: longint; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; Warn: tWarnstufe);
+var
+ i,j: longint;
+ vits: array[boolean] of tVerzerrInitThread;
+ b: boolean;
+begin
+ if mt<=1 then 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
+ for j:=xMin to xMax do begin
+ ZGs[j+i*quelle._xsteps]:=verzerrung.transformiereKoordinaten(j,i,verzerrAnzahl-1);
+ 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']:=
+ ZGs[j+i*quelle._xsteps]['x'] - ZPs[j+i*quelle._xsteps]['x'];
+ ZGs[j+i*quelle._xsteps]['y']:=
+ ZGs[j+i*quelle._xsteps]['y'] - ZPs[j+i*quelle._xsteps]['y'];
+ ZPs[j+i*quelle._xsteps]['x']:=ZPs[j+i*quelle._xsteps]['x'] - x0Abs; // Zielpositionen um die Nullposition verschieben
+ ZPs[j+i*quelle._xsteps]['y']:=ZPs[j+i*quelle._xsteps]['y'] - t0Abs;
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + ZPs[j+i*quelle._xsteps]['y']*_xsteps]:=
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + ZPs[j+i*quelle._xsteps]['y']*_xsteps] + (1-ZGs[j+i*quelle._xsteps]['x'])*(1-ZGs[j+i*quelle._xsteps]['y']);
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + 1 + ZPs[j+i*quelle._xsteps]['y']*_xsteps]:=
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + 1 + ZPs[j+i*quelle._xsteps]['y']*_xsteps] + ZGs[j+i*quelle._xsteps]['x']*(1-ZGs[j+i*quelle._xsteps]['y']);
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + (ZPs[j+i*quelle._xsteps]['y'] + 1)*_xsteps]:=
+ ZAs[ZPs[j+i*quelle._xsteps]['x'] + (ZPs[j+i*quelle._xsteps]['y'] + 1)*_xsteps] + (1-ZGs[j+i*quelle._xsteps]['x'])*ZGs[j+i*quelle._xsteps]['y'];
+ 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
+ else begin
+ for b:=false to true do
+ vits[b]:=
+ tVerzerrInitThread.create(
+ quelle,
+ self,
+ byte(not b)*xMin + byte(b)*((xMax+xMin) div 2 + 1),
+ byte(not b)*((xMax+xMin) div 2) + byte(b)*xMax,
+ tMin,
+ tMax,
+ x0Abs,
+ t0Abs,
+ mt div 2 + byte(odd(mt) and b),
+ epsilon,
+ verzerrung,
+ verzerrAnzahl,
+ ZPs,
+ ZGs,
+ Warn);
+ while not (vits[false].fertig and vits[true].fertig) do
+ sleep(10);
+ for i:=0 to length(ZAs)-1 do
+ ZAs[i]:=
+ vits[false].ZAs[i] +
+ vits[true].ZAs[i];
+ for b:=false to true do
+ vits[b].free;
+ end;
+ if oberst then
+ for i:=0 to length(ZAs)-1 do
+ if ZAs[i]<epsilon then begin
+ if Warn=wsStreng then
+ gibAus('Warnung: Erhöhe Divisor ['+inttostr(i)+':'+inttostr(i mod _xsteps)+','+inttostr(i div _xsteps)+'] von '+floattostr(ZAs[i])+' auf epsilon='+floattostr(epsilon)+'.',1);
+ ZAs[i]:=epsilon;
+ end;
end;
function tWerte.xscale: extended;
begin
- if Transformationen.xstop=Transformationen.xstart then result:=1
- else result:=(Transformationen.xstop-Transformationen.xstart)/(Transformationen.xsteps-1);
+ if Transformationen.xstop=Transformationen.xstart then result:=1
+ else result:=(Transformationen.xstop-Transformationen.xstart)/(Transformationen.xsteps-1);
end;
function tWerte.tscale: extended;
begin
- if Transformationen.tstop=Transformationen.tstart then result:=1
- else result:=(Transformationen.tstop-Transformationen.tstart)/(Transformationen.tsiz-1);
+ if Transformationen.tstop=Transformationen.tstart then result:=1
+ else result:=(Transformationen.tstop-Transformationen.tstart)/(Transformationen.tsiz-1);
end;
function tWerte.dichtenParameterErkannt(st: boolean; s: string; threads,xmin,xmax,tmin,tmax: longint): boolean;
begin
- result:=true;
- if startetMit('maximale und minimale Dichten bestimmen',s) then begin
- ermittleMinMaxDichten(st,threads,xmin,xmax,tmin,tmax,s='(symmetrisch)');
- exit;
- end;
- if startetMit('Minimaldichte:',s) then begin
- _minW:=exprtofloat(st,s);
- exit;
- end;
- if startetMit('Maximaldichte:',s) then begin
- _maxW:=exprtofloat(st,s);
- exit;
- end;
- result:=false;
+ result:=true;
+ if startetMit('maximale und minimale Dichten bestimmen',s) then begin
+ ermittleMinMaxDichten(st,threads,xmin,xmax,tmin,tmax,s='(symmetrisch)');
+ exit;
+ end;
+ if startetMit('Minimaldichte:',s) then begin
+ _minW:=exprtofloat(st,s);
+ exit;
+ end;
+ if startetMit('Maximaldichte:',s) then begin
+ _maxW:=exprtofloat(st,s);
+ exit;
+ end;
+ 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;
+ 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;
+ 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;
+ 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;
+ 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;
procedure tWerte.schreibeWertIntegriert(var f: textfile; i: longint; hor: boolean);
begin
- case Genauigkeit of
- gSingle:
- sWerte.schreibeWertIntegriert(f,i,hor);
- gDouble:
- dWerte.schreibeWertIntegriert(f,i,hor);
- gExtended:
- eWerte.schreibeWertIntegriert(f,i,hor);
- end{of case};
+ case Genauigkeit of
+ gSingle:
+ sWerte.schreibeWertIntegriert(f,i,hor);
+ gDouble:
+ dWerte.schreibeWertIntegriert(f,i,hor);
+ gExtended:
+ eWerte.schreibeWertIntegriert(f,i,hor);
+ end{of case};
end;
function tWerte.ladeDateien(st: boolean; var f: tMyStringlist; pl,sa: boolean): boolean;
-var inputs: tGenerischeInputDateiInfoArray;
+var
+ inputs: tGenerischeInputDateiInfoArray;
procedure aufraeumen;
-var ii: longint;
-begin
- for ii:=0 to length(inputs)-1 do
- if assigned(inputs[ii]) then
- inputs[ii].free;
- setlength(inputs,0);
-end;
-
-begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- Transformationen.clear;
- Genauigkeit:=gSingle;
- if not ermittleExterneInputParameter(f,inputs) then begin
- aufraeumen;
- exit;
- end;
- if not ermittleInterneInputParameter(inputs) then begin
- aufraeumen;
- exit;
- end;
- if not st then begin
- case Genauigkeit of
- gSingle:
- sWerte.holeRam(3*byte(sa));
- gDouble:
- dWerte.holeRam(3*byte(sa));
- gExtended:
- eWerte.holeRam(3*byte(sa));
- end{of case};
- if pl then begin
- leseThread:=tLeseThread.create(self,inputs);
- result:=true;
- end
- else
- case Genauigkeit of
- gSingle:
- result:=sWerte.liesDateien(inputs);
- gDouble:
- result:=dWerte.liesDateien(inputs);
- gExtended:
- result:=eWerte.liesDateien(inputs);
- end{of case};
- end
- else
- result:=true;
- Transformationen.xsteps:=_xsteps;
- Transformationen.tsiz:=_tsiz;
+var
+ ii: longint;
+begin
+ for ii:=0 to length(inputs)-1 do
+ if assigned(inputs[ii]) then
+ inputs[ii].free;
+ setlength(inputs,0);
+end;
+
+begin
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+ Transformationen:=tKeineTransformation.create;
+ Genauigkeit:=gSingle;
+ if not ermittleExterneInputParameter(f,inputs) then begin
+ aufraeumen;
+ exit;
+ end;
+ if not ermittleInterneInputParameter(inputs) then begin
+ aufraeumen;
+ exit;
+ end;
+ if not st then begin
+ case Genauigkeit of
+ gSingle:
+ sWerte.holeRam(3*byte(sa));
+ gDouble:
+ dWerte.holeRam(3*byte(sa));
+ gExtended:
+ eWerte.holeRam(3*byte(sa));
+ end{of case};
+ if pl then begin
+ leseThread:=tLeseThread.create(self,inputs);
+ result:=true;
+ end
+ else
+ case Genauigkeit of
+ gSingle:
+ result:=sWerte.liesDateien(inputs);
+ gDouble:
+ result:=dWerte.liesDateien(inputs);
+ gExtended:
+ result:=eWerte.liesDateien(inputs);
+ end{of case};
+ end
+ else
+ result:=true;
+ Transformationen.xsteps:=_xsteps;
+ Transformationen.tsiz:=_tsiz;
end;
function tWerte.ladeAscii(st: boolean; datei: string): boolean;
-var i,j,k: integer;
- Zeit: extended;
- g: textfile;
- s,t: string;
+var
+ i,j,k: integer;
+ Zeit: extended;
+ g: textfile;
+ s,t: string;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
Genauigkeit:=gExtended;
_tsiz:=-100;
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+
+ Transformationen:=tKeineTransformation.create;
+
Transformationen.tstart:=-100;
Transformationen.tstop:=-100;
_xsteps:=-100;
@@ -1607,13 +1648,13 @@ begin
exit;
end;
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
+ (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;
@@ -1667,7 +1708,6 @@ begin
inc(k);
end;
end;
- Transformationen.clear;
Transformationen.xsteps:=_xsteps;
Transformationen.tsiz:=_tsiz;
gibAus('... fertig '+timetostr(now-Zeit),3);
@@ -1675,12 +1715,13 @@ begin
end;
function tWerte.berechneLiKo(st: boolean; var f: tMyStringlist; threads: longint): boolean;
-var i,xmin,xmax,tmin,tmax: longint;
- liKo: tLiKo;
- s: string;
- fertig: boolean;
- liKoThreads: array of tLiKoThread;
- Zeit: extended;
+var
+ i,xmin,xmax,tmin,tmax: longint;
+ liKo: tLiKo;
+ s: string;
+ fertig: boolean;
+ liKoThreads: array of tLiKoThread;
+ Zeit: extended;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
@@ -1720,13 +1761,11 @@ begin
liKo[length(liKo)-1].werte:=wertes^[i mod (length(wertes^)-1)];
if _xsteps=0 then begin
_xsteps:=liKo[length(liKo)-1].werte._xsteps;
- 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;
- Transformationen.kopiereVon(liKo[length(liKo)-1].werte.Transformationen);
tmin:=0;
tmax:=_tsiz-1;
end;
@@ -1766,7 +1805,10 @@ begin
end;
_xsteps:=xmax-xmin+1;
_tsiz:=tmax-tmin+1;
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
+ Transformationen:=tUeberlagerung.create;
+ for i:=0 to length(liKo)-1 do
+ (Transformationen as tUeberlagerung).addKomponente(liKo[i].werte.Transformationen);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,xmin,xmax,tmin,tmax);
_np:=liKo[0].werte._np;
_beta:=liKo[0].werte._beta;
if st then begin
@@ -1808,9 +1850,13 @@ begin
Genauigkeit:=gExtended;
_xsteps:=0;
_tsiz:=0;
+ xmin:=-1;
+ xmax:=-1;
+ tmin:=-1;
+ tmax:=-1;
Zeit:=now;
- schritt:=1;
- horizontal:=true;
+ schritt:=-1;
+ horizontal:=false;
repeat
if not f.metaReadln(s,true) then begin
gibAus('Unerwartetes Dateiende!',3);
@@ -1850,17 +1896,9 @@ begin
if i<0 then
exit;
quellen[length(quellen)-1]:=wertes^[i];
- if _xsteps=0 then begin
- _xsteps:=quellen[length(quellen)-1]._xsteps;
- Transformationen.kopiereVon(quellen[length(quellen)-1].Transformationen);
- xmin:=0;
- xmax:=_xsteps-1;
- end;
- if _tsiz=0 then begin
- _tsiz:=quellen[length(quellen)-1]._tsiz;
- Transformationen.kopiereVon(quellen[length(quellen)-1].Transformationen);
- tmin:=0;
- tmax:=_tsiz-1;
+ if length(quellen)=1 then begin
+ _xsteps:=quellen[0]._xsteps;
+ _tsiz:=quellen[0]._tsiz;
end;
if _xsteps<>quellen[length(quellen)-1]._xsteps then begin
gibAus('Unterschiedliche Anzahl an x-Schritten: '+inttostr(_xsteps)+' bisher vs. '+inttostr(quellen[length(quellen)-1]._xsteps)+' bei '+inttostr(i)+'!',3);
@@ -1893,16 +1931,36 @@ begin
exit;
end;
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
- _xsteps:=xmax-xmin+1;
- _tsiz:=tmax-tmin+1;
-
- if horizontal then
- _xsteps:=_xsteps*length(quellen)
- else
- _tsiz:=_tsiz*length(quellen);
- if not Transformationen.addAgglomeration(horizontal,Schritt,length(quellen))
- then exit;
+ if xmin<0 then
+ xmin:=0;
+ if xmax<0 then
+ xmax:=quellen[0]._xsteps-1;
+ if tmin<0 then
+ tmin:=0;
+ if tmax<0 then
+ tmax:=quellen[0]._tsiz-1;
+
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+ Transformationen:=tAgglomeration.create;
+ (Transformationen as tAgglomeration).horizontal:=horizontal;
+ (Transformationen as tAgglomeration).schritt:=schritt;
+ for i:=0 to length(quellen)-1 do
+ (Transformationen as tAgglomeration).addKomponente(
+ tKoordinatenAusschnitt.create(
+ quellen[i].Transformationen,
+ xmin,xmax,tmin,tmax)
+ );
+
+ _xsteps:=Transformationen.xsteps;
+ _tsiz:=Transformationen.tsiz;
+
+ _minW:=quellen[0]._minW;
+ _maxW:=quellen[0]._maxW;
+ for i:=1 to length(quellen)-1 do begin
+ _minW:=min(_minW,quellen[i]._minW);
+ _maxW:=max(_maxW,quellen[i]._maxW);
+ end;
_np:=quellen[0]._np;
_beta:=quellen[0]._beta;
@@ -1922,8 +1980,8 @@ begin
pSi,
xmin,xmax,
tmin,tmax,
- i*byte(horizontal),
- i*byte(not horizontal)
+ (1+xmax-xmin)*i*byte(horizontal),
+ (1+tmax-tmin)*i*byte(not horizontal)
);
end;
gDouble: begin
@@ -1932,8 +1990,8 @@ begin
pDo,
xmin,xmax,
tmin,tmax,
- i*byte(horizontal),
- i*byte(not horizontal)
+ (1+xmax-xmin)*i*byte(horizontal),
+ (1+tmax-tmin)*i*byte(not horizontal)
);
end;
gExtended: begin
@@ -1942,8 +2000,8 @@ begin
pEx,
xmin,xmax,
tmin,tmax,
- i*byte(horizontal),
- i*byte(not horizontal)
+ (1+xmax-xmin)*i*byte(horizontal),
+ (1+tmax-tmin)*i*byte(not horizontal)
);
end;
end;
@@ -1953,16 +2011,21 @@ begin
end;
function tWerte.berechneQuotient(st: boolean; var f: tMyStringlist; threads, dividend, divisor: longint): boolean;
-var i,xmin,xmax,tmin,tmax: longint;
- s: string;
- fertig: boolean;
- quotientThreads: array of tQuotientThread;
- Zeit,epsilon: extended;
+var
+ i,xmin,xmax,tmin,tmax: longint;
+ s: string;
+ fertig: boolean;
+ quotientThreads: array of tQuotientThread;
+ Zeit,epsilon: extended;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
Zeit:=now;
- Transformationen.kopiereVon(wertes^[dividend].Transformationen);
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+ Transformationen:=tUeberlagerung.create;
+ (Transformationen as tUeberlagerung).addKomponente(wertes^[dividend].Transformationen);
+ (Transformationen as tUeberlagerung).addKomponente(wertes^[divisor].Transformationen);
_xsteps:=wertes^[dividend]._xsteps;
xmin:=0;
xmax:=_xsteps-1;
@@ -2006,16 +2069,16 @@ begin
_xsteps:=xmax-xmin+1;
_tsiz:=tmax-tmin+1;
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
+ (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;
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,xmin,xmax,tmin,tmax);
_np:=wertes^[dividend]._np;
_beta:=wertes^[dividend]._beta;
Genauigkeit:=gExtended;
@@ -2042,20 +2105,25 @@ begin
end;
function tWerte.berechneProdukt(st: boolean; var f: tMyStringlist; threads, faktor1, faktor2: longint): boolean;
-var i,xmin,xmax,tmin,tmax: longint;
- s: string;
- fertig: boolean;
- produktThreads: array of tProduktThread;
- Zeit: extended;
+var
+ i,xmin,xmax,tmin,tmax: longint;
+ s: string;
+ fertig: boolean;
+ produktThreads: array of tProduktThread;
+ Zeit: extended;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
Zeit:=now;
- Transformationen.kopiereVon(wertes^[faktor1].Transformationen);
- _xsteps:=wertes^[faktor1]._xsteps;
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+ Transformationen:=tUeberlagerung.create;
+ (Transformationen as tUeberlagerung).addKomponente(wertes^[faktor1].Transformationen);
+ (Transformationen as tUeberlagerung).addKomponente(wertes^[faktor2].Transformationen);
+ _xsteps:=Transformationen.xsteps;
xmin:=0;
xmax:=_xsteps-1;
- _tsiz:=wertes^[faktor1]._tsiz;
+ _tsiz:=Transformationen.tsiz;
tmin:=0;
tmax:=_tsiz-1;
_np:=wertes^[faktor1]._np;
@@ -2090,15 +2158,15 @@ begin
_xsteps:=xmax-xmin+1;
_tsiz:=tmax-tmin+1;
if (wertes^[faktor1].Transformationen.xstart<>wertes^[faktor2].Transformationen.xstart) or
- (wertes^[faktor1].Transformationen.xstop<>wertes^[faktor2].Transformationen.xstop) or
- (wertes^[faktor1].Transformationen.tstart<>wertes^[faktor2].Transformationen.tstart) or
- (wertes^[faktor1].Transformationen.tstop<>wertes^[faktor2].Transformationen.tstop) or
- (wertes^[faktor1]._xsteps<>wertes^[faktor2]._xsteps) or
- (wertes^[faktor1]._tsiz<>wertes^[faktor2]._tsiz) then begin
+ (wertes^[faktor1].Transformationen.xstop<>wertes^[faktor2].Transformationen.xstop) or
+ (wertes^[faktor1].Transformationen.tstart<>wertes^[faktor2].Transformationen.tstart) or
+ (wertes^[faktor1].Transformationen.tstop<>wertes^[faktor2].Transformationen.tstop) or
+ (wertes^[faktor1]._xsteps<>wertes^[faktor2]._xsteps) or
+ (wertes^[faktor1]._tsiz<>wertes^[faktor2]._tsiz) then begin
gibAus('Faktor1 und Faktor2 haben verschiedene Abmessungen, sowas verstehe ich nicht!',3);
exit;
end;
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,xmin,xmax,tmin,tmax);
_np:=wertes^[faktor1]._np;
_beta:=wertes^[faktor1]._beta;
Genauigkeit:=gExtended;
@@ -2125,16 +2193,17 @@ begin
end;
function tWerte.berechneKorrelation(st: boolean; var f: tMyStringlist; threads: longint; const quelle: tWerte): boolean;
-var i,xmin,xmax,tmin,tmax: longint;
- s: string;
- wavelet: tWavelet;
- fertig: boolean;
- ausrichtung: word; // 0 = zentriert, 1 = anfangsbündig, 2 = endbündig
- korrelThreads: array of tKorrelThread;
- Zeit,pvFehler: extended;
- pSi: pTLLWerteSingle;
- pDo: pTLLWerteDouble;
- pEx: pTLLWerteExtended;
+var
+ i,xmin,xmax,tmin,tmax: longint;
+ s: string;
+ wavelet: tWavelet;
+ fertig: boolean;
+ ausrichtung: word; // 0 = zentriert, 1 = anfangsbündig, 2 = endbündig
+ korrelThreads: array of tKorrelThread;
+ Zeit,pvFehler: extended;
+ pSi: pTLLWerteSingle;
+ pDo: pTLLWerteDouble;
+ pEx: pTLLWerteExtended;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
@@ -2142,7 +2211,9 @@ begin
wavelet:=tWavelet.create;
wavelet.mitFFT:=false;
Zeit:=now;
- Transformationen.kopiereVon(quelle.Transformationen);
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+ Transformationen:=quelle.Transformationen;
wavelet.freq:=0;
wavelet.tfwhm:=1;
wavelet.typ:=wtSin2;
@@ -2215,7 +2286,7 @@ begin
exit;
until false;
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,xmin,xmax,tmin,tmax);
_xsteps:=xmax-xmin+1;
if wavelet.mitFFT then begin
i:=1;
@@ -2300,100 +2371,103 @@ begin
end;
procedure tWerte.ermittleMinMaxDichten(st: boolean; threads,xmin,xmax,tmin,tmax: longint; symmetrisch: boolean);
-var i,j: longint;
- DTs: array of tDichteThread;
- fertig: boolean;
- Zeit: extended;
-begin
- if st then begin
- if _minW>=_maxW then _maxW:=_minW+1;
- exit;
- end;
- warteaufBeendigungDesLeseThreads;
- Zeit:=now;
- setlength(DTs,min(threads,xmax+1-xmin));
- gibAus('Ermittle maximale und minimale Dichten ...',3);
- j:=xmin;
- 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;
- repeat
- sleep(10);
- fertig:=true;
- for i:=0 to length(DTs)-1 do
- fertig:=fertig and DTs[i].fertig;
- until fertig;
- gibAus('Alle Dichtethreads beendet!',1);
- _maxW:=DTs[0].maxDichte;
- _minW:=DTs[0].minDichte;
- 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;
- gibAus('... sie sind '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
- if symmetrisch then begin
- _minW:=min(_minW,-_maxW);
- _maxW:=max(_maxW,-_minW);
- gibAus('Jetzt sind sie '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
- end;
+var
+ i,j: longint;
+ DTs: array of tDichteThread;
+ fertig: boolean;
+ Zeit: extended;
+begin
+ if st then begin
+ if _minW>=_maxW then _maxW:=_minW+1;
+ exit;
+ end;
+ warteaufBeendigungDesLeseThreads;
+ Zeit:=now;
+ setlength(DTs,min(threads,xmax+1-xmin));
+ gibAus('Ermittle maximale und minimale Dichten ...',3);
+ j:=xmin;
+ 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;
+ repeat
+ sleep(10);
+ fertig:=true;
+ for i:=0 to length(DTs)-1 do
+ fertig:=fertig and DTs[i].fertig;
+ until fertig;
+ gibAus('Alle Dichtethreads beendet!',1);
+ _maxW:=DTs[0].maxDichte;
+ _minW:=DTs[0].minDichte;
+ 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;
+ gibAus('... sie sind '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
+ if symmetrisch then begin
+ _minW:=min(_minW,-_maxW);
+ _maxW:=max(_maxW,-_minW);
+ gibAus('Jetzt sind sie '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
+ end;
end;
procedure tWerte.gleicheMinMaxDichtenAn(st: boolean; var f: tMyStringlist; symmetrisch: boolean);
-var i: longint;
- s: string;
- Zeit: extended;
- vgWs: array of tWerte;
-begin
- setlength(vgWs,0);
-
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende!',3);
- exit;
- end;
- if s='Ende' then break;
- setlength(vgWs,length(vgWs)+1);
- vgWs[length(vgWs)-1]:=wertes^[findeWerte(s,nil,wertes,Konturen,false)];
- until false;
-
- if st then begin
- if _minW>=_maxW then _maxW:=_minW+1;
- exit;
- end;
- warteaufBeendigungDesLeseThreads;
- for i:=0 to length(vgWs)-1 do
- vgWs[i].warteAufBeendigungDesLeseThreads;
- Zeit:=now;
- gibAus('Gleiche maximale und minimale Dichten an ...',3);
-
- for i:=0 to length(vgWs)-1 do begin
- _minW:=min(_minW,vgWs[i]._minw);
- _maxW:=max(_maxW,vgWs[i]._maxw);
- end;
-
- if symmetrisch then begin
- _minW:=min(_minW,-_maxW);
- _maxW:=max(_maxW,-_minW);
- end;
-
- for i:=0 to length(vgWs)-1 do begin
- vgWs[i]._minw:=_minW;
- vgWs[i]._maxw:=_maxW;
- end;
-
- gibAus('... sie sind '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
- if symmetrisch then begin
- _minW:=min(_minW,-_maxW);
- _maxW:=max(_maxW,-_minW);
- gibAus('Jetzt sind sie '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
- end;
+var
+ i: longint;
+ s: string;
+ Zeit: extended;
+ vgWs: array of tWerte;
+begin
+ setlength(vgWs,0);
+
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende!',3);
+ exit;
+ end;
+ if s='Ende' then break;
+ setlength(vgWs,length(vgWs)+1);
+ vgWs[length(vgWs)-1]:=wertes^[findeWerte(s,nil,wertes,Konturen,false)];
+ until false;
+
+ if st then begin
+ if _minW>=_maxW then _maxW:=_minW+1;
+ exit;
+ end;
+ warteaufBeendigungDesLeseThreads;
+ for i:=0 to length(vgWs)-1 do
+ vgWs[i].warteAufBeendigungDesLeseThreads;
+ Zeit:=now;
+ gibAus('Gleiche maximale und minimale Dichten an ...',3);
+
+ for i:=0 to length(vgWs)-1 do begin
+ _minW:=min(_minW,vgWs[i]._minw);
+ _maxW:=max(_maxW,vgWs[i]._maxw);
+ end;
+
+ if symmetrisch then begin
+ _minW:=min(_minW,-_maxW);
+ _maxW:=max(_maxW,-_minW);
+ end;
+
+ for i:=0 to length(vgWs)-1 do begin
+ vgWs[i]._minw:=_minW;
+ vgWs[i]._maxw:=_maxW;
+ end;
+
+ gibAus('... sie sind '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
+ if symmetrisch then begin
+ _minW:=min(_minW,-_maxW);
+ _maxW:=max(_maxW,-_minW);
+ gibAus('Jetzt sind sie '+myfloattostr(_minW)+' und '+myfloattostr(_maxW)+'. '+timetostr(now-Zeit),3);
+ end;
end;
function tWerte.fft(threads: longint; senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fen: tFenster; out pvFehler: extended; Warn: tWarnstufe): boolean;
-var len: longint;
+var
+ len: longint;
begin
len:=1;
if senkrecht then begin
@@ -2409,9 +2483,10 @@ begin
end;
function tWerte.fft(threads,xmin,xmax,tmin,tmax: longint; senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fen: tFenster; out pvFehler: extended; Warn: tWarnstufe): boolean;
-var fftThreads: array of tFFTThread;
- i: longint;
- fertig: boolean;
+var
+ fftThreads: array of tFFTThread;
+ i: longint;
+ fertig: boolean;
begin
result:=false;
if senkrecht then begin
@@ -2477,10 +2552,11 @@ begin
end;
function tWerte.berechneZeitfrequenzanalyse(st: boolean; var f: tMyStringlist; threads: longint; const quelle: tWerte; Warn: tWarnstufe): boolean;
-var i,j,tmin,tmax,tOf,Schritt: longint;
- Zeit,pvFehler,freqMax: extended;
- Fenster: tFenster;
- s: string;
+var
+ i,j,tmin,tmax,tOf,Schritt: longint;
+ Zeit,pvFehler,freqMax: extended;
+ Fenster: tFenster;
+ s: string;
begin
result:=false;
if (not st) and (quelle._xsteps<>1) and (quelle._tsiz<>1) then begin
@@ -2489,14 +2565,16 @@ begin
end;
warteaufBeendigungDesLeseThreads;
Zeit:=now;
- transformationen.clear;
Fenster.Breite:=0;
Fenster.aktiv:=false;
Fenster.Rand:=0;
Schritt:=round(sqrt(quelle._tsiz));
tmin:=0;
tmax:=quelle._tsiz-1;
- freqMax:=quelle._tsiz/(quelle.Transformationen.tstop-quelle.Transformationen.tstart);
+ if (quelle._xsteps=1) then
+ freqMax:=quelle._tsiz/(quelle.Transformationen.tstop-quelle.Transformationen.tstart)
+ else
+ freqMax:=quelle._xsteps/(quelle.Transformationen.xstop-quelle.Transformationen.xstart);
Genauigkeit:=gExtended;
repeat
if not f.metaReadln(s,true) then begin
@@ -2561,6 +2639,23 @@ begin
floattostrtrunc(disk2kontFak('t',tmax-tmin+1),2,true)+')',3);
exit;
end;
+
+ if not Transformationen.hatNachfolger then
+ Transformationen.free;
+
+ Transformationen:=tAgglomeration.create;
+
+ if quelle._tsiz<>1 then begin
+ for i:=0 to _xsteps-1 do
+ (Transformationen as tAgglomeration).addKomponente(quelle.Transformationen);
+ (Transformationen as tAgglomeration).schritt:=(quelle.disk2kont('t',tmax)-quelle.disk2kont('t',tmin))*(1+1/(tmax-tmin));
+ end
+ else begin
+ for i:=0 to _tsiz-1 do
+ (Transformationen as tAgglomeration).addKomponente(quelle.Transformationen);
+ (Transformationen as tAgglomeration).schritt:=(quelle.disk2kont('x',tmax)-quelle.disk2kont('x',tmin))*(1+1/(tmax-tmin));
+ end;
+(*
Transformationen.xsteps:=_xsteps;
Transformationen.tsiz:=_tsiz;
if quelle._tsiz<>1 then begin
@@ -2575,6 +2670,7 @@ begin
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
tOf:=(_tsiz-Fenster.Breite) div 2;
eWerte.holeRam(3);
@@ -2611,14 +2707,14 @@ begin
end;
gibAus(' (Parseval-Fehler = '+floattostr(pvFehler)+')',3);
end;
- Transformationen.addFFT(false,true);
+ Transformationen:=tFFTTransformation.create(Transformationen,false,true);
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);
end;
- Transformationen.addAusschnitt(0,_xsteps-1,0,_tsiz-1);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,0,_xsteps-1,0,_tsiz-1);
if not st then
eWerte.holeRAM(0);
gibAus('... fertig '+timetostr(now-Zeit),3);
@@ -2626,137 +2722,158 @@ begin
end;
function tWerte.berechneVerzerrung(st: boolean; var f: tMyStringlist; threads: longint; const quelle: tWerte; Warn: tWarnstufe): boolean;
-var i,j: longint;
- grenzen: t2x2Longint;
- ZPs: tIntPointArray; // Zielpositionen
- ZGs: tExtPointArray; // Zielgewichte
- ZAs: tExtendedArray; // Anzahl Quellen, die auf entsprechende Zielposition abgebildet werden
- Zeit,epsilon: extended;
- Vorbearbeitung,
- Nachbearbeitung,
- verzerrung: tTransformationen;
- s: string;
- verzerrThreads: array of tVerzerrThread;
- fertig: boolean;
+var
+ i,j: longint;
+ grenzen: t2x2Longint;
+ ZPs: tIntPointArray; // Zielpositionen
+ ZGs: tExtPointArray; // Zielgewichte
+ ZAs: tExtendedArray; // Anzahl Quellen, die auf entsprechende Zielposition abgebildet werden
+ Zeit,epsilon: extended;
+ Vorbearbeitung,
+ Nachbearbeitung,
+ verzerrung,tmp: tTransformation;
+ vorAnz,nachAnz,verAnz: longint;
+ s: string;
+ verzerrThreads: array of tVerzerrThread;
+ fertig,
+ bearbeitungenLoeschen: boolean;
procedure aufraeumen;
-var ii: longint;
-begin
- for ii:=0 to length(verzerrThreads)-1 do
- if assigned(verzerrThreads[ii]) then
- verzerrThreads[ii].free;
- setlength(verzerrThreads,0);
- Vorbearbeitung.free;
- Nachbearbeitung.free;
- verzerrung.free;
- setlength(ZPs,0);
- setlength(ZGs,0);
- setlength(ZAs,0);
-end;
-begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- gibAus('Verzerrung berechnen ... ',3);
- Zeit:=now;
- verzerrung:=tTransformationen.create;
- verzerrung.xsteps:=quelle._xsteps;
- verzerrung.tsiz:=quelle._tsiz;
- epsilon:=1e-9;
- Genauigkeit:=gExtended;
- Vorbearbeitung:=tTransformationen.create;
- Nachbearbeitung:=tTransformationen.create;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende!',3);
- aufraeumen;
- exit;
- end;
- if s='Ende' then break;
- if quelle.dichtenParameterErkannt(st,s,threads,0,_xsteps-1,0,_tsiz-1) then continue;
- if startetMit('Threadanzahl:',s) then begin
- threads:=strtoint(s);
- continue;
- end;
- if startetMit('Epsilon:',s) then begin
- epsilon:=exprtofloat(st,s);
- continue;
- end;
- if startetMit('Abbildung:',s) then begin
- if not verzerrung.add(st,s,quelle.xscale,quelle.tscale,@(exprtofloat)) then begin
- gibAus('Syntaxfehler in der Funktion '''+s+'''!',3);
- aufraeumen;
- exit;
- end;
- if not st then 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))+' -> '+
- tExtPointToStr(verzerrung.transformiereKoordinaten(i*(quelle._xsteps-1),j*(quelle._tsiz-1))),3);
- end;
- continue;
- end;
- if startetMit('Nachbearbeitung:',s) then begin
- if not Nachbearbeitung.add(st,s,f,@exprtofloat) then begin
- aufraeumen;
- exit;
- end;
- continue;
- end;
- if startetMit('Vorbearbeitung:',s) then begin
- if not Vorbearbeitung.add(st,s,f,@exprtofloat) then begin
- aufraeumen;
- exit;
- end;
- continue;
- end;
- gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer Verzerrung!',3);
- aufraeumen;
- exit;
- until false;
- Transformationen.kopiereVon(quelle.Transformationen);
- Transformationen.append(Vorbearbeitung);
- Transformationen.append(Verzerrung);
- Transformationen.append(Nachbearbeitung);
- if not st then begin
- gibAus('... Zielausdehnung berechnen ... ',3);
- verzerrung.berechneZielausdehnung(grenzen);
- _xsteps:=grenzen['x','y']-grenzen['x','x']+2;
- _tsiz:=grenzen['y','y']-grenzen['y','x']+2;
- if (_xsteps<=1) or (_tsiz<=1) then begin
- gibAus('Es passt kein Rechteck des Ziels vollständig in die Quelldaten!',3);
- aufraeumen;
- exit;
- end;
- eWerte.holeRam(3);
- gibAus('Positionen und Gewichte initialisieren ...',3);
- setlength(ZPs,quelle._xsteps*quelle._tsiz);
- setlength(ZGs,quelle._xsteps*quelle._tsiz);
- setlength(ZAs,_xsteps*_tsiz);
- initVerzerrung(quelle,0,quelle._xsteps-1,0,quelle._tsiz-1,grenzen['x','x'],grenzen['y','x'],threads,true,epsilon,verzerrung,ZPs,ZGs,ZAs,Warn);
- gibAus('... fertig, Threads starten',3);
- setlength(verzerrThreads,threads);
- for i:=0 to length(verzerrThreads)-1 do
- verzerrThreads[i]:=tVerzerrThread.create(quelle,self,round(i/length(verzerrThreads)*_xsteps),round((i+1)/length(verzerrThreads)*_xsteps-1),0,_tsiz-1,ZPs,ZGs,ZAs,Vorbearbeitung,Nachbearbeitung);
- repeat
- fertig:=true;
- for i:=0 to length(verzerrThreads)-1 do
- fertig:=fertig and verzerrThreads[i].fertig;
- if not fertig then sleep(10);
- until fertig;
- end;
- aufraeumen;
- gibAus('... fertig '+timetostr(now-Zeit),3);
- result:=true;
+var
+ ii: longint;
+begin
+ for ii:=0 to length(verzerrThreads)-1 do
+ if assigned(verzerrThreads[ii]) then
+ verzerrThreads[ii].free;
+ setlength(verzerrThreads,0);
+ if bearbeitungenLoeschen then begin
+ if assigned(Vorbearbeitung) then
+ Vorbearbeitung.freeAll;
+ if assigned(Nachbearbeitung) then
+ Nachbearbeitung.freeAll;
+ if assigned(Verzerrung) then
+ verzerrung.freeAll;
+ end;
+ setlength(ZPs,0);
+ setlength(ZGs,0);
+ setlength(ZAs,0);
+end;
+begin
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ gibAus('Verzerrung berechnen ... ',3);
+ Zeit:=now;
+ bearbeitungenLoeschen:=true;
+ verzerrung:=tKeineTransformation.create;
+ verAnz:=0;
+ epsilon:=1e-9;
+ Genauigkeit:=gExtended;
+ Vorbearbeitung:=tKeineTransformation.create;
+ vorAnz:=0;
+ Nachbearbeitung:=tKeineTransformation.create;
+ nachAnz:=0;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende!',3);
+ aufraeumen;
+ exit;
+ end;
+ if s='Ende' then break;
+ if quelle.dichtenParameterErkannt(st,s,threads,0,_xsteps-1,0,_tsiz-1) then continue;
+ if startetMit('Threadanzahl:',s) then begin
+ threads:=strtoint(s);
+ continue;
+ end;
+ if startetMit('Epsilon:',s) then begin
+ epsilon:=exprtofloat(st,s);
+ continue;
+ end;
+ if startetMit('Abbildung:',s) then begin
+ tmp:=tKonkreteKoordinatenTransformation.create;
+ if assigned(verzerrung) then
+ tmp.fuegeVorgaengerHinzu(verzerrung);
+ verzerrung:=tmp;
+ if not (verzerrung as tKonkreteKoordinatenTransformation).initAbbildung(st,s,quelle.xscale,quelle.tscale,@exprtofloat) then begin
+ gibAus('Syntaxfehler in der Funktion '''+s+'''!',3);
+ aufraeumen;
+ exit;
+ end;
+ inc(verAnz);
+ if not st then begin
+ gibAus(verzerrung.dumpParams(verAnz),3);
+ for i:=0 to 1 do
+ for j:=0 to 1 do
+ gibAus(
+ inttostr(i*(quelle._xsteps-1))+';'+inttostr(j*(quelle._tsiz-1))+' -> '+
+ tExtPointToStr(verzerrung.transformiereKoordinaten(i*(quelle._xsteps-1),j*(quelle._tsiz-1),verAnz-1)),3);
+ end;
+ continue;
+ end;
+ if startetMit('Nachbearbeitung:',s) then begin
+ if not liesTWerteTransformationen(st,s,f,@exprtofloat,Nachbearbeitung) then begin
+ aufraeumen;
+ exit;
+ end;
+ inc(nachAnz);
+ continue;
+ end;
+ if startetMit('Vorbearbeitung:',s) then begin
+ if not liesTWerteTransformationen(st,s,f,@exprtofloat,Vorbearbeitung) then begin
+ aufraeumen;
+ exit;
+ end;
+ inc(vorAnz);
+ continue;
+ end;
+ gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer Verzerrung!',3);
+ aufraeumen;
+ exit;
+ until false;
+ Transformationen:=quelle.Transformationen;
+ Vorbearbeitung.ersetzeAnfangDurch(Transformationen);
+ Verzerrung.ersetzeAnfangDurch(Vorbearbeitung);
+ Nachbearbeitung.ersetzeAnfangDurch(verzerrung);
+ bearbeitungenLoeschen:=false;
+
+ if not st then begin
+ gibAus('... Zielausdehnung berechnen ... ',3);
+ grenzen:=(verzerrung as tKonkreteKoordinatenTransformation).zielausdehnung;
+ _xsteps:=grenzen['x','y']-grenzen['x','x']+2;
+ _tsiz:=grenzen['y','y']-grenzen['y','x']+2;
+ if (_xsteps<=1) or (_tsiz<=1) then begin
+ gibAus('Es passt kein Rechteck des Ziels vollständig in die Quelldaten!',3);
+ aufraeumen;
+ exit;
+ end;
+ eWerte.holeRam(3);
+ gibAus('Positionen und Gewichte initialisieren ...',3);
+ setlength(ZPs,quelle._xsteps*quelle._tsiz);
+ setlength(ZGs,quelle._xsteps*quelle._tsiz);
+ setlength(ZAs,_xsteps*_tsiz);
+ initVerzerrung(quelle,0,quelle._xsteps-1,0,quelle._tsiz-1,grenzen['x','x'],grenzen['y','x'],threads,true,epsilon,verzerrung,verAnz,ZPs,ZGs,ZAs,Warn);
+ gibAus('... fertig, Threads starten',3);
+ setlength(verzerrThreads,threads);
+ for i:=0 to length(verzerrThreads)-1 do
+ verzerrThreads[i]:=tVerzerrThread.create(quelle,self,round(i/length(verzerrThreads)*_xsteps),round((i+1)/length(verzerrThreads)*_xsteps-1),0,_tsiz-1,ZPs,ZGs,ZAs,Vorbearbeitung,Nachbearbeitung,vorAnz,nachAnz);
+ repeat
+ fertig:=true;
+ for i:=0 to length(verzerrThreads)-1 do
+ fertig:=fertig and verzerrThreads[i].fertig;
+ if not fertig then sleep(10);
+ until fertig;
+ end;
+ aufraeumen;
+ gibAus('... fertig '+timetostr(now-Zeit),3);
+ result:=true;
end;
function tWerte.berechneIntegral(st: boolean; var f: tMyStringlist; threads: longint; const quelle: tWerte): boolean;
-var i,tmin,tmax,xmin,xmax: longint;
- Zeit: extended;
- s: string;
- rtg: tIntegrationsRichtung;
- intThreads: array of tIntegralThread;
- fertig: boolean;
+var
+ i,tmin,tmax,xmin,xmax: longint;
+ Zeit: extended;
+ s: string;
+ rtg: tIntegrationsRichtung;
+ intThreads: array of tIntegralThread;
+ fertig: boolean;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
@@ -2816,8 +2933,7 @@ begin
tmax:=min(quelle._tsiz-1,tmax);
xmin:=max(0,xmin);
xmax:=min(quelle._xsteps-1,xmax);
- Transformationen.kopiereVon(quelle.Transformationen);
- Transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
+ Transformationen:=tKoordinatenAusschnitt.create(quelle.Transformationen,xmin,xmax,tmin,tmax);
if not st then begin
_tsiz:=tmax-tmin+1;
_xsteps:=xmax-xmin+1;
@@ -2853,12 +2969,13 @@ begin
end;
function tWerte.berechneFFT(st: boolean; var f: tMyStringlist; threads: longint; Warn: tWarnstufe): boolean;
-var i: longint;
- Zeit,pvFehler: extended;
- NB: tFFTDatenordnung;
- Fenster: tFenster;
- senkrecht: boolean;
- s: string;
+var
+ i: longint;
+ Zeit,pvFehler: extended;
+ NB: tFFTDatenordnung;
+ Fenster: tFenster;
+ senkrecht: boolean;
+ s: string;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
@@ -2912,7 +3029,7 @@ 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);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,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;
@@ -2922,13 +3039,13 @@ 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);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,(_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);
+ Transformationen:=tFFTTransformation.create(Transformationen,not senkrecht,senkrecht);
if not st then begin
eWerte.holeRam(0);
gibAus('... fertig! '+timetostr(now-Zeit),3);
@@ -2937,12 +3054,13 @@ begin
end;
function tWerte.berechneFFT2d(st: boolean; var f: tMyStringlist; threads: longint; Warn: tWarnstufe): boolean;
-var i,k: longint;
- Zeit,pvFehler: extended;
- NB,preOrd: tFFTDatenordnung;
- Fensters: array[boolean] of tFenster;
- s: string;
- b,spiegeln: boolean;
+var
+ i,k: longint;
+ Zeit,pvFehler: extended;
+ NB,preOrd: tFFTDatenordnung;
+ Fensters: array[boolean] of tFenster;
+ s: string;
+ b,spiegeln: boolean;
begin
result:=false;
warteaufBeendigungDesLeseThreads;
@@ -2994,7 +3112,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);
- Transformationen.addAusschnitt(0,_xsteps-1,(_tsiz-i) div 2,((_tsiz+i) div 2) - 1);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,0,_xsteps-1,(_tsiz-i) div 2,((_tsiz+i) div 2) - 1);
_tsiz:=i;
eWerte.holeRam(0);
end;
@@ -3003,13 +3121,13 @@ begin
i:=i*2;
if _xsteps>i then begin
gibAus('Die Breite wird von '+inttostr(_xsteps)+' auf '+inttostr(i)+' Ortsschritte gekürzt!',3);
- Transformationen.addAusschnitt((_xsteps-i) div 2,((_xsteps+i) div 2) - 1,0,_tsiz-1);
+ Transformationen:=tKoordinatenAusschnitt.create(Transformationen,(_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);
+ Transformationen:=tFFTTransformation.create(Transformationen,true,true);
gibAus('... fertig! '+timetostr(now-Zeit),3);
if spiegeln then begin
gibAus('Werte spiegeln ...',3);
@@ -3052,7 +3170,7 @@ var
xmin,xmax,tmin,tmax,xp,tp: longint;
breite,hoehe,lof,rof,oof,uof: longint;
Paletten: pTPalettenArray;
- Nachbearbeitungen: tTransformationenArray;
+ Nachbearbeitungen: tTransformationArray;
BilderThreads: array of TBilderthread;
fertig,Rahmen: boolean;
img: file;
@@ -3063,10 +3181,11 @@ var
quellen: tWerteArray;
procedure aufraeumen;
-var ii: longint;
+var
+ ii: longint;
begin
for ii:=0 to length(Nachbearbeitungen)-1 do
- Nachbearbeitungen[ii].free;
+ Nachbearbeitungen[ii].freeAll;
setlength(Nachbearbeitungen,0);
for ii:=0 to length(BilderThreads)-1 do
if assigned(BilderThreads[ii]) then
@@ -3082,32 +3201,31 @@ begin
end;
begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- Zeit:=now;
- if not st then
- gibAus('erzeuge lineares Bild aus '+bezeichner+' ...',3);
- datei:='';
- xzoom:=1;
- yzoom:=1;
- xmin:=0;
- xmax:=_xsteps-1;
- tmin:=0;
- tmax:=_tsiz-1;
- schriftgroesze:=24;
- setlength(quellen,1);
- quellen[0]:=self;
- setlength(Nachbearbeitungen,1);
- Nachbearbeitungen[0]:=tTransformationen.create;
- setlength(Paletten,1);
- findePalette(Paletten[0],'Graustufen');
- setlength(Achsen,0);
- setlength(verwKonturen,0);
- setlength(beschriftungen,0);
- setlength(BilderThreads,0);
- Rahmen:=false;
- fontRenderer:=nil;
- repeat
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ Zeit:=now;
+ if not st then gibAus('erzeuge lineares Bild aus '+bezeichner+' ...',3);
+ datei:='';
+ xzoom:=1;
+ yzoom:=1;
+ xmin:=0;
+ xmax:=_xsteps-1;
+ tmin:=0;
+ tmax:=_tsiz-1;
+ schriftgroesze:=24;
+ setlength(quellen,1);
+ quellen[0]:=self;
+ setlength(Nachbearbeitungen,1);
+ Nachbearbeitungen[0]:=nil;
+ setlength(Paletten,1);
+ findePalette(Paletten[0],'Graustufen');
+ setlength(Achsen,0);
+ setlength(verwKonturen,0);
+ setlength(beschriftungen,0);
+ setlength(BilderThreads,0);
+ Rahmen:=false;
+ fontRenderer:=nil;
+ repeat
if not f.metaReadln(s,true) then begin
gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
aufraeumen;
@@ -3178,11 +3296,11 @@ begin
j:=length(nachbearbeitungen);
setlength(nachbearbeitungen,i+1);
while j<length(nachbearbeitungen) do begin
- nachbearbeitungen[j]:=tTransformationen.create;
+ nachbearbeitungen[j]:=nil;
inc(j);
end;
end;
- if not Nachbearbeitungen[i].add(st,s,f,@exprtofloat) then begin
+ if not liesTWerteTransformationen(st,s,f,@exprtofloat,Nachbearbeitungen[i]) then begin
aufraeumen;
exit;
end;
@@ -3261,445 +3379,448 @@ begin
gibAus('Verstehe Option '''+s+''' nicht bei Erzeugung eines linearen Bildes!',3);
aufraeumen;
exit;
- until false;
+ until false;
- if (length(Paletten)<>length(Quellen)) or
+ if (length(Paletten)<>length(Quellen)) or
(length(Nachbearbeitungen)<>length(Quellen)) then begin
- gibAus(
- 'Die Anzahl der Paletten ('+inttostr(length(Paletten))+'), '+
- 'der Daten ('+inttostr(length(Quellen))+') und '+
- 'der Nachbearbeitungen ('+inttostr(length(nachbearbeitungen))+') stimmen nicht überein!',3);
- aufraeumen;
- exit;
- end;
-
- if st then begin
- result:=true;
- aufraeumen;
- exit;
- end;
-
- if _maxW=_minW then begin
- gibAus('Zu geringe Dynamik um Dichten auflösen zu können!',3);
- aufraeumen;
- exit;
- end;
- xmin:=max(xmin,0);
- xmax:=min(xmax,_xsteps-1);
- tmin:=max(tmin,0);
- tmax:=min(tmax,_tsiz-1);
- gibAus('('+inttostr(xmin)+'-'+inttostr(xmax)+'x'+inttostr(tmin)+'-'+inttostr(tmax)+')',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;
-
- if (breite=1) or (hoehe=1) then begin
- gibAus('Keine/kaum Bildpunkte innerhalb der festgelegten Grenzen!',3);
- aufraeumen;
- exit;
- end;
- gibAus(inttostr(breite)+' x '+inttostr(hoehe)+' Pixel',3);
-
- fontRenderer:=tFontRenderer.create(schriftgroesze);
-
- setlength(Beschriftungen,0);
- for i:=0 to length(Achsen)-1 do begin
+ gibAus(
+ 'Die Anzahl der Paletten ('+inttostr(length(Paletten))+'), '+
+ 'der Daten ('+inttostr(length(Quellen))+') und '+
+ 'der Nachbearbeitungen ('+inttostr(length(nachbearbeitungen))+') stimmen nicht überein!',3);
+ aufraeumen;
+ exit;
+ end;
+
+ if st then begin
+ result:=true;
+ aufraeumen;
+ exit;
+ end;
+
+ if _maxW=_minW then begin
+ gibAus('Zu geringe Dynamik um Dichten auflösen zu können!',3);
+ aufraeumen;
+ exit;
+ end;
+ xmin:=max(xmin,0);
+ xmax:=min(xmax,_xsteps-1);
+ tmin:=max(tmin,0);
+ tmax:=min(tmax,_tsiz-1);
+ gibAus('('+inttostr(xmin)+'-'+inttostr(xmax)+'x'+inttostr(tmin)+'-'+inttostr(tmax)+')',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;
+
+ if (breite=1) or (hoehe=1) then begin
+ gibAus('Keine/kaum Bildpunkte innerhalb der festgelegten Grenzen!',3);
+ aufraeumen;
+ exit;
+ end;
+ gibAus(inttostr(breite)+' x '+inttostr(hoehe)+' Pixel',3);
+
+ fontRenderer:=tFontRenderer.create(schriftgroesze);
+
+ setlength(Beschriftungen,0);
+ for i:=0 to length(Achsen)-1 do begin
(* if Achsen[i].Lage in [lOben,lUnten] then
begin
- maw:=xMax/(_xsteps-1)*(_xstop-_xstart)+_xstart;
- miw:=xMin/(_xsteps-1)*(_xstop-_xstart)+_xstart;
+ maw:=xMax/(_xsteps-1)*(_xstop-_xstart)+_xstart;
+ miw:=xMin/(_xsteps-1)*(_xstop-_xstart)+_xstart;
end
- else
+ else
begin
- maw:=tMax/(_tsiz-1)*(_tstop-_tstart)+_tstart;
- miw:=tMin/(_tsiz-1)*(_tstop-_tstart)+_tstart;
- end;
- schritt:=(maw-miw)/Achsen[i].Striche;
- j:=round(ln(schritt)/ln(10));
- schritt:=Achsen[i].faktor*power(10,j);
- wert:=ceil(miw/schritt)*schritt;
- while wert<=maw do *)
- if Achsen[i].Lage in [lOben,lUnten] then begin
- maw:=disk2kont('x',xMax);
- miw:=disk2Kont('x',xMin);
- end
- else begin
- maw:=disk2kont('t',tMax);
- miw:=disk2kont('t',tMin);
- end;
- schritt:=(maw-miw)/Achsen[i].Striche;
- j:=round(ln(schritt)/ln(10));
- schritt:=Achsen[i].faktor*power(10,j);
- wert:=ceil(miw/schritt)*schritt;
- while wert<=maw do begin
- setlength(beschriftungen,length(beschriftungen)+1);
- beschriftungen[length(beschriftungen)-1]:=tBeschriftung.create;
- beschriftungen[length(beschriftungen)-1].bBreite:=Breite;
- beschriftungen[length(beschriftungen)-1].bHoehe:=Hoehe;
- beschriftungen[length(beschriftungen)-1].Rahmen:=Rahmen;
- with beschriftungen[length(beschriftungen)-1] do begin
- fontRend:=fontRenderer;
- lage:=Achsen[i].lage;
+ maw:=tMax/(_tsiz-1)*(_tstop-_tstart)+_tstart;
+ miw:=tMin/(_tsiz-1)*(_tstop-_tstart)+_tstart;
+ end;
+ schritt:=(maw-miw)/Achsen[i].Striche;
+ j:=round(ln(schritt)/ln(10));
+ schritt:=Achsen[i].faktor*power(10,j);
+ wert:=ceil(miw/schritt)*schritt;
+ while wert<=maw do *)
+ if Achsen[i].Lage in [lOben,lUnten] then begin
+ maw:=disk2kont('x',xMax);
+ miw:=disk2Kont('x',xMin);
+ end
+ else begin
+ maw:=disk2kont('t',tMax);
+ miw:=disk2kont('t',tMin);
+ end;
+ schritt:=(maw-miw)/Achsen[i].Striche;
+ j:=round(ln(schritt)/ln(10));
+ schritt:=Achsen[i].faktor*power(10,j);
+ wert:=ceil(miw/schritt)*schritt;
+ while wert<=maw do begin
+ setlength(beschriftungen,length(beschriftungen)+1);
+ beschriftungen[length(beschriftungen)-1]:=tBeschriftung.create;
+ beschriftungen[length(beschriftungen)-1].bBreite:=Breite;
+ beschriftungen[length(beschriftungen)-1].bHoehe:=Hoehe;
+ beschriftungen[length(beschriftungen)-1].Rahmen:=Rahmen;
+ with beschriftungen[length(beschriftungen)-1] do begin
+ fontRend:=fontRenderer;
+ lage:=Achsen[i].lage;
// position:=(wert-miw)/(maw-miw);
- position:=Transformationen.transformiereKoordinaten(Achsen[i].Lage,wert);
- if (position<0) or (position>1) then begin
- gibAus('Der Wert '+floattostr(wert)+' liegt außerhalb des Bildes ('+floattostr(position)+') - das sollte eigentlich nicht passieren!',3);
- beschriftungen[length(beschriftungen)-1].free;
- setlength(beschriftungen,length(beschriftungen)-1);
- end
- else begin
- if lage in [lOben,lUnten] then position:=position*bBreite
- else position:=position*bHoehe;
- inhalt:=floattostr(wert);
- end;
- end;
- wert:=wert+schritt;
- end;
- end;
- gibAus(inttostr(length(Beschriftungen))+' Zahlen an den Achsen',3);
- lof:=Byte(Rahmen);
- rof:=Byte(Rahmen);
- oof:=Byte(Rahmen);
- uof:=Byte(Rahmen);
- for i:=0 to length(beschriftungen)-1 do
+ position:=Transformationen.wertZuPositionAufAchse(Achsen[i].Lage,wert);
+ if (position<0) or (position>1) then begin
+ gibAus('Der Wert '+floattostr(wert)+' liegt außerhalb des Bildes ('+floattostr(position)+') - das sollte eigentlich nicht passieren!',3);
+ beschriftungen[length(beschriftungen)-1].free;
+ setlength(beschriftungen,length(beschriftungen)-1);
+ end
+ else begin
+ if lage in [lOben,lUnten] then position:=position*bBreite
+ else position:=position*bHoehe;
+ inhalt:=floattostr(wert);
+ end;
+ end;
+ wert:=wert+schritt;
+ end;
+ end;
+ gibAus(inttostr(length(Beschriftungen))+' Zahlen an den Achsen',3);
+ lof:=Byte(Rahmen);
+ rof:=Byte(Rahmen);
+ oof:=Byte(Rahmen);
+ uof:=Byte(Rahmen);
+ for i:=0 to length(beschriftungen)-1 do
with Beschriftungen[i] do
- begin
+ begin
lof:=max(lof,-links);
rof:=max(rof,1+rechts-bBreite);
oof:=max(oof,-oben);
uof:=max(uof,1+unten-bHoehe);
- end;
- if lof+oof+rof+uof>0 then
+ end;
+ if lof+oof+rof+uof>0 then
gibAus('Extra-Ränder: '+inttostr(lof)+' Pixel links, '+inttostr(oof)+' Pixel oben, '+inttostr(rof)+' Pixel rechts und '+inttostr(uof)+' Pixel unten.',3);
- setlength(Bilderthreads,maxThreads);
- for i:=0 to length(Bilderthreads)-1 do
- Bilderthreads[i]:=tBilderthread.create(i,length(Bilderthreads),breite,hoehe,lof,oof,rof,uof,quellen,xmin,xmax,tmin,tmax,xzoom,yzoom,Nachbearbeitungen,paletten,@Beschriftungen,rahmen);
- for i:=0 to length(Bilderthreads)-1 do begin
- gibAus('starte Thread '+inttostr(i)+' ...',1);
- Bilderthreads[i].suspended:=false;
- gibAus('... ok!',1);
- end;
- repeat
- sleep(10);
- fertig:=true;
- for i:=0 to length(Bilderthreads)-1 do
- fertig:=fertig and Bilderthreads[i].fertig;
- until fertig;
- 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:=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;
- xp:=xp-xmin;
- tp:=tp-tmin;
- while (k<length(Bilderthreads)-1) and (xp>=Bilderthreads[k+1].xpmi) do
- inc(k);
- Bilderthreads[k].farben[(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi]:=
- konturen^[verwKonturen[i]].farbe;
- end;
- end;
- gibAus('fertig, speichere Bild ...',1);
- assign(img,datei);
- rewrite(img,1);
- schreibeBmpHeader(img,breite+lof+rof,hoehe+oof+uof);
- for j:=-oof to uof+hoehe-1 do begin
- for i:=0 to length(Bilderthreads)-1 do
- blockwrite(img,Bilderthreads[i].farben[(j+oof)*Bilderthreads[i].Breite],3*Bilderthreads[i].Breite);
- i:=0;
- blockwrite(img,i,(4-(((lof+breite+rof)*3) mod 4)) mod 4);
- end;
- close(img);
- gibAus('... Threads freigeben ...',1);
- aufraeumen;
-
- result:=true;
- gibAus('... fertig '+timetostr(now-Zeit),3);
+ setlength(Bilderthreads,maxThreads);
+ for i:=0 to length(Bilderthreads)-1 do
+ Bilderthreads[i]:=tBilderthread.create(i,length(Bilderthreads),breite,hoehe,lof,oof,rof,uof,quellen,xmin,xmax,tmin,tmax,xzoom,yzoom,Nachbearbeitungen,paletten,@Beschriftungen,rahmen);
+ for i:=0 to length(Bilderthreads)-1 do begin
+ gibAus('starte Thread '+inttostr(i)+' ...',1);
+ Bilderthreads[i].suspended:=false;
+ gibAus('... ok!',1);
+ end;
+ repeat
+ sleep(10);
+ fertig:=true;
+ for i:=0 to length(Bilderthreads)-1 do
+ fertig:=fertig and Bilderthreads[i].fertig;
+ until fertig;
+ 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:=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;
+ xp:=xp-xmin;
+ tp:=tp-tmin;
+ while (k<length(Bilderthreads)-1) and (xp>=Bilderthreads[k+1].xpmi) do
+ inc(k);
+ Bilderthreads[k].farben[(tp+oof)*Bilderthreads[k].Breite + xp - Bilderthreads[k].xpmi]:=
+ konturen^[verwKonturen[i]].farbe;
+ end;
+ end;
+ gibAus('fertig, speichere Bild ...',1);
+ assign(img,datei);
+ rewrite(img,1);
+ schreibeBmpHeader(img,breite+lof+rof,hoehe+oof+uof);
+ for j:=-oof to uof+hoehe-1 do begin
+ for i:=0 to length(Bilderthreads)-1 do
+ blockwrite(img,Bilderthreads[i].farben[(j+oof)*Bilderthreads[i].Breite],3*Bilderthreads[i].Breite);
+ i:=0;
+ blockwrite(img,i,(4-(((lof+breite+rof)*3) mod 4)) mod 4);
+ end;
+ close(img);
+ gibAus('... Threads freigeben ...',1);
+ aufraeumen;
+
+ result:=true;
+ gibAus('... fertig '+timetostr(now-Zeit),3);
end;
function tWerte.erzeugeAscii(st: boolean; var f: tMyStringlist): boolean;
-var datei,s,separator: string;
- outf: textfile;
- i,j: longint;
- xmin,xmax,tmin,tmax: longint;
- Zeit: extended;
- mitKoordinaten: byte;
-begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- Zeit:=now;
- gibAus('erzeuge Ascii-Datei ...',3);
- datei:='';
- xmin:=0;
- xmax:=_xsteps-1;
- tmin:=0;
- tmax:=_tsiz-1;
- mitKoordinaten:=0;
- separator:=',';
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
- exit;
- end;
- if startetMit('Datei:',s) then begin
- datei:=s;
- continue;
- end;
- if startetMit('xmin:',s) then begin
- xmin:=kont2disk('x',exprtofloat(st,s));
- continue;
- end;
- if startetMit('xmax:',s) then begin
- xmax:=kont2disk('x',exprtofloat(st,s));
- continue;
- end;
- if startetMit('tmin:',s) then begin
- tmin:=kont2disk('t',exprtofloat(st,s));
- continue;
- end;
- if startetMit('tmax:',s) then begin
- tmax:=kont2disk('t',exprtofloat(st,s));
- continue;
- end;
- if (s='Koordinaten einfügen') and ((_xsteps=1) or (_tsiz=1)) then begin
- mitKoordinaten:=byte(_xsteps=1)*2 + byte(_tsiz=1);
- continue;
- end;
- if startetMit('Separator:',s) then begin
- if s='Leerzeichen' then begin
- Separator:=' ';
- continue;
- end;
- if s='Tab' then begin
- Separator:=#9;
- continue;
- end;
- Separator:=s;
- continue;
- end;
- if s='Ende' then break;
- gibAus('Verstehe Option '''+s+''' nicht bei Erzeugung einer Ascii-Datei!',3);
- exit;
- until false;
-
- if st then begin
- result:=true;
- exit;
- end;
-
- assign(outf,datei);
- rewrite(outf);
- case mitKoordinaten of
- 0:
- case Genauigkeit of
- gSingle:
- for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
- s:='';
- for j:=max(0,xmin) to min(_xsteps-1,xmax) do
- s:=s+floattostr(sWerte.werte[i*_xsteps+j])+separator;
- delete(s,length(s),1);
- writeln(outf,s);
- end;
- gDouble:
- for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
- s:='';
- for j:=max(0,xmin) to min(_xsteps-1,xmax) do
- s:=s+floattostr(dWerte.werte[i*_xsteps+j])+separator;
- delete(s,length(s),1);
- writeln(outf,s);
- end;
- gExtended:
- for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
- s:='';
- for j:=max(0,xmin) to min(_xsteps-1,xmax) do
- s:=s+floattostr(eWerte.werte[i*_xsteps+j])+separator;
- delete(s,length(s),1);
- writeln(outf,s);
- end;
- end{of Case};
- 1:
- case Genauigkeit of
- gSingle:
- for i:=max(0,xmin) to min(_xsteps-1,xmax) do
- writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(sWerte.werte[i]));
- gDouble:
- for i:=max(0,xmin) to min(_xsteps-1,xmax) do
- writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(dWerte.werte[i]));
- gExtended:
- for i:=max(0,xmin) to min(_xsteps-1,xmax) do
- 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(disk2kont('t',i))+separator+floattostr(sWerte.werte[i]));
- gDouble:
- for i:=max(0,tmin) to min(_tsiz-1,tmax) do
- writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(dWerte.werte[i]));
- gExtended:
- for i:=max(0,tmin) to min(_tsiz-1,tmax) do
- writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(eWerte.werte[i]));
- end{of Case};
- 3:
- case Genauigkeit of
- gSingle:
- writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(sWerte.werte[0]));
- gDouble:
- writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(dWerte.werte[0]));
- gExtended:
- writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(eWerte.werte[0]));
- end{of Case};
- end{of Case};
- close(outf);
- gibAus('... fertig '+timetostr(now-Zeit),3);
- result:=true;
+var
+ datei,s,separator: string;
+ outf: textfile;
+ i,j: longint;
+ xmin,xmax,tmin,tmax: longint;
+ Zeit: extended;
+ mitKoordinaten: byte;
+begin
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ Zeit:=now;
+ gibAus('erzeuge Ascii-Datei ...',3);
+ datei:='';
+ xmin:=0;
+ xmax:=_xsteps-1;
+ tmin:=0;
+ tmax:=_tsiz-1;
+ mitKoordinaten:=0;
+ separator:=',';
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
+ exit;
+ end;
+ if startetMit('Datei:',s) then begin
+ datei:=s;
+ continue;
+ end;
+ if startetMit('xmin:',s) then begin
+ xmin:=kont2disk('x',exprtofloat(st,s));
+ continue;
+ end;
+ if startetMit('xmax:',s) then begin
+ xmax:=kont2disk('x',exprtofloat(st,s));
+ continue;
+ end;
+ if startetMit('tmin:',s) then begin
+ tmin:=kont2disk('t',exprtofloat(st,s));
+ continue;
+ end;
+ if startetMit('tmax:',s) then begin
+ tmax:=kont2disk('t',exprtofloat(st,s));
+ continue;
+ end;
+ if (s='Koordinaten einfügen') and ((_xsteps=1) or (_tsiz=1)) then begin
+ mitKoordinaten:=byte(_xsteps=1)*2 + byte(_tsiz=1);
+ continue;
+ end;
+ if startetMit('Separator:',s) then begin
+ if s='Leerzeichen' then begin
+ Separator:=' ';
+ continue;
+ end;
+ if s='Tab' then begin
+ Separator:=#9;
+ continue;
+ end;
+ Separator:=s;
+ continue;
+ end;
+ if s='Ende' then break;
+ gibAus('Verstehe Option '''+s+''' nicht bei Erzeugung einer Ascii-Datei!',3);
+ exit;
+ until false;
+
+ if st then begin
+ result:=true;
+ exit;
+ end;
+
+ assign(outf,datei);
+ rewrite(outf);
+ case mitKoordinaten of
+ 0:
+ case Genauigkeit of
+ gSingle:
+ for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
+ s:='';
+ for j:=max(0,xmin) to min(_xsteps-1,xmax) do
+ s:=s+floattostr(sWerte.werte[i*_xsteps+j])+separator;
+ delete(s,length(s),1);
+ writeln(outf,s);
+ end;
+ gDouble:
+ for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
+ s:='';
+ for j:=max(0,xmin) to min(_xsteps-1,xmax) do
+ s:=s+floattostr(dWerte.werte[i*_xsteps+j])+separator;
+ delete(s,length(s),1);
+ writeln(outf,s);
+ end;
+ gExtended:
+ for i:=max(0,tmin) to min(_tsiz-1,tmax) do begin
+ s:='';
+ for j:=max(0,xmin) to min(_xsteps-1,xmax) do
+ s:=s+floattostr(eWerte.werte[i*_xsteps+j])+separator;
+ delete(s,length(s),1);
+ writeln(outf,s);
+ end;
+ end{of Case};
+ 1:
+ case Genauigkeit of
+ gSingle:
+ for i:=max(0,xmin) to min(_xsteps-1,xmax) do
+ writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(sWerte.werte[i]));
+ gDouble:
+ for i:=max(0,xmin) to min(_xsteps-1,xmax) do
+ writeln(outf,floattostr(disk2kont('x',i))+separator+floattostr(dWerte.werte[i]));
+ gExtended:
+ for i:=max(0,xmin) to min(_xsteps-1,xmax) do
+ 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(disk2kont('t',i))+separator+floattostr(sWerte.werte[i]));
+ gDouble:
+ for i:=max(0,tmin) to min(_tsiz-1,tmax) do
+ writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(dWerte.werte[i]));
+ gExtended:
+ for i:=max(0,tmin) to min(_tsiz-1,tmax) do
+ writeln(outf,floattostr(disk2kont('t',i))+separator+floattostr(eWerte.werte[i]));
+ end{of Case};
+ 3:
+ case Genauigkeit of
+ gSingle:
+ writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(sWerte.werte[0]));
+ gDouble:
+ writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(dWerte.werte[0]));
+ gExtended:
+ writeln(outf,floattostr(disk2kont('x',0))+separator+floattostr(disk2kont('t',0))+separator+floattostr(eWerte.werte[0]));
+ end{of Case};
+ end{of Case};
+ close(outf);
+ gibAus('... fertig '+timetostr(now-Zeit),3);
+ result:=true;
end;
function tWerte.erzeugeLineout(st: boolean; params: string): boolean;
-var ab: array[boolean,boolean] of longint;
- s: string;
- f: textfile;
- Zeit: extended;
- i: longint;
- b1,b2: boolean;
-begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- Zeit:=now;
- if not st then begin
- gibAus('erzeuge Lineout ...',3);
- gibAus('insgesamt: '+floattostr(Transformationen.xstart)+'..'+floattostr(Transformationen.xstop)+' x '+floattostr(Transformationen.tstart)+'..'+floattostr(Transformationen.tstop),3);
- end;
-
- for b1:=false to true do
- for b2:=false to true do
- ab[b1,b2]:=0;
-
- params:=trim(params);
- if startetMit('integriere ',params) then begin
- if startetMit('horizontal',params) then b1:=true
- else if startetMit('vertikal',params) then b1:=false
- else exit;
- if st then begin
- result:=true;
- exit;
- end;
- if b1 then s:='horizontal'
- else s:='vertikal';
- gibAus('... schreibe in '''+params+''', integriere '+s,3);
-
- if pos(' ',params)>0 then begin
- gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
- exit;
- end;
-
- assignFile(f,params);
- rewrite(f);
- for i:=0 to _xsteps*byte(not b1)+_tsiz*byte(b1)-1 do
- schreibeWertIntegriert(f,i,b1);
- closefile(f);
- end
- else begin
- for b1:=false to true do
- if startetMit('(',params) then begin
- s:=erstesArgument(params,',');
- ab[b1,false]:=kont2disk('x',exprtofloat(st,s));
- s:=erstesArgument(params,')');
- ab[b1,true]:=kont2disk('t',exprtofloat(st,s));
- end
- else begin
- ab[true,false]:=ab[false,false];
- ab[true,true]:=ab[false,true];
- ab[false,false]:=(_xsteps-1)*byte(not b1);
- ab[false,true]:=(_tsiz-1)*byte(not b1);
- end;
-
- if st then begin
- result:=true;
- exit;
- end;
-
- if pos(' ',params)>0 then begin
- gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
- exit;
- end;
-
- s:='... schreibe in '''+params+''' (';
- for i:=0 to 3 do begin
- s:=s+inttostr(ab[odd(i div 2),odd(i)]);
- if not odd(i) then s:=s+','
- else if i=1 then s:=s+')--(';
- end;
- gibAus(s+') ...',3);
-
- assignFile(f,params);
- rewrite(f);
- if abs(ab[true,true]-ab[false,true])>abs(ab[true,false]-ab[false,false]) then begin
- if ab[true,true]>ab[false,true] then begin
- for i:=ab[false,true] to ab[true,true] do
- schreibeWert(f,round(ab[false,false]+i/(ab[true,true]-ab[false,true])*(ab[true,false]-ab[false,false])),i);
- end
- else
- for i:=ab[false,true] downto ab[true,true] do
- schreibeWert(f,round(ab[false,false]+i/(ab[true,true]-ab[false,true])*(ab[true,false]-ab[false,false])),i);
- end
- else begin
- if ab[true,false]>ab[false,false] then begin
- for i:=ab[false,false] to ab[true,false] do
- schreibeWert(f,i,round(ab[false,true]+i/(ab[true,false]-ab[false,false])*(ab[true,true]-ab[false,true])));
- end
- else
- for i:=ab[false,false] downto ab[true,false] do
- schreibeWert(f,i,round(ab[false,true]+i/(ab[true,false]-ab[false,false])*(ab[true,true]-ab[false,true])));
- end;
- closefile(f);
- end;
- gibAus('... fertig '+timetostr(now-Zeit),3);
- result:=true;
+var
+ ab: array[boolean,boolean] of longint;
+ s: string;
+ f: textfile;
+ Zeit: extended;
+ i: longint;
+ b1,b2: boolean;
+begin
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ Zeit:=now;
+ if not st then begin
+ gibAus('erzeuge Lineout ...',3);
+ gibAus('insgesamt: '+floattostr(Transformationen.xstart)+'..'+floattostr(Transformationen.xstop)+' x '+floattostr(Transformationen.tstart)+'..'+floattostr(Transformationen.tstop),3);
+ end;
+
+ for b1:=false to true do
+ for b2:=false to true do
+ ab[b1,b2]:=0;
+
+ params:=trim(params);
+ if startetMit('integriere ',params) then begin
+ if startetMit('horizontal',params) then b1:=true
+ else if startetMit('vertikal',params) then b1:=false
+ else exit;
+ if st then begin
+ result:=true;
+ exit;
+ end;
+ if b1 then s:='horizontal'
+ else s:='vertikal';
+ gibAus('... schreibe in '''+params+''', integriere '+s,3);
+
+ if pos(' ',params)>0 then begin
+ gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
+ exit;
+ end;
+
+ assignFile(f,params);
+ rewrite(f);
+ for i:=0 to _xsteps*byte(not b1)+_tsiz*byte(b1)-1 do
+ schreibeWertIntegriert(f,i,b1);
+ closefile(f);
+ end
+ else begin
+ for b1:=false to true do
+ if startetMit('(',params) then begin
+ s:=erstesArgument(params,',');
+ ab[b1,false]:=kont2disk('x',exprtofloat(st,s));
+ s:=erstesArgument(params,')');
+ ab[b1,true]:=kont2disk('t',exprtofloat(st,s));
+ end
+ else begin
+ ab[true,false]:=ab[false,false];
+ ab[true,true]:=ab[false,true];
+ ab[false,false]:=(_xsteps-1)*byte(not b1);
+ ab[false,true]:=(_tsiz-1)*byte(not b1);
+ end;
+
+ if st then begin
+ result:=true;
+ exit;
+ end;
+
+ if pos(' ',params)>0 then begin
+ gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
+ exit;
+ end;
+
+ s:='... schreibe in '''+params+''' (';
+ for i:=0 to 3 do begin
+ s:=s+inttostr(ab[odd(i div 2),odd(i)]);
+ if not odd(i) then s:=s+','
+ else if i=1 then s:=s+')--(';
+ end;
+ gibAus(s+') ...',3);
+
+ assignFile(f,params);
+ rewrite(f);
+ if abs(ab[true,true]-ab[false,true])>abs(ab[true,false]-ab[false,false]) then begin
+ if ab[true,true]>ab[false,true] then begin
+ for i:=ab[false,true] to ab[true,true] do
+ schreibeWert(f,round(ab[false,false]+i/(ab[true,true]-ab[false,true])*(ab[true,false]-ab[false,false])),i);
+ end
+ else
+ for i:=ab[false,true] downto ab[true,true] do
+ schreibeWert(f,round(ab[false,false]+i/(ab[true,true]-ab[false,true])*(ab[true,false]-ab[false,false])),i);
+ end
+ else begin
+ if ab[true,false]>ab[false,false] then begin
+ for i:=ab[false,false] to ab[true,false] do
+ schreibeWert(f,i,round(ab[false,true]+i/(ab[true,false]-ab[false,false])*(ab[true,true]-ab[false,true])));
+ end
+ else
+ for i:=ab[false,false] downto ab[true,false] do
+ schreibeWert(f,i,round(ab[false,true]+i/(ab[true,false]-ab[false,false])*(ab[true,true]-ab[false,true])));
+ end;
+ closefile(f);
+ end;
+ gibAus('... fertig '+timetostr(now-Zeit),3);
+ result:=true;
end;
function tWerte.erzeugeBinning(st: boolean; params: string): boolean;
-var senkrecht,linien: boolean;
- Zeit,x0,dx: extended;
-begin
- result:=false;
- warteaufBeendigungDesLeseThreads;
- Zeit:=now;
- if not st then begin
- gibAus('erzeuge Binning ...',3);
- gibAus('insgesamt: '+floattostr(Transformationen.xstart)+'..'+floattostr(Transformationen.xstop)+' x '+floattostr(Transformationen.tstart)+'..'+floattostr(Transformationen.tstop),3);
- end;
- senkrecht:=Transformationen.xstart=Transformationen.xstop;
- if (not senkrecht) and (Transformationen.tstart<>Transformationen.tstop) then begin
- gibAus('Binning geht nur auf eindimensionalen Daten!',3);
- exit;
- end;
-
- params:=trim(params);
- linien:=startetMit('(Gnuplotlinien)',params);
- x0:=kont2disk(char(ord('x')+byte(senkrecht)),exprtofloat(st,erstesArgument(params)));
- dx:=kont2diskFak(char(ord('x')+byte(senkrecht)),exprtofloat(st,erstesArgument(params)));
-
- if pos(' ',params)>0 then begin
- gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
- exit;
- end;
-
- if not st then
- case Genauigkeit of
- gSingle:
- sWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
- gDouble:
- dWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
- gExtended:
- eWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
- end{of case};
- gibAus('... fertig '+timetostr(now-Zeit),3);
- result:=true;
+var
+ senkrecht,linien: boolean;
+ Zeit,x0,dx: extended;
+begin
+ result:=false;
+ warteaufBeendigungDesLeseThreads;
+ Zeit:=now;
+ if not st then begin
+ gibAus('erzeuge Binning ...',3);
+ gibAus('insgesamt: '+floattostr(Transformationen.xstart)+'..'+floattostr(Transformationen.xstop)+' x '+floattostr(Transformationen.tstart)+'..'+floattostr(Transformationen.tstop),3);
+ end;
+ senkrecht:=Transformationen.xstart=Transformationen.xstop;
+ if (not senkrecht) and (Transformationen.tstart<>Transformationen.tstop) then begin
+ gibAus('Binning geht nur auf eindimensionalen Daten!',3);
+ exit;
+ end;
+
+ params:=trim(params);
+ linien:=startetMit('(Gnuplotlinien)',params);
+ x0:=kont2disk(char(ord('x')+byte(senkrecht)),exprtofloat(st,erstesArgument(params)));
+ dx:=kont2diskFak(char(ord('x')+byte(senkrecht)),exprtofloat(st,erstesArgument(params)));
+
+ if pos(' ',params)>0 then begin
+ gibAus('Leerzeichen im Dateinamen sind nicht erlaubt!',3);
+ exit;
+ end;
+
+ if not st then
+ case Genauigkeit of
+ gSingle:
+ sWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
+ gDouble:
+ dWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
+ gExtended:
+ eWerte.erzeugeBinning(senkrecht,linien,x0,dx,params);
+ end{of case};
+ gibAus('... fertig '+timetostr(now-Zeit),3);
+ result:=true;
end;
procedure tWerte.schreibeWert(var f: textfile; x,y: longint);
@@ -3717,9 +3838,10 @@ begin
end;
procedure tWerte.spiegle(threads,tmin,tmax: longint);
-var i: longint;
- sts: array of tSpiegelthread;
- fertig: boolean;
+var
+ i: longint;
+ sts: array of tSpiegelthread;
+ fertig: boolean;
begin
warteaufBeendigungDesLeseThreads;
setlength(sts,threads);
@@ -3736,14 +3858,15 @@ begin
until fertig;
for i:=0 to length(sts)-1 do
sts[i].free;
- Transformationen.AddSpiegelung;
+ Transformationen:=tSpiegelungsTransformation.create(Transformationen);
gibAus('Alle Spiegelthreads fertig!',1);
end;
procedure tWerte.fft2dNachbearbeitung(threads: longint; nb: tFFTDatenordnung);
-var i: longint;
- FNTs: array of tFFT2dNBThread;
- fertig: boolean;
+var
+ i: longint;
+ FNTs: array of tFFT2dNBThread;
+ fertig: boolean;
begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte) nach!
setlength(FNTs,threads);
for i:=0 to length(FNTs)-1 do
@@ -3764,7 +3887,8 @@ begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte)
end;
function tWerte.callBackGetValue(s: string): extended;
-var i: longint;
+var
+ i: longint;
begin
result:=nan;
if startetMit('Kontur[',s) or startetMit('Konturen[',s) then begin
@@ -3829,39 +3953,27 @@ end;
procedure tWerte.beendeLeseThreadWennFertig;
begin
- if assigned(leseThread) and leseThread.fertig then begin
- leseThread.free;
- leseThread:=nil;
- end;
-end;
-
-function tWerte.Transformationen: tTransformationen;
-begin
- case genauigkeit of
- gSingle:
- result:=sWerte.params.transformationen;
- gDouble:
- result:=dWerte.params.transformationen;
- gExtended:
- result:=eWerte.params.transformationen;
- end{of case};
+ if assigned(leseThread) and leseThread.fertig then begin
+ leseThread.free;
+ leseThread:=nil;
+ end;
end;
// tLogThread ******************************************************************
constructor tLogThread.create;
begin
- inherited create(true);
- raisedException:=nil;
- freeonterminate:=false;
- fertig:=false;
+ inherited create(true);
+ raisedException:=nil;
+ freeonterminate:=false;
+ fertig:=false;
end;
destructor tLogThread.destroy;
begin
- raisedException.free;
- if (not behalteLogs) and not odd(__ausgabenMaske) then cleanupLog(threadID);
- inherited destroy;
+ raisedException.free;
+ if (not behalteLogs) and not odd(__ausgabenMaske) then cleanupLog(threadID);
+ inherited destroy;
end;
function tLogThread.rFertig: boolean;
@@ -3869,34 +3981,34 @@ var
ei: string;
i: longint;
begin
- if assigned(raisedException) then begin
- if self is tBefehlThread then begin
- if assigned((self as tBefehlThread).p) then begin
- ei:=' '''+(self as tBefehlThread).p.Executable+'''';
- for i:=0 to (self as tBefehlThread).p.parameters.count-1 do
- ei:=ei+' '''+(self as tBefehlThread).p.parameters[i]+'''';
- ei:=ei;
- end
- else ei:=': p=NIL';
- end
- else ei:='';
- raise raisedException;
- raise exception.create('Fehler innerhalb eines Threads ('+className+')'+ei+'!');
- end;
- result:=_fertig;
+ if assigned(raisedException) then begin
+ if self is tBefehlThread then begin
+ if assigned((self as tBefehlThread).p) then begin
+ ei:=' '''+(self as tBefehlThread).p.Executable+'''';
+ for i:=0 to (self as tBefehlThread).p.parameters.count-1 do
+ ei:=ei+' '''+(self as tBefehlThread).p.parameters[i]+'''';
+ ei:=ei;
+ end
+ else ei:=': p=NIL';
+ end
+ else ei:='';
+ raise raisedException;
+ raise exception.create('Fehler innerhalb eines Threads ('+className+')'+ei+'!');
+ end;
+ result:=_fertig;
end;
procedure tLogThread.execute;
begin
- try
- stExecute;
- except
- on E: exception do begin
- dumpExceptionCallStack(E);
- raisedException:=E;
- end;
- end;
- fertig:=true;
+ try
+ stExecute;
+ except
+ on E: exception do begin
+ dumpExceptionCallStack(E);
+ raisedException:=E;
+ end;
+ end;
+ fertig:=true;
end;
// tLiKoThread *****************************************************************
@@ -3918,12 +4030,13 @@ end;
destructor tLiKoThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tLiKoThread.stExecute;
-var i,j,k: longint;
- out0,in0: boolean;
+var
+ i,j,k: longint;
+ out0,in0: boolean;
begin
gibAus('LiKo-Berechnungsthread gestartet ('+inttostr(xmi)+'-'+inttostr(xma)+'x'+inttostr(tmi)+'-'+inttostr(tma)+') ...',1);
for i:=0 to length(liKo^)-1 do
@@ -3962,20 +4075,20 @@ begin
end;
end;
gExtended:
- for j:=tMi to tMa do begin
- if (tMa-j) mod ((tMa-tMi) div 10) = 0 then
- gibAus('LiKo-Berechnungsthread: '+inttostr(j)+'/'+inttostr(tMi)+'..'+inttostr(tMa)+' ('+inttostr(xMi)+'..'+inttostr(xMa)+')',1);
- for i:=xMi to xMa do begin
- pW.eWerte.werte[i+j*pW._xsteps]:=0;
- for k:=0 to length(liKo^)-1 do begin
- pW.eWerte.werte[i+j*pW._xsteps]:=
- pW.eWerte.werte[i+j*pW._xsteps] +
- liKo^[k].alpha*liKo^[k].werte.eWerte.werte[(xOf+i) + (tOf+j)*liKo^[k].werte._xsteps];
- in0:=in0 and (liKo^[k].werte.eWerte.werte[(xOf+i) + (tOf+j)*liKo^[k].werte._xsteps]=0);
- end;
- out0:=out0 and (pW.eWerte.werte[i+j*pW._xsteps]=0);
- end;
- end;
+ for j:=tMi to tMa do begin
+ if (tMa-j) mod ((tMa-tMi) div 10) = 0 then
+ gibAus('LiKo-Berechnungsthread: '+inttostr(j)+'/'+inttostr(tMi)+'..'+inttostr(tMa)+' ('+inttostr(xMi)+'..'+inttostr(xMa)+')',1);
+ for i:=xMi to xMa do begin
+ pW.eWerte.werte[i+j*pW._xsteps]:=0;
+ for k:=0 to length(liKo^)-1 do begin
+ pW.eWerte.werte[i+j*pW._xsteps]:=
+ pW.eWerte.werte[i+j*pW._xsteps] +
+ liKo^[k].alpha*liKo^[k].werte.eWerte.werte[(xOf+i) + (tOf+j)*liKo^[k].werte._xsteps];
+ in0:=in0 and (liKo^[k].werte.eWerte.werte[(xOf+i) + (tOf+j)*liKo^[k].werte._xsteps]=0);
+ end;
+ out0:=out0 and (pW.eWerte.werte[i+j*pW._xsteps]=0);
+ end;
+ end;
end{of Case};
if in0 then gibAus('Nur Nullen im Input!',1);
if out0 then gibAus('Nur Nullen im Output!',1);
@@ -4004,12 +4117,13 @@ end;
destructor tQuotientThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tQuotientThread.stExecute;
-var i,j: longint;
- i01,i02,o0: boolean;
+var
+ i,j: longint;
+ i01,i02,o0: boolean;
begin
gibAus('Quotient-Berechnungsthread gestartet ...',1);
i01:=true;
@@ -4212,12 +4326,13 @@ end;
destructor tProduktThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tProduktThread.stExecute;
-var i,j: longint;
- i01,i02,o0: boolean;
+var
+ i,j: longint;
+ i01,i02,o0: boolean;
begin
gibAus('Produkt-Berechnungsthread gestartet ...',1);
i01:=true;
@@ -4353,7 +4468,7 @@ end;
// tBilderthread ***************************************************************
-constructor tBilderthread.create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const wes: tWerteArray; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitungen: tTransformationenArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
+constructor tBilderthread.create(i,maxthreads,ibreite,ihoehe,lo,oo,ro,uo: longint; const wes: tWerteArray; xmin,xmax,tmin,tmax: Longint; xzoom,yzoom: extended; Nachbearbeitungen: tTransformationArray; paletten: pTPalettenArray; beschri: pTBeschriftungen; rm: boolean);
var
ii: longint;
begin
@@ -4457,7 +4572,7 @@ begin
else begin
farben[i-xpmi+(j+oof)*breite].rgbRed:=
$ff * byte((not rahmen) or
- ((not ((i=-1) and (j>=-1) and (j<=whoehe))) and // links
+ ((not ((i=-1) and (j>=-1) and (j<=whoehe))) and // links
(not ((i=gesBreite) and (j>=-1) and (j<=whoehe))) and // rechts
(not ((j=-1) and (i>=-1) and (i<=gesBreite))) and // oben
(not ((j=whoehe) and (i>=-1) and (i<=gesBreite))))); // unten
@@ -4527,32 +4642,32 @@ end;
constructor tDichteThread.create(xmi,xma,tmi,tma: longint; const werte: tWerte);
begin
- inherited create;
- xmin:=xmi;
- xmax:=xma;
- tmin:=tmi;
- tmax:=tma;
- w:=werte;
- maxdichte:=0;
- gibAus('Dichtethread kreiert: '+inttostr(xmin)+'-'+inttostr(xmax)+' '+inttostr(tmin)+'-'+inttostr(tmax),1);
- suspended:=false;
+ inherited create;
+ xmin:=xmi;
+ xmax:=xma;
+ tmin:=tmi;
+ tmax:=tma;
+ w:=werte;
+ maxdichte:=0;
+ gibAus('Dichtethread kreiert: '+inttostr(xmin)+'-'+inttostr(xmax)+' '+inttostr(tmin)+'-'+inttostr(tmax),1);
+ suspended:=false;
end;
destructor tDichteThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tDichteThread.stExecute;
begin
- gibAus('Dichtethread gestartet!',1);
- case w.Genauigkeit of
- gSingle: w.sWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
- gDouble: w.dWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
- gExtended: w.eWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
- end{of case};
- gibAus('Dichtethread fertig!',1);
- fertig:=true;
+ gibAus('Dichtethread gestartet!',1);
+ case w.Genauigkeit of
+ gSingle: w.sWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
+ gDouble: w.dWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
+ gExtended: w.eWerte.gibMinMaxDichten(minDichte,maxDichte,xmin,xmax,tmin,tmax);
+ end{of case};
+ gibAus('Dichtethread fertig!',1);
+ fertig:=true;
end;
// tFFTThread ******************************************************************
@@ -4577,19 +4692,19 @@ end;
destructor tFFTThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tFFTThread.stExecute;
begin
- gibAus('FFTthread gestartet: '+inttostr(xMi)+'-'+inttostr(xMa)+' '+inttostr(tMi)+'-'+inttostr(tMa)+' ...',1);
- case pW.Genauigkeit of
- gSingle: erfolg:=pW.sWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
- gDouble: erfolg:=pW.dWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
- gExtended: erfolg:=pW.eWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
- end{of case};
- gibAus('... und fertig! ',1);
- fertig:=true;
+ gibAus('FFTthread gestartet: '+inttostr(xMi)+'-'+inttostr(xMa)+' '+inttostr(tMi)+'-'+inttostr(tMa)+' ...',1);
+ case pW.Genauigkeit of
+ gSingle: erfolg:=pW.sWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
+ gDouble: erfolg:=pW.dWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
+ gExtended: erfolg:=pW.eWerte.fft(xMi,xMa,tMi,tMa,sen,inv,vo,na,fen,pvFehler);
+ end{of case};
+ gibAus('... und fertig! ',1);
+ fertig:=true;
end;
// tSpiegelThread **************************************************************
@@ -4606,7 +4721,7 @@ end;
destructor tSpiegelThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tSpiegelThread.stExecute;
@@ -4636,7 +4751,7 @@ end;
destructor tFFT2dNBThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tFFT2dNBThread.stExecute;
@@ -4671,15 +4786,16 @@ end;
destructor tKorrelThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tKorrelThread.stExecute;
-var i,j,k,hl: longint;
- sus,suc,tmp,pvF: extended;
- in0,out0: boolean;
- fenster: tFenster;
- tmpW: tWerte;
+var
+ i,j,k,hl: longint;
+ sus,suc,tmp,pvF: extended;
+ in0,out0: boolean;
+ fenster: tFenster;
+ tmpW: tWerte;
begin
gibAus('Korrelationsberechnungsthread gestartet ...',1);
gibAus('('+inttostr(xmi)+'-'+inttostr(xma)+' x '+inttostr(tmi)+'-'+inttostr(tma)+'), '+inttostr(wl.werte.params.tsiz),1);
@@ -4823,7 +4939,8 @@ begin
end;
function tKontur.rxmin: extended;
-var i: longint;
+var
+ i: longint;
begin
if length(orte)=0 then begin
result:=nan;
@@ -4835,7 +4952,8 @@ begin
end;
function tKontur.rxmax: extended;
-var i: longint;
+var
+ i: longint;
begin
if length(orte)=0 then begin
result:=nan;
@@ -4847,7 +4965,8 @@ begin
end;
function tKontur.rtmin: extended;
-var i: longint;
+var
+ i: longint;
begin
if length(orte)=0 then begin
result:=nan;
@@ -4859,7 +4978,8 @@ begin
end;
function tKontur.rtmax: extended;
-var i: longint;
+var
+ i: longint;
begin
if length(orte)=0 then begin
result:=nan;
@@ -4871,8 +4991,9 @@ begin
end;
function tKontur.init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean;
-var s,xmi,xma,tmi,tma: string;
- i,j,k,tmpi: longint;
+var
+ s,xmi,xma,tmi,tma: string;
+ i,j,k,tmpi: longint;
begin
result:=false;
gibAus('Kontur erzeugen ...',1);
@@ -4892,8 +5013,8 @@ begin
tmpi:=
(tmpi shl 4) or
(ord(s[i])-ord('0')
- - byte(s[i] in ['a'..'f'])*(ord('a')-ord('0')-10)
- - byte(s[i] in ['A'..'F'])*(ord('A')-ord('0')-10));
+ - byte(s[i] in ['a'..'f'])*(ord('a')-ord('0')-10)
+ - byte(s[i] in ['A'..'F'])*(ord('A')-ord('0')-10));
end
else
tmpi:=strtoint(copy(s,1,pos(' ',s)-1));
@@ -4981,9 +5102,10 @@ begin
end;
function tKontur.liesVonDatei(st: boolean; s: string; xmi,xma,tmi,tma: extended): boolean;
-var tf: textfile;
- i: longint;
- tmp: tExtPoint;
+var
+ tf: textfile;
+ i: longint;
+ tmp: tExtPoint;
begin
result:=false;
if not fileexists(s) then begin
@@ -5015,10 +5137,11 @@ begin
end;
function tKontur.erzeugeAusWerten(st: boolean; s: string; w: pTWerteArray; mt: longint; _xmin,_xmax,_tmin,_tmax: string): boolean;
-var i,j,k,l,xmi,xma,tmi,tma: longint;
- Schwelle: extended;
- fertig: boolean;
- Konturthreads: array of tKonturAusWertenThread;
+var
+ i,j,k,l,xmi,xma,tmi,tma: longint;
+ Schwelle: extended;
+ fertig: boolean;
+ Konturthreads: array of tKonturAusWertenThread;
begin
result:=false;
i:=findeWerte(erstesArgument(s),nil,w,nil,false);
@@ -5072,61 +5195,62 @@ begin
end;
function tKontur.sortiere_nach_y(mt,von,bis: longint): boolean;
-var i,j: longint;
- avg: extended;
- tmp: tExtPoint;
- st1,st2: tSortiereNachYThread;
-begin
- result:=false;
- if von>=bis then begin
- result:=true;
- exit;
- end;
- avg:=0;
- for i:=von to bis do
- avg:=avg+Orte[i]['y'];
- avg:=avg/(bis-von+1);
- i:=von;
- j:=bis;
-
- while i<j do begin
- while (i<=j) and (Orte[i]['y']<=avg) do
- inc(i);
- while (i<=j) and (Orte[j]['y']>=avg) do
- dec(j);
- if i<j then begin
- tmp:=Orte[i];
- Orte[i]:=Orte[j];
- Orte[j]:=tmp;
- end;
- end;
- if i<>j+1 then begin
- gibAus(' interner Quicksort-Fehler: "quicksort-sanity-check nicht bestanden! (i='+inttostr(i)+' & j='+inttostr(j)+')"',1);
- exit;
- end;
- if (j<von) or (i>bis) then begin
- for i:=von+1 to bis do
- if Orte[i]['y'] <> Orte[von]['y'] then begin
- gibAus(' interner Quicksort-Fehler: "komisch, die Orte sind doch unterschiedlich ..."',1);
- halt;
- end;
- result:=true;
- exit;
- end;
-
- if mt<=1 then
- result:=sortiere_nach_y(mt,von,i-1) and sortiere_nach_y(mt,i,bis)
- else begin
- j:=min(max(1,round(mt/(bis+1-von)*(i-von))),mt-1);
- st1:=tSortiereNachYThread.create(self,j,von,i-1);
- st2:=tSortiereNachYThread.create(self,mt-j,i,bis);
- repeat
- sleep(10);
- until st1.fertig and st2.fertig;
- result:=st1.erfolg and st2.erfolg;
- st1.free;
- st2.free;
- end;
+var
+ i,j: longint;
+ avg: extended;
+ tmp: tExtPoint;
+ st1,st2: tSortiereNachYThread;
+begin
+ result:=false;
+ if von>=bis then begin
+ result:=true;
+ exit;
+ end;
+ avg:=0;
+ for i:=von to bis do
+ avg:=avg+Orte[i]['y'];
+ avg:=avg/(bis-von+1);
+ i:=von;
+ j:=bis;
+
+ while i<j do begin
+ while (i<=j) and (Orte[i]['y']<=avg) do
+ inc(i);
+ while (i<=j) and (Orte[j]['y']>=avg) do
+ dec(j);
+ if i<j then begin
+ tmp:=Orte[i];
+ Orte[i]:=Orte[j];
+ Orte[j]:=tmp;
+ end;
+ end;
+ if i<>j+1 then begin
+ gibAus(' interner Quicksort-Fehler: "quicksort-sanity-check nicht bestanden! (i='+inttostr(i)+' & j='+inttostr(j)+')"',1);
+ exit;
+ end;
+ if (j<von) or (i>bis) then begin
+ for i:=von+1 to bis do
+ if Orte[i]['y'] <> Orte[von]['y'] then begin
+ gibAus(' interner Quicksort-Fehler: "komisch, die Orte sind doch unterschiedlich ..."',1);
+ halt;
+ end;
+ result:=true;
+ exit;
+ end;
+
+ if mt<=1 then
+ result:=sortiere_nach_y(mt,von,i-1) and sortiere_nach_y(mt,i,bis)
+ else begin
+ j:=min(max(1,round(mt/(bis+1-von)*(i-von))),mt-1);
+ st1:=tSortiereNachYThread.create(self,j,von,i-1);
+ st2:=tSortiereNachYThread.create(self,mt-j,i,bis);
+ repeat
+ sleep(10);
+ until st1.fertig and st2.fertig;
+ result:=st1.erfolg and st2.erfolg;
+ st1.free;
+ st2.free;
+ end;
end;
// tKonturAusWertenThread ******************************************************
@@ -5146,8 +5270,8 @@ end;
destructor tKonturAusWertenThread.destroy;
begin
- setlength(punkte,0);
- inherited destroy;
+ setlength(punkte,0);
+ inherited destroy;
end;
procedure tKonturAusWertenThread.stExecute;
@@ -5180,15 +5304,15 @@ end;
destructor tIntegralThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tIntegralThread.stExecute;
begin
gibAus('Integralthread gestartet ('+inttostr(xmi)+'-'+inttostr(xma)+'x'+inttostr(tmi)+'-'+inttostr(tma)+') '+
- '('+inttostr(qu._xsteps)+'x'+inttostr(qu._tsiz)+') -> '+
- '('+inttostr(zi._xsteps)+'x'+inttostr(zi._tsiz)+') delta: '+
- inttostr(xof)+'x'+inttostr(tof)+' ...',1);
+ '('+inttostr(qu._xsteps)+'x'+inttostr(qu._tsiz)+') -> '+
+ '('+inttostr(zi._xsteps)+'x'+inttostr(zi._tsiz)+') delta: '+
+ inttostr(xof)+'x'+inttostr(tof)+' ...',1);
case rtg of
irHorizontal: gibAus(' (horizontal)',1);
irEinfall: gibAus(' (einfallend)',1);
@@ -5222,27 +5346,27 @@ end;
constructor tSortiereNachYThread.create(K: tKontur; threads,von,bis: longint);
begin
- inherited create;
- Kont:=K;
- vo:=von;
- bi:=bis;
- mt:=threads;
- erfolg:=false;
- gibAus('Sortierthread kreiert ('+inttostr(vo)+'-'+inttostr(bi)+') -> x'+inttostr(mt),1);
- suspended:=false;
+ inherited create;
+ Kont:=K;
+ vo:=von;
+ bi:=bis;
+ mt:=threads;
+ erfolg:=false;
+ gibAus('Sortierthread kreiert ('+inttostr(vo)+'-'+inttostr(bi)+') -> x'+inttostr(mt),1);
+ suspended:=false;
end;
destructor tSortiereNachYThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tSortiereNachYThread.stExecute;
begin
- gibAus('Sortierthread gestartet ('+inttostr(vo)+'-'+inttostr(bi)+') -> x'+inttostr(mt)+' ...',1);
- erfolg:=Kont.sortiere_nach_y(mt,vo,bi);
- gibAus(' ... und fertig',1);
- fertig:=true;
+ gibAus('Sortierthread gestartet ('+inttostr(vo)+'-'+inttostr(bi)+') -> x'+inttostr(mt)+' ...',1);
+ erfolg:=Kont.sortiere_nach_y(mt,vo,bi);
+ gibAus(' ... und fertig',1);
+ fertig:=true;
end;
// tBefehlThread ***************************************************************
@@ -5251,547 +5375,559 @@ constructor tBefehlThread.create(st: boolean; cmd: string; out erfolg: boolean);
var
nichtLeeresArgument: boolean;
function shellParseNextArg(var s: string): string;
-var err: longint;
- sr: tSearchRec;
-begin
- if length(s)=0 then
- exit;
- if startetMit('"',s) then begin
- if pos('"',s)=0 then begin
- gibAus('Kein passendes zweites Anführungszeichen im Argument für den Befehl gefunden!',3);
- erfolg:=false;
- exit;
- end;
- result:=erstesArgument(s,'"');
- end
- else begin
- result:=stringReplace(erstesArgument(s),'$$DATETIME',mydatetimetostr(now),[rfReplaceAll]);
- if pos('*',result)>0 then begin
- err:=findFirst(result,$3F,sr);
- while err=0 do begin
- if (sr.Name<>'.') and (sr.Name<>'..') then s:=trim('"'+extractfilepath(result)+sr.Name+'" '+s);
- err:=findNext(sr);
- end;
- findClose(sr);
- result:=shellParseNextArg(s);
- end;
- end;
- if startetMit('./',result) then
- result:=extractfilepath(paramstr(0))+result;
- if result<>'' then
- nichtLeeresArgument:=true;
-end;
-begin
- if not st then
- inherited create;
-
- erfolg:=cmd<>'';
- if st then begin
- endetMit('&',cmd);
- shellParseNextArg(cmd);
- end
- else begin
- bg:=endetMit('&',cmd);
- p:=tProcess.create(nil);
- p.Options:=p.Options + [poWaitOnExit];
- p.Executable:=shellParseNextArg(cmd);
- end;
- nichtLeeresArgument:=cmd='';
- if not erfolg then begin
- if not st then begin
- p.free;
- p:=nil;
- end;
- exit;
- end;
- while length(cmd)>0 do begin
- if st then
- shellParseNextArg(cmd)
- else
- p.Parameters.Add(shellParseNextArg(cmd));
- if not erfolg then begin
- if not st then begin
- p.free;
- p:=nil;
- end;
- exit;
- end;
- end;
- if st then
- exit;
- if not nichtLeeresArgument then begin
- p.free;
- p:=nil;
- end;
- if assigned(p) then begin
- cmd:=p.Parameters.Text;
- while (length(cmd)>0) and (cmd[length(cmd)] in [#10,#13]) do
- delete(cmd,length(cmd),1);
- cmd:=''''+cmd+'''';
- while pos(#10,cmd)>0 do
- cmd:=leftStr(cmd,pos(#10,cmd)-1)+''' '''+copy(cmd,pos(#10,cmd)+1,length(cmd));
- while pos(#13,cmd)>0 do
- cmd:=leftStr(cmd,pos(#13,cmd)-1)+''' '''+copy(cmd,pos(#13,cmd)+1,length(cmd));
- gibAus('Externer Befehl: '''+p.Executable+''' '+cmd+' erzeugt.',3);
- end
- else
- gibAus('Des Befehls zu expandierende Argumente hatten keine Treffer, er wird ignoriert.',3);
+var
+ err: longint;
+ sr: tSearchRec;
+begin
+ if length(s)=0 then
+ exit;
+ if startetMit('"',s) then begin
+ if pos('"',s)=0 then begin
+ gibAus('Kein passendes zweites Anführungszeichen im Argument für den Befehl gefunden!',3);
+ erfolg:=false;
+ exit;
+ end;
+ result:=erstesArgument(s,'"');
+ end
+ else begin
+ result:=stringReplace(erstesArgument(s),'$$DATETIME',mydatetimetostr(now),[rfReplaceAll]);
+ if pos('*',result)>0 then begin
+ err:=findFirst(result,$3F,sr);
+ while err=0 do begin
+ if (sr.Name<>'.') and (sr.Name<>'..') then s:=trim('"'+extractfilepath(result)+sr.Name+'" '+s);
+ err:=findNext(sr);
+ end;
+ findClose(sr);
+ result:=shellParseNextArg(s);
+ end;
+ end;
+ if startetMit('./',result) then
+ result:=extractfilepath(paramstr(0))+result;
+ if result<>'' then
+ nichtLeeresArgument:=true;
+end;
+begin
+ if not st then
+ inherited create;
+
+ erfolg:=cmd<>'';
+ if st then begin
+ endetMit('&',cmd);
+ shellParseNextArg(cmd);
+ end
+ else begin
+ bg:=endetMit('&',cmd);
+ p:=tProcess.create(nil);
+ p.Options:=p.Options + [poWaitOnExit];
+ p.Executable:=shellParseNextArg(cmd);
+ end;
+ nichtLeeresArgument:=cmd='';
+ if not erfolg then begin
+ if not st then begin
+ p.free;
+ p:=nil;
+ end;
+ exit;
+ end;
+ while length(cmd)>0 do begin
+ if st then
+ shellParseNextArg(cmd)
+ else
+ p.Parameters.Add(shellParseNextArg(cmd));
+ if not erfolg then begin
+ if not st then begin
+ p.free;
+ p:=nil;
+ end;
+ exit;
+ end;
+ end;
+ if st then
+ exit;
+ if not nichtLeeresArgument then begin
+ p.free;
+ p:=nil;
+ end;
+ if assigned(p) then begin
+ cmd:=p.Parameters.Text;
+ while (length(cmd)>0) and (cmd[length(cmd)] in [#10,#13]) do
+ delete(cmd,length(cmd),1);
+ cmd:=''''+cmd+'''';
+ while pos(#10,cmd)>0 do
+ cmd:=leftStr(cmd,pos(#10,cmd)-1)+''' '''+copy(cmd,pos(#10,cmd)+1,length(cmd));
+ while pos(#13,cmd)>0 do
+ cmd:=leftStr(cmd,pos(#13,cmd)-1)+''' '''+copy(cmd,pos(#13,cmd)+1,length(cmd));
+ gibAus('Externer Befehl: '''+p.Executable+''' '+cmd+' erzeugt.',3);
+ end
+ else
+ gibAus('Des Befehls zu expandierende Argumente hatten keine Treffer, er wird ignoriert.',3);
end;
destructor tBefehlThread.destroy;
begin
- gibAus('Befehl zerstört.',3);
- p.free;
- inherited destroy;
+ gibAus('Befehl zerstört.',3);
+ p.free;
+ inherited destroy;
end;
procedure tBefehlThread.stExecute;
begin
- if assigned(p) then begin
- gibAus('externen Befehl ausführen ... '+inttostr(belegterSpeicher),3);
- gibAus(p.Executable,3);
- gibAus(p.Parameters.text,3);
- p.Execute;
- gibAus('... fertig!',1);
- end
- else
- gibAus('Externer Befehl hätte nichts zu tun und wird daher gar nicht erst gestartet.',1);
- fertig:=true;
+ if assigned(p) then begin
+ gibAus('externen Befehl ausführen ... '+inttostr(belegterSpeicher),3);
+ gibAus(p.Executable,3);
+ gibAus(p.Parameters.text,3);
+ p.Execute;
+ gibAus('... fertig!',1);
+ end
+ else
+ gibAus('Externer Befehl hätte nichts zu tun und wird daher gar nicht erst gestartet.',1);
+ fertig:=true;
end;
// tLeseThread *****************************************************************
constructor tLeseThread.create(we: tWerte; inps: tGenerischeInputDateiInfoArray);
-var i: longint;
-begin
- inherited create;
- w:=we;
- setlength(inputs,length(inps));
- for i:=0 to length(inputs)-1 do begin
- if inps[i] is tPhaseSpaceInputDateiInfo then begin
- inputs[i]:=tPhaseSpaceInputDateiInfo.create(inps[i]);
- continue;
- end;
- if inps[i] is tSpaceTimeInputDateiInfo then begin
- inputs[i]:=tSpaceTimeInputDateiInfo.create(inps[i]);
- continue;
- end;
- if inps[i] is tTraceInputDateiInfo then begin
- inputs[i]:=tTraceInputDateiInfo.create(inps[i]);
- continue;
- end;
- if inps[i] is tPipeInputDateiInfo then begin
- inputs[i]:=tPipeInputDateiInfo.create(inps[i]);
- continue;
- end;
- gibAus('unbekannter InputDateiInfo-Typ ...',3);
- halt(1);
- end;
- gibAus('LeseThread erzeugt',1);
- suspended:=false;
+var
+ i: longint;
+begin
+ inherited create;
+ w:=we;
+ setlength(inputs,length(inps));
+ for i:=0 to length(inputs)-1 do begin
+ if inps[i] is tPhaseSpaceInputDateiInfo then begin
+ inputs[i]:=tPhaseSpaceInputDateiInfo.create(inps[i]);
+ continue;
+ end;
+ if inps[i] is tSpaceTimeInputDateiInfo then begin
+ inputs[i]:=tSpaceTimeInputDateiInfo.create(inps[i]);
+ continue;
+ end;
+ if inps[i] is tTraceInputDateiInfo then begin
+ inputs[i]:=tTraceInputDateiInfo.create(inps[i]);
+ continue;
+ end;
+ if inps[i] is tPipeInputDateiInfo then begin
+ inputs[i]:=tPipeInputDateiInfo.create(inps[i]);
+ continue;
+ end;
+ gibAus('unbekannter InputDateiInfo-Typ ...',3);
+ halt(1);
+ end;
+ gibAus('LeseThread erzeugt',1);
+ suspended:=false;
end;
destructor tLeseThread.destroy;
begin
- w:=nil;
- inherited destroy;
+ w:=nil;
+ inherited destroy;
end;
procedure tLeseThread.stExecute;
begin
- gibAus('LeseThread gestartet',1);
- case w.Genauigkeit of
- gSingle:
- if not w.sWerte.liesDateien(inputs) then
- exit;
- gDouble:
- if not w.dWerte.liesDateien(inputs) then
- exit;
- gExtended:
- if not w.eWerte.liesDateien(inputs) then
- exit;
- end{of case};
- gibAus('LeseThread beendet',1);
- fertig:=true;
+ gibAus('LeseThread gestartet',1);
+ case w.Genauigkeit of
+ gSingle:
+ if not w.sWerte.liesDateien(inputs) then
+ exit;
+ gDouble:
+ if not w.dWerte.liesDateien(inputs) then
+ exit;
+ gExtended:
+ if not w.eWerte.liesDateien(inputs) then
+ exit;
+ end{of case};
+ gibAus('LeseThread beendet',1);
+ fertig:=true;
end;
// tVerzerrInitThread **********************************************************
-constructor tVerzerrInitThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformationen; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
-begin
- inherited create;
- qu:=quelle;
- zi:=ziel;
- ZPs:=zielpositionen;
- ZGs:=zielgewichte;
- setlength(ZAs,zi._xsteps*zi._tsiz);
- xMi:=xMin;
- xMa:=xMax;
- tMi:=tMin;
- tMa:=tMax;
- x0:=x0Abs;
- t0:=t0Abs;
- eps:=epsilon;
- verz:=verzerrung;
- mt:=threads;
- Warnstufe:=Warn;
- gibAus('VerzerrInitThread kreiert',1);
- suspended:=false;
+constructor tVerzerrInitThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax,x0Abs,t0Abs,threads: longint; epsilon: extended; verzerrung: tTransformation; verzerrAnz: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; Warn: tWarnstufe);
+begin
+ inherited create;
+ qu:=quelle;
+ zi:=ziel;
+ ZPs:=zielpositionen;
+ ZGs:=zielgewichte;
+ setlength(ZAs,zi._xsteps*zi._tsiz);
+ xMi:=xMin;
+ xMa:=xMax;
+ tMi:=tMin;
+ tMa:=tMax;
+ x0:=x0Abs;
+ t0:=t0Abs;
+ eps:=epsilon;
+ verz:=verzerrung;
+ va:=verzerrAnz;
+ mt:=threads;
+ Warnstufe:=Warn;
+ gibAus('VerzerrInitThread kreiert',1);
+ suspended:=false;
end;
destructor tVerzerrInitThread.destroy;
begin
- setlength(ZAs,0);
- inherited destroy;
+ setlength(ZAs,0);
+ inherited destroy;
end;
procedure tVerzerrInitThread.stExecute;
begin
- gibAus('VerzerrInitThread gestartet ('+inttostr(xMi)+'-'+inttostr(xMa)+'/'+inttostr(tMi)+'-'+inttostr(tMa)+')',1);
- zi.initVerzerrung(qu,xMi,xMa,tMi,tMa,x0,t0,mt,false,eps,verz,ZPs,ZGs,ZAs,Warnstufe);
- gibAus('VerzerrInitThread beendet',1);
+ gibAus('VerzerrInitThread gestartet ('+inttostr(xMi)+'-'+inttostr(xMa)+'/'+inttostr(tMi)+'-'+inttostr(tMa)+')',1);
+ zi.initVerzerrung(qu,xMi,xMa,tMi,tMa,x0,t0,mt,false,eps,verz,va,ZPs,ZGs,ZAs,Warnstufe);
+ gibAus('VerzerrInitThread beendet',1);
end;
// tVerzerrThread **************************************************************
-constructor tVerzerrThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformationen);
+constructor tVerzerrThread.create(quelle,ziel: tWerte; xMin,xMax,tMin,tMax: longint; zielpositionen: tIntPointArray; zielgewichte: tExtPointArray; zielanzahlen: tExtendedArray; Vorbearbeitungen,Nachbearbeitungen: tTransformation; vorAnz,nachAnz: longint);
begin
- inherited create;
- qu:=quelle;
- zi:=ziel;
- ZPs:=zielpositionen;
- ZGs:=zielgewichte;
- ZAs:=zielanzahlen;
- xMi:=xMin;
- xMa:=xMax;
- tMi:=tMin;
- tMa:=tMax;
- vb:=Vorbearbeitungen;
- nb:=Nachbearbeitungen;
- gibAus('Verzerrthread erzeugt',1);
- suspended:=false;
+ inherited create;
+ qu:=quelle;
+ zi:=ziel;
+ ZPs:=zielpositionen;
+ ZGs:=zielgewichte;
+ ZAs:=zielanzahlen;
+ xMi:=xMin;
+ xMa:=xMax;
+ tMi:=tMin;
+ tMa:=tMax;
+ vb:=Vorbearbeitungen;
+ va:=vorAnz;
+ nb:=Nachbearbeitungen;
+ na:=nachAnz;
+ gibAus('Verzerrthread erzeugt',1);
+ suspended:=false;
end;
destructor tVerzerrThread.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
procedure tVerzerrThread.stExecute;
-var sw: pTLLWerteSingle;
- dw: pTLLWerteDouble;
- ew: pTLLWerteExtended;
-begin
- gibAus('Verzerrthread gestartet '+floattostr(qu._minW)+' '+floattostr(qu._maxW),1);
- case qu.genauigkeit of
- gSingle: begin
- sw:=@(qu.sWerte);
- dw:=nil;
- ew:=nil;
- end;
- gDouble: begin
- sw:=nil;
- dw:=@(qu.dWerte);
- ew:=nil;
- end;
- gExtended: begin
- sw:=nil;
- dw:=nil;
- ew:=@(qu.eWerte);
- end;
- end{of case};
- case zi.genauigkeit of
- gSingle:
- case qu.genauigkeit of
- gSingle:
- zi.sWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gDouble:
- zi.sWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gExtended:
- zi.sWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- end{of case};
- gDouble:
- case qu.genauigkeit of
- gSingle:
- zi.dWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gDouble:
- zi.dWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gExtended:
- zi.dWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- end{of case};
- gExtended:
- case qu.genauigkeit of
- gSingle:
- zi.eWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gDouble:
- zi.eWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- gExtended:
- zi.eWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb);
- end{of case};
- end{of case};
- gibAus('Verzerrthread beendet',1);
+var
+ sw: pTLLWerteSingle;
+ dw: pTLLWerteDouble;
+ ew: pTLLWerteExtended;
+begin
+ gibAus('Verzerrthread gestartet '+floattostr(qu._minW)+' '+floattostr(qu._maxW),1);
+ case qu.genauigkeit of
+ gSingle: begin
+ sw:=@(qu.sWerte);
+ dw:=nil;
+ ew:=nil;
+ end;
+ gDouble: begin
+ sw:=nil;
+ dw:=@(qu.dWerte);
+ ew:=nil;
+ end;
+ gExtended: begin
+ sw:=nil;
+ dw:=nil;
+ ew:=@(qu.eWerte);
+ end;
+ end{of case};
+ case zi.genauigkeit of
+ gSingle:
+ case qu.genauigkeit of
+ gSingle:
+ zi.sWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gDouble:
+ zi.sWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gExtended:
+ zi.sWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ end{of case};
+ gDouble:
+ case qu.genauigkeit of
+ gSingle:
+ zi.dWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gDouble:
+ zi.dWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gExtended:
+ zi.dWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ end{of case};
+ gExtended:
+ case qu.genauigkeit of
+ gSingle:
+ zi.eWerte.kopiereVerzerrt(sw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gDouble:
+ zi.eWerte.kopiereVerzerrt(dw,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ gExtended:
+ zi.eWerte.kopiereVerzerrt(ew,ZPs,ZGs,ZAs,xMi,xMa,tMi,tMa,vb,nb,va,na);
+ end{of case};
+ end{of case};
+ gibAus('Verzerrthread beendet',1);
end;
// sonstiges *******************************************************************
function findePalette(out Palette: pTPalette; name: string): boolean;
-var i: longint;
+var
+ i: longint;
begin
- result:=true;
- for i:=0 to length(paletten)-1 do
+ result:=true;
+ for i:=0 to length(paletten)-1 do
if paletten[i].name=name then
- begin
+ begin
Palette:=@(paletten[i]);
exit;
- end;
- Palette:=nil;
- result:=false;
-end;
-
-function erzeugeLegende(st: boolean; var f: tMyStringlist; 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;
- img: file;
- lineareFarbe,waagerecht,rahmen: boolean;
- farben: tRgbArray;
- col: tRGB;
- wert,tmp,schritt: extended;
- fontRenderer: tFontRenderer;
- beschriftungsschritte: array of tBeschriftungsschritt;
- beschriftungen: array of tBeschriftung;
-begin
- result:=false;
- breite:=100;
- hoehe:=100;
- waagerecht:=false;
- lineareFarbe:=false;
- schriftgroesze:=24;
- setlength(beschriftungen,0);
- setlength(beschriftungsschritte,2);
- beschriftungsschritte[0].schritte:=0;
- beschriftungsschritte[0].bis:=minDichte;
- beschriftungsschritte[0].linear:=false;
- beschriftungsschritte[0].faktor:=1;
- beschriftungsschritte[1].bis:=maxDichte;
- beschriftungsschritte[1].schritte:=10;
- beschriftungsschritte[1].linear:=true;
- beschriftungsschritte[1].faktor:=1;
- rahmen:=false;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
- exit;
- end;
- if startetMit('Ausrichtung:',s) then begin
- waagerecht:=s='waagerecht';
- if (s='waagerecht') or (s='senkrecht') then continue;
- gibAus(''''+s+''' ist keine gültige Ausrichtung!',3);
- exit;
- end;
- if startetMit('Breite:',s) then begin
- breite:=strtoint(s);
- continue;
- end;
- if startetMit('Höhe:',s) then begin
- hoehe:=strtoint(s);
- continue;
- end;
- if startetMit('Schriftgröße:',s) then begin
- schriftgroesze:=strtoint(s);
- continue;
- end;
- if s='Farbe linear' then begin
- lineareFarbe:=true;
- continue;
- end;
- if s='Werte linear' then begin
- lineareFarbe:=false;
- continue;
- end;
- if s='Rahmen' then begin
- rahmen:=true;
- continue;
- end;
- if s='Beschriftungen:' then begin
- setlength(beschriftungsschritte,1);
- beschriftungsschritte[0].schritte:=0;
- beschriftungsschritte[0].bis:=minDichte;
- beschriftungsschritte[0].linear:=false;
- beschriftungsschritte[0].faktor:=1;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
- exit;
- end;
- if s='Beschriftungsende' then
- break;
- if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1) or (length(beschriftungsschritte)>1)) then begin
- gibAus('Ich weiß nicht, ob die Beschriftung linear oder logarithmisch sein soll!',3);
- exit;
- end;
- setlength(beschriftungsschritte,length(beschriftungsschritte)+1);
- if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1)) then begin
- beschriftungsschritte[length(beschriftungsschritte)-1].linear:=
- beschriftungsschritte[length(beschriftungsschritte)-2].linear;
- end;
- if startetMit('linear',s) then
- beschriftungsschritte[length(beschriftungsschritte)-1].linear:=true;
- if startetMit('logarithmisch',s) then begin
- beschriftungsschritte[length(beschriftungsschritte)-1].linear:=false;
- while pos(' ',s)=1 do
- delete(s,1,1);
- minDichte:=Qu.exprtofloat(st,copy(s,1,pos(' ',s)-1));
- beschriftungsschritte[0].bis:=maxDichte*minDichte;
- delete(s,1,pos(' ',s));
- for i:=0 to nb.count-1 do
- 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;
- break;
- end;
- end;
- s:=trim(s);
- beschriftungsschritte[length(beschriftungsschritte)-1].bis:=Qu.exprtofloat(st,erstesArgument(s));
- if endetMit('+',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=0.5
- else if endetMit('-',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=2
- else beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=1;
- beschriftungsschritte[length(beschriftungsschritte)-1].schritte:=strtoint(s);
- until false;
- continue;
- end;
- if s='Ende' then
- break;
- gibAus('Verstehe Option '''+s+''' nicht bei Erzeugund der Legende!',3);
- exit;
- until false;
- if st then begin
- result:=true;
- exit;
- end;
-
- fontRenderer:=tFontRenderer.create(schriftgroesze);
-
- gibAus(floattostr(minDichte)+' '+floattostr(maxDichte),1);
- for i:=0 to length(beschriftungsschritte)-1 do
- gibAus(inttostr(i)+' '+floattostr(beschriftungsschritte[i].bis)+' '+floattostr(beschriftungsschritte[i].faktor)+' '+inttostr(beschriftungsschritte[i].schritte)+' '+inttostr(byte(beschriftungsschritte[i].linear)),1);
-
- i:=0;
- wert:=minDichte;
- schritt:=-1;
- while wert<maxDichte do begin
- if i>0 then gibAus(inttostr(i)+' '+floattostr(wert)+' '+floattostr(schritt)+' '+floattostr(beschriftungsschritte[i].bis),1);
- if ((i<length(beschriftungsschritte)-1) and (wert>beschriftungsschritte[i].bis)) or (i=0) then begin
- repeat
- inc(i);
- until (i>=length(beschriftungsschritte)-1) or (beschriftungsschritte[i].bis>=wert);
- if beschriftungsschritte[i].linear then begin
- schritt:=(beschriftungsschritte[i].bis-beschriftungsschritte[i-1].bis)/beschriftungsschritte[i].schritte;
- schritt:=power(10,round(ln(schritt)/ln(10)))*beschriftungsschritte[i].faktor;
- end
- else
- schritt:=power(10,floor(ln(wert)/ln(10)-beschriftungsschritte[i].schritte))*beschriftungsschritte[i].faktor;
- tmp:=round(beschriftungsschritte[i-1].bis/schritt)*schritt;
- while tmp<wert do tmp:=(round(tmp/schritt)+1)*schritt;
- wert:=tmp;
- gibAus(inttostr(i)+' '+floattostr(wert)+' '+floattostr(schritt)+' '+floattostr(beschriftungsschritte[i].bis),1);
- end;
- setlength(beschriftungen,length(beschriftungen)+1);
- beschriftungen[length(beschriftungen)-1]:=tBeschriftung.create;
- beschriftungen[length(beschriftungen)-1].bBreite:=breite;
- beschriftungen[length(beschriftungen)-1].bHoehe:=hoehe;
- beschriftungen[length(beschriftungen)-1].Rahmen:=Rahmen;
- beschriftungen[length(beschriftungen)-1].fontRend:=fontRenderer;
- beschriftungen[length(beschriftungen)-1].position:=(wert-minDichte)/(maxDichte-minDichte);
- beschriftungen[length(beschriftungen)-1].inhalt:=floattostr(wert);
- if not beschriftungsschritte[i].linear then
- schritt:=power(10,floor(ln(wert)/ln(10)-beschriftungsschritte[i].schritte))*beschriftungsschritte[i].faktor;
- wert:=(round(wert/schritt)+1)*schritt;
- end;
-
- if lineareFarbe then
- 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));
-
- lo:=Byte(Rahmen);
- ro:=Byte(Rahmen);
- oo:=Byte(Rahmen);
- uo:=Byte(Rahmen);
- for i:=0 to length(beschriftungen)-1 do begin
- lo:=max(lo,-beschriftungen[i].links);
- ro:=max(ro,1+beschriftungen[i].rechts-breite);
- oo:=max(oo,-beschriftungen[i].oben);
- uo:=max(uo,1+beschriftungen[i].unten-hoehe);
- end;
- if lo+oo+ro+uo>0 then
- gibAus('Extra-Ränder: '+inttostr(lo)+' Pixel links, '+inttostr(oo)+' Pixel oben, '+inttostr(ro)+' Pixel rechts und '+inttostr(uo)+' Pixel unten.',3);
-
- setlength(farben,byte(waagerecht)*(breite-hoehe)+hoehe);
- for i:=0 to length(farben)-1 do begin
- wert:=i/length(farben);
- if not lineareFarbe then
- wert:=nb.transformiereWert(wert);
- farben[i]:=wertZuFarbe(wert,pal^.farben);
- end;
- assign(img,datei);
- rewrite(img,1);
- schreibeBmpHeader(img,breite+lo+ro,hoehe+oo+uo);
- for j:=-oo to hoehe+uo-1 do begin
- i:=-lo;
- while i<breite+ro do
- if waagerecht and (i=0) and (j>=0) and (j<hoehe) then begin
- blockwrite(img,farben[0],3*breite);
- i:=breite;
- end
- else begin
- if (i>=0) and (i<breite) and (j>=0) and (j<hoehe) then col:=farben[j]
- else begin
- col.rgbRed:=$ff;
- col.rgbGreen:=$ff;
- col.rgbBlue:=$ff;
- if rahmen then begin
- if ((i=-1) and (j>=-1) and (j<=hoehe)) or
+ end;
+ Palette:=nil;
+ result:=false;
+end;
+
+function erzeugeLegende(st: boolean; var f: tMyStringlist; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformation; pal: pTPalette): boolean;
+var
+ s: string;
+ breite,hoehe,i,j,k,lo,ro,oo,uo,
+ schriftgroesze: longint;
+ img: file;
+ lineareFarbe,waagerecht,rahmen: boolean;
+ farben: tRgbArray;
+ col: tRGB;
+ wert,tmp,schritt: extended;
+ fontRenderer: tFontRenderer;
+ beschriftungsschritte: array of tBeschriftungsschritt;
+ beschriftungen: array of tBeschriftung;
+ tmpTr: tTransformation;
+begin
+ result:=false;
+ breite:=100;
+ hoehe:=100;
+ waagerecht:=false;
+ lineareFarbe:=false;
+ schriftgroesze:=24;
+ setlength(beschriftungen,0);
+ setlength(beschriftungsschritte,2);
+ beschriftungsschritte[0].schritte:=0;
+ beschriftungsschritte[0].bis:=minDichte;
+ beschriftungsschritte[0].linear:=false;
+ beschriftungsschritte[0].faktor:=1;
+ beschriftungsschritte[1].bis:=maxDichte;
+ beschriftungsschritte[1].schritte:=10;
+ beschriftungsschritte[1].linear:=true;
+ beschriftungsschritte[1].faktor:=1;
+ rahmen:=false;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
+ exit;
+ end;
+ if startetMit('Ausrichtung:',s) then begin
+ waagerecht:=s='waagerecht';
+ if (s='waagerecht') or (s='senkrecht') then continue;
+ gibAus(''''+s+''' ist keine gültige Ausrichtung!',3);
+ exit;
+ end;
+ if startetMit('Breite:',s) then begin
+ breite:=strtoint(s);
+ continue;
+ end;
+ if startetMit('Höhe:',s) then begin
+ hoehe:=strtoint(s);
+ continue;
+ end;
+ if startetMit('Schriftgröße:',s) then begin
+ schriftgroesze:=strtoint(s);
+ continue;
+ end;
+ if s='Farbe linear' then begin
+ lineareFarbe:=true;
+ continue;
+ end;
+ if s='Werte linear' then begin
+ lineareFarbe:=false;
+ continue;
+ end;
+ if s='Rahmen' then begin
+ rahmen:=true;
+ continue;
+ end;
+ if s='Beschriftungen:' then begin
+ setlength(beschriftungsschritte,1);
+ beschriftungsschritte[0].schritte:=0;
+ beschriftungsschritte[0].bis:=minDichte;
+ beschriftungsschritte[0].linear:=false;
+ beschriftungsschritte[0].faktor:=1;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
+ exit;
+ end;
+ if s='Beschriftungsende' then
+ break;
+ if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1) or (length(beschriftungsschritte)>1)) then begin
+ gibAus('Ich weiß nicht, ob die Beschriftung linear oder logarithmisch sein soll!',3);
+ exit;
+ end;
+ setlength(beschriftungsschritte,length(beschriftungsschritte)+1);
+ if not ((pos('linear',s)=1) or (pos('logarithmisch',s)=1)) then begin
+ beschriftungsschritte[length(beschriftungsschritte)-1].linear:=
+ beschriftungsschritte[length(beschriftungsschritte)-2].linear;
+ end;
+ if startetMit('linear',s) then
+ beschriftungsschritte[length(beschriftungsschritte)-1].linear:=true;
+ if startetMit('logarithmisch',s) then begin
+ beschriftungsschritte[length(beschriftungsschritte)-1].linear:=false;
+ while pos(' ',s)=1 do
+ delete(s,1,1);
+ minDichte:=Qu.exprtofloat(st,copy(s,1,pos(' ',s)-1));
+ beschriftungsschritte[0].bis:=maxDichte*minDichte;
+ delete(s,1,pos(' ',s));
+ tmpTr:=nb;
+ while assigned(tmpTr) do begin
+ if tmpTr is tWerteLogTransformation then begin
+ if (tmpTr as tWerteLogTransformation).logMin<>minDichte then begin
+ gibAus('Die minimale Dichte der logarithmischen Farbskala ('+myfloattostr(minDichte)+') und der logarithmischen Nachbearbeitung ('+myfloattostr((tmpTr as tWerteLogTransformation).logMin)+') stimmen nicht überein!',3);
+ exit;
+ end;
+ minDichte:=minDichte*maxDichte;
+ break;
+ end;
+ tmpTr:=tmpTr.beliebigerVorgaenger;
+ end;
+ end;
+ s:=trim(s);
+ beschriftungsschritte[length(beschriftungsschritte)-1].bis:=Qu.exprtofloat(st,erstesArgument(s));
+ if endetMit('+',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=0.5
+ else if endetMit('-',s) then beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=2
+ else beschriftungsschritte[length(beschriftungsschritte)-1].faktor:=1;
+ beschriftungsschritte[length(beschriftungsschritte)-1].schritte:=strtoint(s);
+ until false;
+ continue;
+ end;
+ if s='Ende' then
+ break;
+ gibAus('Verstehe Option '''+s+''' nicht bei Erzeugund der Legende!',3);
+ exit;
+ until false;
+ if st then begin
+ result:=true;
+ exit;
+ end;
+
+ fontRenderer:=tFontRenderer.create(schriftgroesze);
+
+ gibAus(floattostr(minDichte)+' '+floattostr(maxDichte),1);
+ for i:=0 to length(beschriftungsschritte)-1 do
+ gibAus(inttostr(i)+' '+floattostr(beschriftungsschritte[i].bis)+' '+floattostr(beschriftungsschritte[i].faktor)+' '+inttostr(beschriftungsschritte[i].schritte)+' '+inttostr(byte(beschriftungsschritte[i].linear)),1);
+
+ i:=0;
+ wert:=minDichte;
+ schritt:=-1;
+ while wert<maxDichte do begin
+ if i>0 then gibAus(inttostr(i)+' '+floattostr(wert)+' '+floattostr(schritt)+' '+floattostr(beschriftungsschritte[i].bis),1);
+ if ((i<length(beschriftungsschritte)-1) and (wert>beschriftungsschritte[i].bis)) or (i=0) then begin
+ repeat
+ inc(i);
+ until (i>=length(beschriftungsschritte)-1) or (beschriftungsschritte[i].bis>=wert);
+ if beschriftungsschritte[i].linear then begin
+ schritt:=(beschriftungsschritte[i].bis-beschriftungsschritte[i-1].bis)/beschriftungsschritte[i].schritte;
+ schritt:=power(10,round(ln(schritt)/ln(10)))*beschriftungsschritte[i].faktor;
+ end
+ else
+ schritt:=power(10,floor(ln(wert)/ln(10)-beschriftungsschritte[i].schritte))*beschriftungsschritte[i].faktor;
+ tmp:=round(beschriftungsschritte[i-1].bis/schritt)*schritt;
+ while tmp<wert do tmp:=(round(tmp/schritt)+1)*schritt;
+ wert:=tmp;
+ gibAus(inttostr(i)+' '+floattostr(wert)+' '+floattostr(schritt)+' '+floattostr(beschriftungsschritte[i].bis),1);
+ end;
+ setlength(beschriftungen,length(beschriftungen)+1);
+ beschriftungen[length(beschriftungen)-1]:=tBeschriftung.create;
+ beschriftungen[length(beschriftungen)-1].bBreite:=breite;
+ beschriftungen[length(beschriftungen)-1].bHoehe:=hoehe;
+ beschriftungen[length(beschriftungen)-1].Rahmen:=Rahmen;
+ beschriftungen[length(beschriftungen)-1].fontRend:=fontRenderer;
+ beschriftungen[length(beschriftungen)-1].position:=(wert-minDichte)/(maxDichte-minDichte);
+ beschriftungen[length(beschriftungen)-1].inhalt:=floattostr(wert);
+ if not beschriftungsschritte[i].linear then
+ schritt:=power(10,floor(ln(wert)/ln(10)-beschriftungsschritte[i].schritte))*beschriftungsschritte[i].faktor;
+ wert:=(round(wert/schritt)+1)*schritt;
+ end;
+
+ if lineareFarbe then
+ 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));
+
+ lo:=Byte(Rahmen);
+ ro:=Byte(Rahmen);
+ oo:=Byte(Rahmen);
+ uo:=Byte(Rahmen);
+ for i:=0 to length(beschriftungen)-1 do begin
+ lo:=max(lo,-beschriftungen[i].links);
+ ro:=max(ro,1+beschriftungen[i].rechts-breite);
+ oo:=max(oo,-beschriftungen[i].oben);
+ uo:=max(uo,1+beschriftungen[i].unten-hoehe);
+ end;
+ if lo+oo+ro+uo>0 then
+ gibAus('Extra-Ränder: '+inttostr(lo)+' Pixel links, '+inttostr(oo)+' Pixel oben, '+inttostr(ro)+' Pixel rechts und '+inttostr(uo)+' Pixel unten.',3);
+
+ setlength(farben,byte(waagerecht)*(breite-hoehe)+hoehe);
+ for i:=0 to length(farben)-1 do begin
+ wert:=i/length(farben);
+ if not lineareFarbe then
+ wert:=nb.transformiereWert(wert);
+ farben[i]:=wertZuFarbe(wert,pal^.farben);
+ end;
+ assign(img,datei);
+ rewrite(img,1);
+ schreibeBmpHeader(img,breite+lo+ro,hoehe+oo+uo);
+ for j:=-oo to hoehe+uo-1 do begin
+ i:=-lo;
+ while i<breite+ro do
+ if waagerecht and (i=0) and (j>=0) and (j<hoehe) then begin
+ blockwrite(img,farben[0],3*breite);
+ i:=breite;
+ end
+ else begin
+ if (i>=0) and (i<breite) and (j>=0) and (j<hoehe) then col:=farben[j]
+ else begin
+ col.rgbRed:=$ff;
+ col.rgbGreen:=$ff;
+ col.rgbBlue:=$ff;
+ if rahmen then begin
+ if ((i=-1) and (j>=-1) and (j<=hoehe)) or
((i=breite) and (j>=-1) and (j<=hoehe)) or
((j=-1) and (i>=-1) and (i<=breite)) or
((j=hoehe) and (i>=-1) and (i<=breite)) then begin
- col.rgbRed:=$00;
- col.rgbGreen:=$00;
- col.rgbBlue:=$00;
- end;
- end;
- for k:=0 to length(Beschriftungen)-1 do
- with Beschriftungen[k] do begin
- if (links<=i) and (rechts>=i) and (oben<=j) and (unten>=j) then
- col:=andFarben(col,bild.farben[i-links + (j-oben)*bild.breite]);
- if ((bBreite<=i) and (i<bBreite+4+byte(Rahmen)) and (lage = lRechts) and (strich=j)) or
+ col.rgbRed:=$00;
+ col.rgbGreen:=$00;
+ col.rgbBlue:=$00;
+ end;
+ end;
+ for k:=0 to length(Beschriftungen)-1 do
+ with Beschriftungen[k] do begin
+ if (links<=i) and (rechts>=i) and (oben<=j) and (unten>=j) then
+ col:=andFarben(col,bild.farben[i-links + (j-oben)*bild.breite]);
+ if ((bBreite<=i) and (i<bBreite+4+byte(Rahmen)) and (lage = lRechts) and (strich=j)) or
((-4<=i+byte(Rahmen)) and (i<0) and (lage = lLinks) and (strich=j)) or
((bHoehe<=j) and (j<bHoehe+4+byte(Rahmen)) and (lage = lOben) and (strich=i)) or
((-4<=j+byte(Rahmen)) and (j<0) and (lage = lUnten) and (strich=i)) then begin
col.rgbRed:=$00;
col.rgbGreen:=$00;
col.rgbBlue:=$00;
- end;
- end;
- end;
- blockwrite(img,col,3);
- inc(i);
- end;
- i:=0;
- blockwrite(img,i,(4-(((breite+lo+ro)*3) mod 4)) mod 4);
- end;
+ end;
+ end;
+ end;
+ blockwrite(img,col,3);
+ inc(i);
+ end;
+ i:=0;
+ blockwrite(img,i,(4-(((breite+lo+ro)*3) mod 4)) mod 4);
+ end;
- for i:=0 to length(beschriftungen)-1 do
- beschriftungen[i].free;
- setlength(beschriftungen,0);
+ for i:=0 to length(beschriftungen)-1 do
+ beschriftungen[i].free;
+ setlength(beschriftungen,0);
- close(img);
- fontRenderer.free;
- result:=true;
+ close(img);
+ fontRenderer.free;
+ result:=true;
end;
function strToFftDo(out fftDo: tFFTDatenordnung; s: string): boolean;
@@ -5822,50 +5958,50 @@ var
i: integer;
istZahl: boolean;
begin
- s:=trimAll(s);
- result:=length(pws^)*byte(s=''); // kleine Abkürzung
- while (result<length(pws^)) and (pws^[result].bezeichner<>s) do
- inc(result);
- if result<length(pws^) then begin // Werte gefunden!
- pws^[result].warteaufBeendigungDesLeseThreads;
- exit;
- end;
+ s:=trimAll(s);
+ result:=length(pws^)*byte(s=''); // kleine Abkürzung
+ while (result<length(pws^)) and (pws^[result].bezeichner<>s) do
+ inc(result);
+ if result<length(pws^) then begin // Werte gefunden!
+ pws^[result].warteaufBeendigungDesLeseThreads;
+ exit;
+ end;
- istZahl:=length(s)>0;
- for i:=1 to length(s) do
- istZahl:=istZahl and (s[i] in ['0'..'9']);
+ istZahl:=length(s)>0;
+ for i:=1 to length(s) do
+ istZahl:=istZahl and (s[i] in ['0'..'9']);
- if istZahl then begin // bei s handelt es sich um den Index selbst
- result:=strtoint(s);
- if (result<0) or (result>=length(pws^)) then begin
- gibAus('Index ('+s+') liegt außerhalb des gültigen Bereichs (0..'+inttostr(length(pws^)-1)+')!',3);
- result:=-1;
- end
- else
- pws^[result].warteaufBeendigungDesLeseThreads;
- exit;
- end;
+ if istZahl then begin // bei s handelt es sich um den Index selbst
+ result:=strtoint(s);
+ if (result<0) or (result>=length(pws^)) then begin
+ gibAus('Index ('+s+') liegt außerhalb des gültigen Bereichs (0..'+inttostr(length(pws^)-1)+')!',3);
+ result:=-1;
+ end
+ else
+ pws^[result].warteaufBeendigungDesLeseThreads;
+ exit;
+ end;
- if not darfErstellen then begin
- gibAus('Ich habe Werte '''+s+''' nicht gefunden und darf sie auch nicht erstellen!',3);
- result:=-1;
- exit;
- end;
+ if not darfErstellen then begin
+ gibAus('Ich habe Werte '''+s+''' nicht gefunden und darf sie auch nicht erstellen!',3);
+ result:=-1;
+ exit;
+ end;
- setlength(pws^,length(pws^)+1);
- pws^[length(pws^)-1]:=tWerte.create(Kont,pws);
- pws^[length(pws^)-1].bezeichner:=s;
+ setlength(pws^,length(pws^)+1);
+ pws^[length(pws^)-1]:=tWerte.create(Kont,pws);
+ pws^[length(pws^)-1].bezeichner:=s;
- i:=f.count-1;
- while (i>=0) and not f.needInLine(s,i) do
- dec(i);
+ i:=f.count-1;
+ while (i>=0) and not f.needInLine(s,i) do
+ dec(i);
- // i ist das letzte Vorkommen von s in f
+ // i ist das letzte Vorkommen von s in f
- if pos('lösche Werte ',f[i])=0 then // wenn es sich um einen Löschbefehl handelt, machen wir nichts
- f.insert(i+1,'lösche Werte '+s); // ansonsten veranlassen wir die Löschung
+ if pos('lösche Werte ',f[i])=0 then // wenn es sich um einen Löschbefehl handelt, machen wir nichts
+ f.insert(i+1,'lösche Werte '+s); // ansonsten veranlassen wir die Löschung
- result:=length(pws^)-1;
+ result:=length(pws^)-1;
end;
function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer;
@@ -5873,285 +6009,289 @@ var
i: integer;
istZahl: boolean;
begin
- s:=trimAll(s);
- result:=length(pks^)*byte(s=''); // kleine Abkürzung
- while (result<length(pks^)) and (pks^[result].bezeichner<>s) do
- inc(result);
- if result<length(pks^) then exit; // Kontur gefunden!
-
- istZahl:=length(s)>0;
- for i:=1 to length(s) do
- istZahl:=istZahl and (s[i] in ['0'..'9']);
-
- if istZahl then begin // bei s handelt es sich um den Index selbst
- result:=strtoint(s);
- if (result<0) or (result>=length(pks^)) then begin
- gibAus('Index ('+s+') liegt außerhalb des gültigen Bereichs (0..'+inttostr(length(pks^)-1)+')!',3);
- result:=-1;
- end;
- exit;
- end;
+ s:=trimAll(s);
+ result:=length(pks^)*byte(s=''); // kleine Abkürzung
+ while (result<length(pks^)) and (pks^[result].bezeichner<>s) do
+ inc(result);
+ if result<length(pks^) then exit; // Kontur gefunden!
+
+ istZahl:=length(s)>0;
+ for i:=1 to length(s) do
+ istZahl:=istZahl and (s[i] in ['0'..'9']);
+
+ if istZahl then begin // bei s handelt es sich um den Index selbst
+ result:=strtoint(s);
+ if (result<0) or (result>=length(pks^)) then begin
+ gibAus('Index ('+s+') liegt außerhalb des gültigen Bereichs (0..'+inttostr(length(pks^)-1)+')!',3);
+ result:=-1;
+ end;
+ exit;
+ end;
- if not darfErstellen then begin
- gibAus('Ich habe Konturen '''+s+''' nicht gefunden und darf sie auch nicht erstellen!',3);
- result:=-1;
- exit;
- end;
+ if not darfErstellen then begin
+ gibAus('Ich habe Konturen '''+s+''' nicht gefunden und darf sie auch nicht erstellen!',3);
+ result:=-1;
+ exit;
+ end;
- setlength(pks^,length(pks^)+1);
- pks^[length(pks^)-1]:=tKontur.create;
- pks^[length(pks^)-1].bezeichner:=s;
+ setlength(pks^,length(pks^)+1);
+ pks^[length(pks^)-1]:=tKontur.create;
+ pks^[length(pks^)-1].bezeichner:=s;
- i:=f.count-1;
- while (i>=0) and not f.needInLine(s,i) do
- dec(i);
+ i:=f.count-1;
+ while (i>=0) and not f.needInLine(s,i) do
+ dec(i);
- // i ist das letzte Vorkommen von s in f
+ // i ist das letzte Vorkommen von s in f
- if pos('lösche Kontur ',f[i])=0 then // wenn es sich um einen Löschbefehl handelt, machen wir nichts
- f.insert(i+1,'lösche Kontur '+s); // ansonsten veranlassen wir die Löschung
+ if pos('lösche Kontur ',f[i])=0 then // wenn es sich um einen Löschbefehl handelt, machen wir nichts
+ f.insert(i+1,'lösche Kontur '+s); // ansonsten veranlassen wir die Löschung
- result:=length(pks^)-1;
+ result:=length(pks^)-1;
end;
function initBmpHeader(w,h: longint): tBmpHeader;
begin
- With result do begin
- bfType1 := $42;
- bfType2 := $4D;
- bfSize := $36 + ((3*w+3) div 4)*4*h;
- bfReserved1 := $0000;
- bfReserved2 := $0000;
- bfOffBits := $36;
- biSize := $28;
- biWidth := w;
- biHeight := h;
- biPlanes := $0001;
- biBitCount := $0018;
- biCompression := $00000000;
- biSizeImage := ((3*w+3) div 4)*4*h;
- biXPelsPerMeter := $00000000;
- biYPelsPerMeter := $00000000;
- biClrUsed := $00000000;
- biClrImportant := $00000000;
- end;
+ With result do begin
+ bfType1 := $42;
+ bfType2 := $4D;
+ bfSize := $36 + ((3*w+3) div 4)*4*h;
+ bfReserved1 := $0000;
+ bfReserved2 := $0000;
+ bfOffBits := $36;
+ biSize := $28;
+ biWidth := w;
+ biHeight := h;
+ biPlanes := $0001;
+ biBitCount := $0018;
+ biCompression := $00000000;
+ biSizeImage := ((3*w+3) div 4)*4*h;
+ biXPelsPerMeter := $00000000;
+ biYPelsPerMeter := $00000000;
+ biClrUsed := $00000000;
+ biClrImportant := $00000000;
+ end;
end;
procedure schreibeBmpHeader(var f: file; w,h: longint);
-var bmpHeader: tBmpHeader;
+var
+ bmpHeader: tBmpHeader;
begin
- bmpHeader:=initBmpHeader(w,h);
- blockwrite(f,bmpHeader,sizeof(bmpHeader));
+ bmpHeader:=initBmpHeader(w,h);
+ blockwrite(f,bmpHeader,sizeof(bmpHeader));
end;
function neuePalette(var f: tMyStringlist): boolean;
-var s,name: string;
- Palette: tRGBArray;
- i,tmpi: longint;
- nPalette: pTPalette;
-begin
- result:=false;
- setlength(Palette,0);
- name:='';
- nPalette:=nil;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
- exit;
- end;
- if s='Ende' then break;
- if startetMit('Name:',s) then begin
- name:=s;
- findePalette(nPalette,s);
- continue;
- end;
- if (length(s)=6) and (s[1] in ['0'..'9','a'..'f']) and
+var
+ s,name: string;
+ Palette: tRGBArray;
+ i,tmpi: longint;
+ nPalette: pTPalette;
+begin
+ result:=false;
+ setlength(Palette,0);
+ name:='';
+ nPalette:=nil;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende in '''+paramstr(1)+'''!',3);
+ exit;
+ end;
+ if s='Ende' then break;
+ if startetMit('Name:',s) then begin
+ name:=s;
+ findePalette(nPalette,s);
+ continue;
+ end;
+ if (length(s)=6) and (s[1] in ['0'..'9','a'..'f']) and
(s[2] in ['0'..'9','a'..'f']) and
(s[3] in ['0'..'9','a'..'f']) and
(s[4] in ['0'..'9','a'..'f']) and
(s[5] in ['0'..'9','a'..'f']) and
(s[6] in ['0'..'9','a'..'f']) then begin
- setlength(Palette,length(Palette)+1);
- tmpi:=0;
- for i:=1 to 6 do begin
- tmpi:=tmpi shl 4;
- if s[i] in ['0'..'9'] then
- tmpi:=tmpi + ord(s[i])-ord('0')
- else
- tmpi:=tmpi + ord(s[i])-ord('a')+10;
- end;
- Palette[length(Palette)-1].rgbRed:= tmpi and $0000ff;
- Palette[length(Palette)-1].rgbGreen:=(tmpi and $00ff00) shr 8;
- Palette[length(Palette)-1].rgbBlue:= (tmpi and $ff0000) shr 16;
- continue;
- end;
- gibAus(''''+s+''' ist keine Farbe für eine Palette!',3);
- exit;
- until false;
- if name='' then begin
- gibAus('Die Palette braucht einen Namen!',3);
- exit;
- end;
- if length(Palette)<2 then begin
- gibAus('Zu wenige Farben in der Palette '''+name+''', nämlich nur '+inttostr(length(Palette)),3);
- exit;
- end;
- if nPalette=nil then begin
- setlength(Paletten,length(Paletten)+1);
- nPalette:=@(Paletten[length(Paletten)-1]);
- end;
- nPalette^.name:=name;
- setlength(nPalette^.farben,length(Palette));
- for i:=0 to length(Palette)-1 do
- nPalette^.farben[i]:=Palette[i];
- gibAus('Neue Palette '''+nPalette^.name+''' erstellt!',3);
- result:=true;
+ setlength(Palette,length(Palette)+1);
+ tmpi:=0;
+ for i:=1 to 6 do begin
+ tmpi:=tmpi shl 4;
+ if s[i] in ['0'..'9'] then
+ tmpi:=tmpi + ord(s[i])-ord('0')
+ else
+ tmpi:=tmpi + ord(s[i])-ord('a')+10;
+ end;
+ Palette[length(Palette)-1].rgbRed:= tmpi and $0000ff;
+ Palette[length(Palette)-1].rgbGreen:=(tmpi and $00ff00) shr 8;
+ Palette[length(Palette)-1].rgbBlue:= (tmpi and $ff0000) shr 16;
+ continue;
+ end;
+ gibAus(''''+s+''' ist keine Farbe für eine Palette!',3);
+ exit;
+ until false;
+ if name='' then begin
+ gibAus('Die Palette braucht einen Namen!',3);
+ exit;
+ end;
+ if length(Palette)<2 then begin
+ gibAus('Zu wenige Farben in der Palette '''+name+''', nämlich nur '+inttostr(length(Palette)),3);
+ exit;
+ end;
+ if nPalette=nil then begin
+ setlength(Paletten,length(Paletten)+1);
+ nPalette:=@(Paletten[length(Paletten)-1]);
+ end;
+ nPalette^.name:=name;
+ setlength(nPalette^.farben,length(Palette));
+ for i:=0 to length(Palette)-1 do
+ nPalette^.farben[i]:=Palette[i];
+ gibAus('Neue Palette '''+nPalette^.name+''' erstellt!',3);
+ result:=true;
end;
function externerBefehl(st: boolean; s: string): boolean;
-var bt: tBefehlThread;
+var
+ bt: tBefehlThread;
begin
- bt:=tBefehlThread.create(st,s,result);
- if st then begin
+ bt:=tBefehlThread.create(st,s,result);
+ if st then begin
// bt.free;
- exit;
- end;
- if not result then begin
- try
- bt.free;
- except
- end;
- exit;
- end;
- bt.suspended:=false;
- gibAus('Befehl gestartet.',3);
- if bt.bg then begin
- setlength(externeBefehle,length(externeBefehle)+1);
- externeBefehle[length(externeBefehle)-1]:=bt;
- exit; // Job läuft im Hintergrund weiter!
- end;
- while not bt.fertig do
- sleep(10);
- bt.free;
+ exit;
+ end;
+ if not result then begin
+ try
+ bt.free;
+ except
+ end;
+ exit;
+ end;
+ bt.suspended:=false;
+ gibAus('Befehl gestartet.',3);
+ if bt.bg then begin
+ setlength(externeBefehle,length(externeBefehle)+1);
+ externeBefehle[length(externeBefehle)-1]:=bt;
+ exit; // Job läuft im Hintergrund weiter!
+ end;
+ while not bt.fertig do
+ sleep(10);
+ bt.free;
end;
procedure warte_auf_externeBefehle;
-var i: longint;
- b,c: boolean;
-begin
- c:=true;
- repeat
- b:=false;
- for i:=0 to length(externeBefehle)-1 do
- b:=b or (assigned(externeBefehle[i]) and not externeBefehle[i].fertig);
- if b then begin
- if c then gibAus('Warte auf Beendigung externer Befehle ...',3);
- c:=false;
- sleep(10);
- end;
- until not b;
- if not c then
- gibAus('... alle externen Befehle fertig.',3);
- for i:=0 to length(externeBefehle)-1 do
- if assigned(externeBefehle[i]) then externeBefehle[i].free;
- setlength(externeBefehle,0);
+var
+ i: longint;
+ b,c: boolean;
+begin
+ c:=true;
+ repeat
+ b:=false;
+ for i:=0 to length(externeBefehle)-1 do
+ b:=b or (assigned(externeBefehle[i]) and not externeBefehle[i].fertig);
+ if b then begin
+ if c then gibAus('Warte auf Beendigung externer Befehle ...',3);
+ c:=false;
+ sleep(10);
+ end;
+ until not b;
+ if not c then
+ gibAus('... alle externen Befehle fertig.',3);
+ for i:=0 to length(externeBefehle)-1 do
+ if assigned(externeBefehle[i]) then externeBefehle[i].free;
+ setlength(externeBefehle,0);
end;
procedure beendeExterneBefehleWennFertig;
var
i,j: longint;
begin
- for i:=length(externeBefehle)-1 downto 0 do
- if assigned(externeBefehle) then
- if externeBefehle[i].fertig then begin
- externeBefehle[i].free;
- for j:=i+1 to length(externeBefehle)-1 do
- externeBefehle[j-1]:=externeBefehle[j];
- setlength(externeBefehle,length(externeBefehle)-1);
- end;
-end;
-
-begin
- setlength(externeBefehle,0);
-
- setlength(Paletten,5);
- Paletten[0].name:='Graustufen';
- setlength(Paletten[0].farben,2);
- Paletten[0].farben[0].rgbRed:= $ff;
- Paletten[0].farben[0].rgbGreen:=$ff;
- Paletten[0].farben[0].rgbBlue:= $ff;
- Paletten[0].farben[1].rgbRed:= $00;
- Paletten[0].farben[1].rgbGreen:=$00;
- Paletten[0].farben[1].rgbBlue:= $00;
-
- Paletten[1].name:='invertierte Graustufen';
- setlength(Paletten[1].farben,2);
- Paletten[1].farben[0].rgbRed:= $00;
- Paletten[1].farben[0].rgbGreen:=$00;
- Paletten[1].farben[0].rgbBlue:= $00;
- Paletten[1].farben[1].rgbRed:= $ff;
- Paletten[1].farben[1].rgbGreen:=$ff;
- Paletten[1].farben[1].rgbBlue:= $ff;
-
- Paletten[2].name:='Regenbogen';
- setlength(Paletten[2].farben,6);
- Paletten[2].farben[0].rgbRed:= $00;
- Paletten[2].farben[0].rgbGreen:=$00;
- Paletten[2].farben[0].rgbBlue:= $ff;
- Paletten[2].farben[1].rgbRed:= $00;
- Paletten[2].farben[1].rgbGreen:=$ff;
- Paletten[2].farben[1].rgbBlue:= $ff;
- Paletten[2].farben[2].rgbRed:= $00;
- Paletten[2].farben[2].rgbGreen:=$ff;
- Paletten[2].farben[2].rgbBlue:= $00;
- Paletten[2].farben[3].rgbRed:= $ff;
- Paletten[2].farben[3].rgbGreen:=$ff;
- Paletten[2].farben[3].rgbBlue:= $00;
- Paletten[2].farben[4].rgbRed:= $ff;
- Paletten[2].farben[4].rgbGreen:=$00;
- Paletten[2].farben[4].rgbBlue:= $00;
- Paletten[2].farben[5].rgbRed:= $00;
- Paletten[2].farben[5].rgbGreen:=$00;
- Paletten[2].farben[5].rgbBlue:= $00;
-
- Paletten[3].name:='invertierter Regenbogen';
- setlength(Paletten[3].farben,6);
- Paletten[3].farben[0].rgbRed:= $00;
- Paletten[3].farben[0].rgbGreen:=$00;
- Paletten[3].farben[0].rgbBlue:= $00;
- Paletten[3].farben[1].rgbRed:= $ff;
- Paletten[3].farben[1].rgbGreen:=$00;
- Paletten[3].farben[1].rgbBlue:= $00;
- Paletten[3].farben[2].rgbRed:= $ff;
- Paletten[3].farben[2].rgbGreen:=$ff;
- Paletten[3].farben[2].rgbBlue:= $00;
- Paletten[3].farben[3].rgbRed:= $00;
- Paletten[3].farben[3].rgbGreen:=$ff;
- Paletten[3].farben[3].rgbBlue:= $00;
- Paletten[3].farben[4].rgbRed:= $00;
- Paletten[3].farben[4].rgbGreen:=$ff;
- Paletten[3].farben[4].rgbBlue:= $ff;
- Paletten[3].farben[5].rgbRed:= $00;
- Paletten[3].farben[5].rgbGreen:=$00;
- Paletten[3].farben[5].rgbBlue:= $ff;
-
- Paletten[4].name:='Jet-Regenbogen';
- setlength(Paletten[4].farben,5);
- Paletten[4].farben[0].rgbRed:= $ff;
- Paletten[4].farben[0].rgbGreen:=$00;
- Paletten[4].farben[0].rgbBlue:= $00;
- Paletten[4].farben[1].rgbRed:= $ff;
- Paletten[4].farben[1].rgbGreen:=$ff;
- Paletten[4].farben[1].rgbBlue:= $00;
- Paletten[4].farben[2].rgbRed:= $00;
- Paletten[4].farben[2].rgbGreen:=$ff;
- Paletten[4].farben[2].rgbBlue:= $00;
- Paletten[4].farben[3].rgbRed:= $00;
- Paletten[4].farben[3].rgbGreen:=$ff;
- Paletten[4].farben[3].rgbBlue:= $ff;
- Paletten[4].farben[4].rgbRed:= $00;
- Paletten[4].farben[4].rgbGreen:=$00;
- Paletten[4].farben[4].rgbBlue:= $ff;
+ for i:=length(externeBefehle)-1 downto 0 do
+ if assigned(externeBefehle) then
+ if externeBefehle[i].fertig then begin
+ externeBefehle[i].free;
+ for j:=i+1 to length(externeBefehle)-1 do
+ externeBefehle[j-1]:=externeBefehle[j];
+ setlength(externeBefehle,length(externeBefehle)-1);
+ end;
+end;
+
+begin
+ setlength(externeBefehle,0);
+
+ setlength(Paletten,5);
+ Paletten[0].name:='Graustufen';
+ setlength(Paletten[0].farben,2);
+ Paletten[0].farben[0].rgbRed:= $ff;
+ Paletten[0].farben[0].rgbGreen:=$ff;
+ Paletten[0].farben[0].rgbBlue:= $ff;
+ Paletten[0].farben[1].rgbRed:= $00;
+ Paletten[0].farben[1].rgbGreen:=$00;
+ Paletten[0].farben[1].rgbBlue:= $00;
+
+ Paletten[1].name:='invertierte Graustufen';
+ setlength(Paletten[1].farben,2);
+ Paletten[1].farben[0].rgbRed:= $00;
+ Paletten[1].farben[0].rgbGreen:=$00;
+ Paletten[1].farben[0].rgbBlue:= $00;
+ Paletten[1].farben[1].rgbRed:= $ff;
+ Paletten[1].farben[1].rgbGreen:=$ff;
+ Paletten[1].farben[1].rgbBlue:= $ff;
+
+ Paletten[2].name:='Regenbogen';
+ setlength(Paletten[2].farben,6);
+ Paletten[2].farben[0].rgbRed:= $00;
+ Paletten[2].farben[0].rgbGreen:=$00;
+ Paletten[2].farben[0].rgbBlue:= $ff;
+ Paletten[2].farben[1].rgbRed:= $00;
+ Paletten[2].farben[1].rgbGreen:=$ff;
+ Paletten[2].farben[1].rgbBlue:= $ff;
+ Paletten[2].farben[2].rgbRed:= $00;
+ Paletten[2].farben[2].rgbGreen:=$ff;
+ Paletten[2].farben[2].rgbBlue:= $00;
+ Paletten[2].farben[3].rgbRed:= $ff;
+ Paletten[2].farben[3].rgbGreen:=$ff;
+ Paletten[2].farben[3].rgbBlue:= $00;
+ Paletten[2].farben[4].rgbRed:= $ff;
+ Paletten[2].farben[4].rgbGreen:=$00;
+ Paletten[2].farben[4].rgbBlue:= $00;
+ Paletten[2].farben[5].rgbRed:= $00;
+ Paletten[2].farben[5].rgbGreen:=$00;
+ Paletten[2].farben[5].rgbBlue:= $00;
+
+ Paletten[3].name:='invertierter Regenbogen';
+ setlength(Paletten[3].farben,6);
+ Paletten[3].farben[0].rgbRed:= $00;
+ Paletten[3].farben[0].rgbGreen:=$00;
+ Paletten[3].farben[0].rgbBlue:= $00;
+ Paletten[3].farben[1].rgbRed:= $ff;
+ Paletten[3].farben[1].rgbGreen:=$00;
+ Paletten[3].farben[1].rgbBlue:= $00;
+ Paletten[3].farben[2].rgbRed:= $ff;
+ Paletten[3].farben[2].rgbGreen:=$ff;
+ Paletten[3].farben[2].rgbBlue:= $00;
+ Paletten[3].farben[3].rgbRed:= $00;
+ Paletten[3].farben[3].rgbGreen:=$ff;
+ Paletten[3].farben[3].rgbBlue:= $00;
+ Paletten[3].farben[4].rgbRed:= $00;
+ Paletten[3].farben[4].rgbGreen:=$ff;
+ Paletten[3].farben[4].rgbBlue:= $ff;
+ Paletten[3].farben[5].rgbRed:= $00;
+ Paletten[3].farben[5].rgbGreen:=$00;
+ Paletten[3].farben[5].rgbBlue:= $ff;
+
+ Paletten[4].name:='Jet-Regenbogen';
+ setlength(Paletten[4].farben,5);
+ Paletten[4].farben[0].rgbRed:= $ff;
+ Paletten[4].farben[0].rgbGreen:=$00;
+ Paletten[4].farben[0].rgbBlue:= $00;
+ Paletten[4].farben[1].rgbRed:= $ff;
+ Paletten[4].farben[1].rgbGreen:=$ff;
+ Paletten[4].farben[1].rgbBlue:= $00;
+ Paletten[4].farben[2].rgbRed:= $00;
+ Paletten[4].farben[2].rgbGreen:=$ff;
+ Paletten[4].farben[2].rgbBlue:= $00;
+ Paletten[4].farben[3].rgbRed:= $00;
+ Paletten[4].farben[3].rgbGreen:=$ff;
+ Paletten[4].farben[3].rgbBlue:= $ff;
+ Paletten[4].farben[4].rgbRed:= $00;
+ Paletten[4].farben[4].rgbGreen:=$00;
+ Paletten[4].farben[4].rgbBlue:= $ff;
end.
diff --git a/typenunit.pas b/typenunit.pas
index 974090e..54c98cf 100644
--- a/typenunit.pas
+++ b/typenunit.pas
@@ -199,11 +199,11 @@ type
end;
tBeschriftungen = array of tBeschriftung;
tWaveletTyp = (wtSin2,wtFrequenzfenster);
- tTransformationen = class;
+ tTransformation = class;
tExtraInfos = class
maxW,minW,np,beta: extended;
tsiz,xsteps,tsiz_,xsteps_: longint;
- transformationen: tTransformationen;
+ transformationen: tTransformation;
knownValues: tKnownValues;
constructor create;
destructor destroy; override;
@@ -213,24 +213,98 @@ type
function tstop: extended;
procedure refreshKnownValues;
end;
+ tTransformationArray = array of tTransformation;
tTransformation = class
// eine generische Transformation von Werten oder Koordinaten
// selbst nicht zum Instanziieren gedacht
private
+ vorgaenger,nachfolger: array of tTransformation;
+ in_xs_ts,out_xs_ts: tIntPoint;
+ in_achsen,out_achsen: t2x2Extended;
+ out_wmia: tExtPoint;
+ wmiaExplizit: boolean;
+
procedure testeAuszerhalb(const p: tExtPoint);
+ procedure aktualisiereAchsen; virtual; // nicht zum direkten Aufrufen
+ procedure aktualisiereXsTs; virtual; // nicht zum direkten Aufrufen
+ procedure aktualisiereWmia; virtual; // nicht zum direkten Aufrufen
+
+ function transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint; virtual;
+ // wie ändert sich die Position eines Punktes (Paradebeispiel: bei Spiegelung: x -> xsteps-1-x)
+ // ist für p veranwortlich?
+ function transformiereWertEinzeln(const x: extended): extended; virtual;
+ // wie ändert sich ein Wert
+
+ function rXstart: extended;
+ procedure wXstart(x: extended);
+ function rXstop: extended;
+ procedure wXstop(x: extended);
+ function rTstart: extended;
+ procedure wTstart(t: extended);
+ function rTstop: extended;
+ procedure wTstop(t: extended);
+ function rWmin: extended;
+ procedure wWmin(w: extended);
+ function rWmax: extended;
+ procedure wWmax(w: extended);
+ function rXsteps: longint;
+ procedure wXsteps(x: longint);
+ function rTsiz: longint;
+ procedure wTsiz(t: longint);
public
- in_xs_ts: tIntPoint;
- in_achsen: t2x2Extended;
- function achsen: t2x2Extended; virtual;
- // wie ändern sich xstart,xstop,tstart,tstop?
- function transformiereKoordinaten(const x,y: longint): tExtPoint; overload;
- function transformiereKoordinaten(const p: tExtPoint): tExtPoint; virtual; overload;
- // wie ändert sich die Position eines Punktes (Paradebeispiel: bei Spiegelung: x -> xsteps-1-x)
- function transformiereWert(const x: extended): extended; virtual;
- // wie ändert sich ein Wert
- function xsteps_tsiz: tIntPoint; virtual;
- // wie ändert sich die Ausdehnung?
- function dumpParams: string; virtual;
+ constructor create;
+ destructor destroy; override;
+ destructor freeAll;
+
+ procedure fuegeNachfolgerHinzu(tr: tTransformation);
+ procedure loescheNachfolger(tr: tTransformation);
+ procedure fuegeVorgaengerHinzu(tr: tTransformation);
+ procedure loescheVorgaenger(tr: tTransformation);
+ function hatNachfolger: boolean;
+ procedure aktualisiereAlles; // (inkl. Informieren der Nachfolger)
+ function ersetzeAnfangDurch(tr: tTransformation): boolean;
+ function beliebigerVorgaenger: tTransformation;
+
+ property achsen: t2x2Extended read out_achsen;
+ // wie lauten xstart,xstop,tstart,tstop?
+ function transformiereKoordinaten(const p: tExtPoint; const tiefe: longint = -1): tExtPoint; overload;
+ function transformiereKoordinaten(const x,y: longint; const tiefe: longint = -1): tExtPoint; overload;
+ function wertZuPositionAufAchse(const l: tLage; x: extended): extended; virtual;
+ function transformiereWert(const x: extended; const tiefe: longint = -1): extended;
+ property xsteps_tsiz: tIntPoint read out_xs_ts;
+ function dumpParams: string; virtual; overload;
+ function dumpParams(tiefe: longint): string; overload;
+ 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 wmin: extended
+ read rWmin
+ write wWmin;
+ property wmax: extended
+ read rWmax
+ write wWmax;
+ property xsteps: longint
+ read rXsteps
+ write wXsteps;
+ property tsiz: longint
+ read rTsiz
+ write wTsiz;
+ end;
+ tKeineTransformation = class (tTransformation)
+ // der Beginn einer Transformationskette, z.B. das Laden von Daten
+ end;
+ tUeberlagerung = class (tTransformation)
+ // die Überlagerung mehrer gleichformatiger Daten, z.B. Linearkombination
+ procedure addKomponente(tr: tTransformation);
end;
tKoordinatenTransformation = class (tTransformation)
// eine generische Transformation der Koordinaten
@@ -240,15 +314,16 @@ type
// repräsentiert die Transformation der Koordinaten bei einer FFT
horizontal,vertikal: boolean;
constructor create; overload;
- constructor create(original: tFFTTransformation); overload;
- function achsen: t2x2Extended; override;
+ constructor create(vorg: tTransformation; hor,ver: boolean);
+ procedure aktualisiereAchsen; override;
// keine Änderung der Positionen, der Werte(skalierung), der Ausdehnung
function dumpParams: string; override;
end;
tSpiegelungsTransformation = class (tKoordinatenTransformation)
// repräsentiert die horizontale Spiegelung der Koordinaten
constructor create;
- function transformiereKoordinaten(const p: tExtPoint): tExtPoint; override; overload;
+ constructor create(vorg: tTransformation);
+ function transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint; override; overload;
// keine Änderung der Achsenbegrenzungen, der Werte(skalierung), der Ausdehnung
function dumpParams: string; override;
end;
@@ -265,34 +340,32 @@ type
lnOff, // Offset der ln-Argumente
expFak: tExtPoint; // Vorfaktoren der Exponentialfunktionen
constructor create; overload;
- constructor create(original: tKonkreteKoordinatenTransformation); overload;
- function transformiereKoordinaten(const p: tExtPoint): tExtPoint; override; overload;
+ function transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint; override; overload;
function initAbbildung(syntaxtest: boolean; s: string; xscale,yscale: extended; etf: tExprToFloat): boolean;
function zielausdehnung: t2x2Longint;
- function xsteps_tsiz: tIntPoint; override;
+ procedure aktualisiereXsTs; override;
// keine Änderung der Achsenbegrenzungen, der Werte(skalierung)
function dumpParams: string; override;
end;
tKoordinatenAusschnitt = class (tKoordinatenTransformation)
gr: t2x2Longint;
constructor create; overload;
- constructor create(original: tKoordinatenAusschnitt); overload;
- function xsteps_tsiz: tIntPoint; override;
- function achsen: t2x2Extended; override;
- function transformiereKoordinaten(const p: tExtPoint): tExtPoint; override; overload;
+ constructor create(vorg: tTransformation; xmin,xmax,tmin,tmax: longint); overload;
+ procedure aktualisiereXsTs; override;
+ procedure aktualisiereAchsen; override;
+ function transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint; override; overload;
// 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;
+ procedure addKomponente(tr: tTransformation);
+ 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;
tBearbeitungstyp = (btUnbekannt,btKnick,btLog,btAbsLog,btAbs);
@@ -304,9 +377,8 @@ type
// Werte knicken
parameter: tExtendedArray;
constructor create; overload;
- constructor create(original: tWerteKnickTransformation); overload;
destructor destroy; override;
- function transformiereWert(const x: extended): extended; override;
+ function transformiereWertEinzeln(const x: extended): extended; override;
// keine Änderung der Achsenbegrenzungen, der Positionen, der Ausdehnung
function dumpParams: string; override;
end;
@@ -314,8 +386,7 @@ type
// Werte logarithmieren
logMin: extended;
constructor create; overload;
- constructor create(original: tWerteLogTransformation); overload;
- function transformiereWert(const x: extended): extended; override;
+ function transformiereWertEinzeln(const x: extended): extended; override;
// keine Änderung der Achsenbegrenzungen, der Positionen, der Ausdehnung
function dumpParams: string; override;
end;
@@ -323,19 +394,18 @@ type
// Wertebeträge logarithmieren
logSkala: extended;
constructor create; overload;
- constructor create(original: tWerteLogAbsTransformation); overload;
- function transformiereWert(const x: extended): extended; override;
+ function transformiereWertEinzeln(const x: extended): extended; override;
// keine Änderung der Achsenbegrenzungen, der Positionen, der Ausdehnung
function dumpParams: string; override;
end;
tWerteAbsTransformation = class (tWerteTransformation)
// Werte betragen
constructor create;
- function transformiereWert(const x: extended): extended; override;
+ function transformiereWertEinzeln(const x: extended): extended; override;
// keine Änderung der Achsenbegrenzungen, der Positionen, der Ausdehnung
function dumpParams: string; override;
end;
- tTransformationen = class
+(* tTransformationen = class
private
// merkt sich, was mit den Werten und Koordinaten nach einem festen Punkt (dem Einlesen) passiert ist,
// sodass man immer nachvollziehen kann, welcher Punkt woher kam und wie verarbeitet wurde.
@@ -346,50 +416,9 @@ type
_xs_ts: tIntPoint;
function gibInhalt(ii: longint): tTransformation;
procedure nimmInhalt(ii: longint; inh: tTransformation);
- function rXstart: extended;
- procedure wXstart(x: extended);
- function rXstop: extended;
- procedure wXstop(x: extended);
- function rTstart: extended;
- procedure wTstart(t: extended);
- function rTstop: extended;
- procedure wTstop(t: extended);
- function rWmin: extended;
- procedure wWmin(w: extended);
- function rWmax: extended;
- procedure wWmax(w: extended);
- function rXsteps: longint;
- procedure wXsteps(x: longint);
- function rTsiz: longint;
- procedure wTsiz(t: longint);
- function xsteps_tsiz: tIntPoint;
function gibAchsen: t2x2Extended;
procedure achsenUndGroeszeAktualisieren;
public
- 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 wmin: extended
- read rWmin
- write wWmin;
- property wmax: extended
- read rWmax
- write wWmax;
- property xsteps: longint
- read rXsteps
- write wXsteps;
- property tsiz: longint
- read rTsiz
- write wTsiz;
property inhalt[ii: longint]: tTransformation
read gibInhalt
write nimmInhalt; default;
@@ -418,7 +447,9 @@ type
function dumpParams: string;
procedure berechneZielausdehnung(out grenzen: t2x2Longint);
end;
- tTransformationenArray = array of tTransformationen;
+ tTransformationenArray = array of tTransformationen; *)
+
+function liesTWerteTransformationen(st: boolean; s: string; f: tMyStringlist; etf: tExprToFloat; var tr: tTransformation): boolean;
implementation
@@ -426,409 +457,410 @@ implementation
constructor tGenerischeInputDateiInfo.create(Vorlage: tGenerischeInputDateiInfo);
begin
- inherited create;
- fillchar(Name,sizeof(Name),#0);
- Name:=Vorlage.Name;
- fillchar(Fehlerbehebungskommando,sizeof(Fehlerbehebungskommando),#0);
- Fehlerbehebungskommando:=Vorlage.Fehlerbehebungskommando;
- gamma:=Vorlage.gamma;
- groeszenFaktor:=Vorlage.groeszenFaktor;
- Genauigkeit:=Vorlage.Genauigkeit;
- tsiz:=Vorlage.tsiz;
- xsteps:=Vorlage.xsteps;
- tstart:=Vorlage.tstart;
- tstop:=Vorlage.tstop;
- xstart:=Vorlage.xstart;
- xstop:=Vorlage.xstop;
- params:=Vorlage.params;
- t0abs:=Vorlage.t0abs;
+ inherited create;
+ fillchar(Name,sizeof(Name),#0);
+ Name:=Vorlage.Name;
+ fillchar(Fehlerbehebungskommando,sizeof(Fehlerbehebungskommando),#0);
+ Fehlerbehebungskommando:=Vorlage.Fehlerbehebungskommando;
+ gamma:=Vorlage.gamma;
+ groeszenFaktor:=Vorlage.groeszenFaktor;
+ Genauigkeit:=Vorlage.Genauigkeit;
+ tsiz:=Vorlage.tsiz;
+ xsteps:=Vorlage.xsteps;
+ tstart:=Vorlage.tstart;
+ tstop:=Vorlage.tstop;
+ xstart:=Vorlage.xstart;
+ xstop:=Vorlage.xstop;
+ params:=Vorlage.params;
+ t0abs:=Vorlage.t0abs;
end;
constructor tGenerischeInputDateiInfo.create;
begin
- inherited create;
- fillchar(Name,sizeof(Name),#0);
- Name:='';
- fillchar(Fehlerbehebungskommando,sizeof(Fehlerbehebungskommando),#0);
- Fehlerbehebungskommando:='';
- gamma:=1;
- groeszenFaktor:=1;
- Genauigkeit:=gSingle;
- tsiz:=-1;
- t0abs:=-1;
- xsteps:=-1;
- tstart:=-myInf;
- tstop:=myInf;
- xstart:=-myInf;
- xstop:=myInf;
- params:=nil;
+ inherited create;
+ fillchar(Name,sizeof(Name),#0);
+ Name:='';
+ fillchar(Fehlerbehebungskommando,sizeof(Fehlerbehebungskommando),#0);
+ Fehlerbehebungskommando:='';
+ gamma:=1;
+ groeszenFaktor:=1;
+ Genauigkeit:=gSingle;
+ tsiz:=-1;
+ t0abs:=-1;
+ xsteps:=-1;
+ tstart:=-myInf;
+ tstop:=myInf;
+ xstart:=-myInf;
+ xstop:=myInf;
+ params:=nil;
end;
destructor tGenerischeInputDateiInfo.destroy;
begin
- Name:='';
- Fehlerbehebungskommando:='';
- inherited destroy;
+ Name:='';
+ Fehlerbehebungskommando:='';
+ inherited destroy;
end;
function tGenerischeInputDateiInfo.xmin: longint;
begin
- result:=0;
- if assigned(params) and (params.xsteps>1) and (xstart > params.xstart + result/(params.xsteps-1)*(params.xstop-params.xstart)) then
- result:=min(xsteps-1,round((xstart-params.xstart)/(params.xstop-params.xstart)/(params.xsteps-1)));
+ result:=0;
+ if assigned(params) and (params.xsteps>1) and (xstart > params.xstart + result/(params.xsteps-1)*(params.xstop-params.xstart)) then
+ result:=min(xsteps-1,round((xstart-params.xstart)/(params.xstop-params.xstart)/(params.xsteps-1)));
end;
function tGenerischeInputDateiInfo.xmax: longint;
begin
- result:=xsteps-1;
- if assigned(params) and (params.xsteps>1) and (xstop < params.xstart + result/(params.xsteps-1)*(params.xstop-params.xstart)) then
- result:=max(0,round((xstop-params.xstart)/(params.xstop-params.xstart)/(params.xsteps-1)));
+ result:=xsteps-1;
+ if assigned(params) and (params.xsteps>1) and (xstop < params.xstart + result/(params.xsteps-1)*(params.xstop-params.xstart)) then
+ result:=max(0,round((xstop-params.xstart)/(params.xstop-params.xstart)/(params.xsteps-1)));
end;
function tGenerischeInputDateiInfo.tmin: longint;
begin
- result:=t0abs;
- if assigned(params) and (params.tsiz>1) and (tstart > params.tstart + result/(params.tsiz-1)*(params.tstop-params.tstart)) then
- result:=round((tstart-params.tstart)/(params.tstop-params.tstart)/(params.tsiz-1));
- result:=min(tsiz-1,max(0,result-t0abs));
+ result:=t0abs;
+ if assigned(params) and (params.tsiz>1) and (tstart > params.tstart + result/(params.tsiz-1)*(params.tstop-params.tstart)) then
+ result:=round((tstart-params.tstart)/(params.tstop-params.tstart)/(params.tsiz-1));
+ result:=min(tsiz-1,max(0,result-t0abs));
end;
function tGenerischeInputDateiInfo.tmax: longint;
begin
- result:=t0abs+tsiz-1;
- if assigned(params) and (params.tsiz>1) and (tstop < params.tstart + result/(params.tsiz-1)*(params.tstop-params.tstart)) then
- result:=round((tstop-params.tstart)/(params.tstop-params.tstart)/(params.tsiz-1));
- result:=min(tsiz-1,max(0,result-t0abs));
+ result:=t0abs+tsiz-1;
+ if assigned(params) and (params.tsiz>1) and (tstop < params.tstart + result/(params.tsiz-1)*(params.tstop-params.tstart)) then
+ result:=round((tstop-params.tstart)/(params.tstop-params.tstart)/(params.tsiz-1));
+ result:=min(tsiz-1,max(0,result-t0abs));
end;
// tPhaseSpaceInputDateiInfo ****************************************************
constructor tPhaseSpaceInputDateiInfo.create(Vorlage: tGenerischeInputDateiInfo);
begin
- inherited create(Vorlage);
+ inherited create(Vorlage);
end;
constructor tPhaseSpaceInputDateiInfo.create;
begin
- inherited create;
+ inherited create;
end;
destructor tPhaseSpaceInputDateiInfo.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
// tSpaceTimeInputDateiInfo ****************************************************
constructor tSpaceTimeInputDateiInfo.create(Vorlage: tGenerischeInputDateiInfo);
begin
- inherited create(Vorlage);
+ inherited create(Vorlage);
end;
constructor tSpaceTimeInputDateiInfo.create;
begin
- inherited create;
+ inherited create;
end;
destructor tSpaceTimeInputDateiInfo.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
// tTraceInputDateiInfo ********************************************************
constructor tTraceInputDateiInfo.create(Vorlage: tGenerischeInputDateiInfo);
begin
- inherited create(Vorlage);
- if Vorlage is tTraceInputDateiInfo then begin
- Spurnummer:=(Vorlage as tTraceInputDateiInfo).Spurnummer;
- FeldNummer:=(Vorlage as tTraceInputDateiInfo).FeldNummer;
- end
- else begin
- Spurnummer:=0;
- FeldNummer:=0;
- end;
+ inherited create(Vorlage);
+ if Vorlage is tTraceInputDateiInfo then begin
+ Spurnummer:=(Vorlage as tTraceInputDateiInfo).Spurnummer;
+ FeldNummer:=(Vorlage as tTraceInputDateiInfo).FeldNummer;
+ end
+ else begin
+ Spurnummer:=0;
+ FeldNummer:=0;
+ end;
end;
constructor tTraceInputDateiInfo.create;
begin
- inherited create;
- Spurnummer:=0;
- FeldNummer:=0;
+ inherited create;
+ Spurnummer:=0;
+ FeldNummer:=0;
end;
destructor tTraceInputDateiInfo.destroy;
begin
- inherited destroy;
+ inherited destroy;
end;
// tPipeInputDateiInfo *********************************************************
constructor tPipeInputDateiInfo.create(Vorlage: tGenerischeInputDateiInfo);
begin
- inherited create(Vorlage);
- fillchar(Analysator,sizeof(Analysator),#0);
- if Vorlage is tPipeInputDateiInfo then begin
- Analysator:=(Vorlage as tPipeInputDateiInfo).Analysator;
- bytesPerSample:=(Vorlage as tPipeInputDateiInfo).bytesPerSample;
- Kodierung:=(Vorlage as tPipeInputDateiInfo).Kodierung;
- end
- else begin
- Analysator:='/usr/bin/soxi -';
- bytesPerSample:=-1;
- Kodierung:=kUnbekannt;
- end;
+ inherited create(Vorlage);
+ fillchar(Analysator,sizeof(Analysator),#0);
+ if Vorlage is tPipeInputDateiInfo then begin
+ Analysator:=(Vorlage as tPipeInputDateiInfo).Analysator;
+ bytesPerSample:=(Vorlage as tPipeInputDateiInfo).bytesPerSample;
+ Kodierung:=(Vorlage as tPipeInputDateiInfo).Kodierung;
+ end
+ else begin
+ Analysator:='/usr/bin/soxi -';
+ bytesPerSample:=-1;
+ Kodierung:=kUnbekannt;
+ end;
end;
constructor tPipeInputDateiInfo.create;
begin
- inherited create;
- fillchar(Analysator,sizeof(Analysator),#0);
- Analysator:='/usr/bin/soxi -';
- bytesPerSample:=-1;
- Kodierung:=kUnbekannt;
+ inherited create;
+ fillchar(Analysator,sizeof(Analysator),#0);
+ Analysator:='/usr/bin/soxi -';
+ bytesPerSample:=-1;
+ Kodierung:=kUnbekannt;
end;
destructor tPipeInputDateiInfo.destroy;
begin
- Analysator:='';
- inherited destroy;
+ Analysator:='';
+ inherited destroy;
end;
function tPipeInputDateiInfo.Executable: string;
begin
- result:=leftStr(Name,pos(' ',Name+' ')-1);
+ result:=leftStr(Name,pos(' ',Name+' ')-1);
end;
function tPipeInputDateiInfo.ParametersText: string;
begin
- result:=copy(Name,pos(' ',Name+' ')+1,length(Name));
- while pos(' ',result)>0 do
- result[pos(' ',result)]:=#13;
+ result:=copy(Name,pos(' ',Name+' ')+1,length(Name));
+ while pos(' ',result)>0 do
+ result[pos(' ',result)]:=#13;
end;
function tPipeInputDateiInfo.AnalysatorExecutable: string;
begin
- result:=leftStr(Analysator,pos(' ',Analysator+' ')-1);
+ result:=leftStr(Analysator,pos(' ',Analysator+' ')-1);
end;
function tPipeInputDateiInfo.AnalysatorParametersText: string;
begin
- result:=copy(Analysator,pos(' ',Analysator+' ')+1,length(Analysator));
- while pos(' ',result)>0 do
- result[pos(' ',result)]:=#13;
+ result:=copy(Analysator,pos(' ',Analysator+' ')+1,length(Analysator));
+ while pos(' ',result)>0 do
+ result[pos(' ',result)]:=#13;
end;
// tInputDateiInfoVorlagen *****************************************************
constructor tInputDateiInfoVorlagen.create;
begin
- inherited create;
- PhaseSpaceVorlage:=tPhaseSpaceInputDateiInfo.create;
- SpaceTimeVorlage:=tSpaceTimeInputDateiInfo.create;
- TraceVorlage:=tTraceInputDateiInfo.create;
- PipeVorlage:=tPipeInputDateiInfo.create;
- fillchar(_Name,sizeof(_Name),#0);
- Name:=SpaceTimeVorlage.Name;
- fillchar(_Fehlerbehebungskommando,sizeof(_Fehlerbehebungskommando),#0);
- Fehlerbehebungskommando:=SpaceTimeVorlage.Fehlerbehebungskommando;
- Gamma:=SpaceTimeVorlage.Gamma;
- groeszenFaktor:=SpaceTimeVorlage.groeszenFaktor;
- Genauigkeit:=SpaceTimeVorlage.Genauigkeit;
- _tsiz:=SpaceTimeVorlage.tsiz;
- _xsteps:=SpaceTimeVorlage.xsteps;
- SpurNummer:=TraceVorlage.SpurNummer;
- FeldNummer:=TraceVorlage.FeldNummer;
- fillchar(_Analysator,sizeof(_Analysator),#0);
- Analysator:=PipeVorlage.Analysator;
- _bytesPerSample:=PipeVorlage.bytesPerSample;
- _Kodierung:=PipeVorlage.Kodierung;
- _tstart:=SpaceTimeVorlage.tstart;
- _tstop:=SpaceTimeVorlage.tstop;
- _xstart:=SpaceTimeVorlage.xstart;
- _xstop:=SpaceTimeVorlage.xstop;
- _t0abs:=SpaceTimeVorlage.t0abs;
+ inherited create;
+ PhaseSpaceVorlage:=tPhaseSpaceInputDateiInfo.create;
+ SpaceTimeVorlage:=tSpaceTimeInputDateiInfo.create;
+ TraceVorlage:=tTraceInputDateiInfo.create;
+ PipeVorlage:=tPipeInputDateiInfo.create;
+ fillchar(_Name,sizeof(_Name),#0);
+ Name:=SpaceTimeVorlage.Name;
+ fillchar(_Fehlerbehebungskommando,sizeof(_Fehlerbehebungskommando),#0);
+ Fehlerbehebungskommando:=SpaceTimeVorlage.Fehlerbehebungskommando;
+ Gamma:=SpaceTimeVorlage.Gamma;
+ groeszenFaktor:=SpaceTimeVorlage.groeszenFaktor;
+ Genauigkeit:=SpaceTimeVorlage.Genauigkeit;
+ _tsiz:=SpaceTimeVorlage.tsiz;
+ _xsteps:=SpaceTimeVorlage.xsteps;
+ SpurNummer:=TraceVorlage.SpurNummer;
+ FeldNummer:=TraceVorlage.FeldNummer;
+ fillchar(_Analysator,sizeof(_Analysator),#0);
+ Analysator:=PipeVorlage.Analysator;
+ _bytesPerSample:=PipeVorlage.bytesPerSample;
+ _Kodierung:=PipeVorlage.Kodierung;
+ _tstart:=SpaceTimeVorlage.tstart;
+ _tstop:=SpaceTimeVorlage.tstop;
+ _xstart:=SpaceTimeVorlage.xstart;
+ _xstop:=SpaceTimeVorlage.xstop;
+ _t0abs:=SpaceTimeVorlage.t0abs;
end;
destructor tInputDateiInfoVorlagen.destroy;
begin
- PhaseSpaceVorlage.free;
- SpaceTimeVorlage.free;
- TraceVorlage.free;
- PipeVorlage.free;
- _Name:='';
- _Fehlerbehebungskommando:='';
- _Analysator:='';
- inherited destroy;
+ PhaseSpaceVorlage.free;
+ SpaceTimeVorlage.free;
+ TraceVorlage.free;
+ PipeVorlage.free;
+ _Name:='';
+ _Fehlerbehebungskommando:='';
+ _Analysator:='';
+ inherited destroy;
end;
procedure tInputDateiInfoVorlagen.wFehlerbehebungskommando(f: string);
begin
- _Fehlerbehebungskommando:=f;
- PhaseSpaceVorlage.Fehlerbehebungskommando:=f;
- SpaceTimeVorlage.Fehlerbehebungskommando:=f;
- TraceVorlage.Fehlerbehebungskommando:=f;
- PipeVorlage.Fehlerbehebungskommando:=f;
+ _Fehlerbehebungskommando:=f;
+ PhaseSpaceVorlage.Fehlerbehebungskommando:=f;
+ SpaceTimeVorlage.Fehlerbehebungskommando:=f;
+ TraceVorlage.Fehlerbehebungskommando:=f;
+ PipeVorlage.Fehlerbehebungskommando:=f;
end;
procedure tInputDateiInfoVorlagen.wName(n: string);
begin
- _Name:=n;
- PhaseSpaceVorlage.Name:=n;
- SpaceTimeVorlage.Name:=n;
- TraceVorlage.Name:=n;
- PipeVorlage.Name:=n;
+ _Name:=n;
+ PhaseSpaceVorlage.Name:=n;
+ SpaceTimeVorlage.Name:=n;
+ TraceVorlage.Name:=n;
+ PipeVorlage.Name:=n;
end;
procedure tInputDateiInfoVorlagen.wGamma(g: extended);
begin
- _Gamma:=g;
- PhaseSpaceVorlage.Gamma:=g;
- SpaceTimeVorlage.Gamma:=g;
- TraceVorlage.Gamma:=g;
- PipeVorlage.Gamma:=g;
+ _Gamma:=g;
+ PhaseSpaceVorlage.Gamma:=g;
+ SpaceTimeVorlage.Gamma:=g;
+ TraceVorlage.Gamma:=g;
+ PipeVorlage.Gamma:=g;
end;
procedure tInputDateiInfoVorlagen.wTStart(t: extended);
begin
- _tstart:=t;
- PhaseSpaceVorlage.tstart:=t;
- SpaceTimeVorlage.tstart:=t;
- TraceVorlage.tstart:=t;
- PipeVorlage.tstart:=t;
+ _tstart:=t;
+ PhaseSpaceVorlage.tstart:=t;
+ SpaceTimeVorlage.tstart:=t;
+ TraceVorlage.tstart:=t;
+ PipeVorlage.tstart:=t;
end;
procedure tInputDateiInfoVorlagen.wTStop(t: extended);
begin
- _tstop:=t;
- PhaseSpaceVorlage.tstop:=t;
- SpaceTimeVorlage.tstop:=t;
- TraceVorlage.tstop:=t;
- PipeVorlage.tstop:=t;
+ _tstop:=t;
+ PhaseSpaceVorlage.tstop:=t;
+ SpaceTimeVorlage.tstop:=t;
+ TraceVorlage.tstop:=t;
+ PipeVorlage.tstop:=t;
end;
procedure tInputDateiInfoVorlagen.wXStart(x: extended);
begin
- _xstart:=x;
- PhaseSpaceVorlage.xstart:=x;
- SpaceTimeVorlage.xstart:=x;
- TraceVorlage.xstart:=x;
- PipeVorlage.xstart:=x;
+ _xstart:=x;
+ PhaseSpaceVorlage.xstart:=x;
+ SpaceTimeVorlage.xstart:=x;
+ TraceVorlage.xstart:=x;
+ PipeVorlage.xstart:=x;
end;
procedure tInputDateiInfoVorlagen.wXStop(x: extended);
begin
- _xstop:=x;
- PhaseSpaceVorlage.xstop:=x;
- SpaceTimeVorlage.xstop:=x;
- TraceVorlage.xstop:=x;
- PipeVorlage.xstop:=x;
+ _xstop:=x;
+ PhaseSpaceVorlage.xstop:=x;
+ SpaceTimeVorlage.xstop:=x;
+ TraceVorlage.xstop:=x;
+ PipeVorlage.xstop:=x;
end;
procedure tInputDateiInfoVorlagen.wT0Abs(t: longint);
begin
- _t0abs:=t;
- PhaseSpaceVorlage.t0abs:=t;
- SpaceTimeVorlage.t0abs:=t;
- TraceVorlage.t0abs:=t;
- PipeVorlage.t0abs:=t;
+ _t0abs:=t;
+ PhaseSpaceVorlage.t0abs:=t;
+ SpaceTimeVorlage.t0abs:=t;
+ TraceVorlage.t0abs:=t;
+ PipeVorlage.t0abs:=t;
end;
procedure tInputDateiInfoVorlagen.wGroeszenFaktor(g: extended);
begin
- _groeszenFaktor:=g;
- PhaseSpaceVorlage.groeszenFaktor:=g;
- SpaceTimeVorlage.groeszenFaktor:=g;
- TraceVorlage.groeszenFaktor:=g;
- PipeVorlage.groeszenFaktor:=g;
+ _groeszenFaktor:=g;
+ PhaseSpaceVorlage.groeszenFaktor:=g;
+ SpaceTimeVorlage.groeszenFaktor:=g;
+ TraceVorlage.groeszenFaktor:=g;
+ PipeVorlage.groeszenFaktor:=g;
end;
procedure tInputDateiInfoVorlagen.wGenauigkeit(g: tGenauigkeit);
begin
- _Genauigkeit:=g;
- PhaseSpaceVorlage.Genauigkeit:=g;
- SpaceTimeVorlage.Genauigkeit:=g;
- TraceVorlage.Genauigkeit:=g;
- PipeVorlage.Genauigkeit:=g;
+ _Genauigkeit:=g;
+ PhaseSpaceVorlage.Genauigkeit:=g;
+ SpaceTimeVorlage.Genauigkeit:=g;
+ TraceVorlage.Genauigkeit:=g;
+ PipeVorlage.Genauigkeit:=g;
end;
procedure tInputDateiInfoVorlagen.wTSiz(t: longint);
begin
- _tsiz:=t;
- PhaseSpaceVorlage.tsiz:=t;
- SpaceTimeVorlage.tsiz:=t;
- TraceVorlage.tsiz:=t;
- PipeVorlage.tsiz:=t;
+ _tsiz:=t;
+ PhaseSpaceVorlage.tsiz:=t;
+ SpaceTimeVorlage.tsiz:=t;
+ TraceVorlage.tsiz:=t;
+ PipeVorlage.tsiz:=t;
end;
procedure tInputDateiInfoVorlagen.wXSteps(x: longint);
begin
- _xsteps:=x;
- PhaseSpaceVorlage.xsteps:=x;
- SpaceTimeVorlage.xsteps:=x;
- TraceVorlage.xsteps:=x;
- PipeVorlage.xsteps:=x;
+ _xsteps:=x;
+ PhaseSpaceVorlage.xsteps:=x;
+ SpaceTimeVorlage.xsteps:=x;
+ TraceVorlage.xsteps:=x;
+ PipeVorlage.xsteps:=x;
end;
procedure tInputDateiInfoVorlagen.wSpurNummer(s: longint);
begin
- _SpurNummer:=s;
- TraceVorlage.SpurNummer:=s;
+ _SpurNummer:=s;
+ TraceVorlage.SpurNummer:=s;
end;
procedure tInputDateiInfoVorlagen.wFeldNummer(f: longint);
begin
- _FeldNummer:=f;
- TraceVorlage.FeldNummer:=f;
+ _FeldNummer:=f;
+ TraceVorlage.FeldNummer:=f;
end;
procedure tInputDateiInfoVorlagen.wAnalysator(a: string);
begin
- _Analysator:=a;
- PipeVorlage.Analysator:=a;
+ _Analysator:=a;
+ PipeVorlage.Analysator:=a;
end;
procedure tInputDateiInfoVorlagen.wBytesPerSample(b: longint);
begin
- _bytesPerSample:=b;
- PipeVorlage.bytesPerSample:=b;
+ _bytesPerSample:=b;
+ PipeVorlage.bytesPerSample:=b;
end;
procedure tInputDateiInfoVorlagen.wKodierung(k: tKodierung);
begin
- _Kodierung:=k;
- PipeVorlage.Kodierung:=k;
+ _Kodierung:=k;
+ PipeVorlage.Kodierung:=k;
end;
function tInputDateiInfoVorlagen.GenauigkeitFromStr(s: string): boolean;
begin
- result:=strToGen(_Genauigkeit,s);
- Genauigkeit:=_Genauigkeit;
+ result:=strToGen(_Genauigkeit,s);
+ Genauigkeit:=_Genauigkeit;
end;
function tInputDateiInfoVorlagen.Fehlerbehebungsprogramm: string;
begin
- result:=copy(Fehlerbehebungskommando,1,pos(' ',Fehlerbehebungskommando+' ')-1);
+ result:=copy(Fehlerbehebungskommando,1,pos(' ',Fehlerbehebungskommando+' ')-1);
end;
function tInputDateiInfoVorlagen.Fehlerbehebungsparameter: string;
begin
- result:=copy(Fehlerbehebungskommando,pos(' ',Fehlerbehebungskommando+' ')+1,length(Fehlerbehebungskommando));
+ result:=copy(Fehlerbehebungskommando,pos(' ',Fehlerbehebungskommando+' ')+1,length(Fehlerbehebungskommando));
end;
procedure tInputDateiInfoVorlagen.wParams(p: tExtrainfos);
begin
- _params:=p;
- PhaseSpaceVorlage.params:=p;
- SpaceTimeVorlage.params:=p;
- TraceVorlage.params:=p;
- PipeVorlage.params:=p;
+ _params:=p;
+ PhaseSpaceVorlage.params:=p;
+ SpaceTimeVorlage.params:=p;
+ TraceVorlage.params:=p;
+ PipeVorlage.params:=p;
end;
// tFenster ********************************************************************
procedure tFenster.berechneWerte(anzWerte: longint);
-var i: integer;
+var
+ i: integer;
begin
setlength(werte,anzWerte);
for i:=0 to length(werte)-1 do begin
@@ -856,53 +888,53 @@ end;
constructor tBeschriftung.create;
begin
- inherited create;
- _inhalt:='';
+ inherited create;
+ _inhalt:='';
end;
destructor tBeschriftung.destroy;
begin
- _inhalt:='';
- inherited destroy;
+ _inhalt:='';
+ inherited destroy;
end;
function tBeschriftung.strich: longint;
begin
- result:=round(position);
+ result:=round(position);
end;
function tBeschriftung.links: longint;
begin
- case lage of
+ case lage of
lOben,lUnten: result:=strich-(bild.breite div 2);
lLinks: result:=-bild.breite-4-Byte(Rahmen);
lRechts: result:=bbreite+3+Byte(Rahmen);
- end{of Case};
+ end{of Case};
end;
function tBeschriftung.oben: longint;
begin
- case lage of
+ case lage of
lLinks,lRechts: result:=strich-(bild.hoehe div 2);
lUnten: result:=-bild.hoehe-4-Byte(Rahmen);
lOben: result:=bHoehe+3+Byte(Rahmen);
- end{of Case};
+ end{of Case};
end;
function tBeschriftung.rechts: longint;
begin
- result:=links+bild.breite-1;
+ result:=links+bild.breite-1;
end;
function tBeschriftung.unten: longint;
begin
- result:=oben+bild.hoehe-1;
+ result:=oben+bild.hoehe-1;
end;
procedure tBeschriftung.wInhalt(s: string);
begin
- _inhalt:=s;
- bild:=fontRend.rendere(_inhalt);
+ _inhalt:=s;
+ bild:=fontRend.rendere(_inhalt);
end;
// tExtraInfos *****************************************************************
@@ -912,7 +944,7 @@ begin
inherited create;
maxW:=1;
minW:=0;
- transformationen:=tTransformationen.create;
+ transformationen:=tTransformation.create;
np:=1;
beta:=0;
tsiz:=0;
@@ -924,29 +956,29 @@ end;
destructor tExtraInfos.destroy;
begin
- knownValues.free;
- transformationen.free;
- inherited destroy;
+ knownValues.free;
+ transformationen.free;
+ inherited destroy;
end;
function tExtraInfos.xstart: extended;
begin
- result:=transformationen.xstart;
+ result:=transformationen.xstart;
end;
function tExtraInfos.xstop: extended;
begin
- result:=transformationen.xstop;
+ result:=transformationen.xstop;
end;
function tExtraInfos.tstart: extended;
begin
- result:=transformationen.tstart;
+ result:=transformationen.tstart;
end;
function tExtraInfos.tstop: extended;
begin
- result:=transformationen.tstop;
+ result:=transformationen.tstop;
end;
procedure tExtraInfos.refreshKnownValues;
@@ -965,520 +997,821 @@ end;
constructor tFontRenderer.create(schriftgroesze: longint);
begin
- inherited create;
+ inherited create;
- gibAus('FontRenderer erzeugen (Schriftgröße '+inttostr(schriftgroesze)+') ...',1);
+ gibAus('FontRenderer erzeugen (Schriftgröße '+inttostr(schriftgroesze)+') ...',1);
- New(agg, Construct);
- agg^.font('/usr/share/fonts/TTF/DejaVuSans.ttf',schriftgroesze,false,false,RasterFontCache,0.0);
+ New(agg, Construct);
+ agg^.font('/usr/share/fonts/TTF/DejaVuSans.ttf',schriftgroesze,false,false,RasterFontCache,0.0);
- gibAus('... fertig',1);
+ gibAus('... fertig',1);
end;
destructor tFontRenderer.destroy;
begin
- Dispose(agg,Destruct);
- inherited destroy;
+ Dispose(agg,Destruct);
+ inherited destroy;
end;
function tFontRenderer.rendere(s: string): tLLBild;
-var buf: array of byte;
- ho,br,ymax,ymin,xmax,xmin,i,j: longint;
- b: boolean;
-begin
- while pos('.',s)>0 do
- s[pos('.',s)]:=',';
- br:=4*round(ceil(agg^.textWidth(char_ptr(s))));
- ho:=4*round(ceil(agg^.fontHeight));
- setlength(buf,ho*br*4);
- agg^.attach(@(buf[0]), br, ho, br * 4);
- agg^.clearAll(0, 0, 0);
- agg^.lineColor(0, 0, 0, 255);
- agg^.fillColor(255, 255, 255, 255);
- agg^.rectangle(-2, -2, br+2, ho+2);
- agg^.lineColor(255, 0, 0, 255);
- agg^.fillColor(0, 0, 0, 255);
- agg^.text(br div 2, ho div 2, char_ptr(s));
-
- ymax:=ho;
- b:=true;
- while b and (ymax>0) do begin
- dec(ymax);
- for i:=0 to br-1 do
- if (buf[4*(i+br*ymax)+0]<>$ff) or
+var
+ buf: array of byte;
+ ho,br,ymax,ymin,xmax,xmin,i,j: longint;
+ b: boolean;
+begin
+ while pos('.',s)>0 do
+ s[pos('.',s)]:=',';
+ br:=4*round(ceil(agg^.textWidth(char_ptr(s))));
+ ho:=4*round(ceil(agg^.fontHeight));
+ setlength(buf,ho*br*4);
+ agg^.attach(@(buf[0]), br, ho, br * 4);
+ agg^.clearAll(0, 0, 0);
+ agg^.lineColor(0, 0, 0, 255);
+ agg^.fillColor(255, 255, 255, 255);
+ agg^.rectangle(-2, -2, br+2, ho+2);
+ agg^.lineColor(255, 0, 0, 255);
+ agg^.fillColor(0, 0, 0, 255);
+ agg^.text(br div 2, ho div 2, char_ptr(s));
+
+ ymax:=ho;
+ b:=true;
+ while b and (ymax>0) do begin
+ dec(ymax);
+ for i:=0 to br-1 do
+ if (buf[4*(i+br*ymax)+0]<>$ff) or
(buf[4*(i+br*ymax)+1]<>$ff) or
(buf[4*(i+br*ymax)+2]<>$ff) then
- b:=false;
- end;
- if b then begin
- gibAus('Leeres Bild!',3);
- halt(1);
- end;
- ymin:=-1;
- b:=true;
- while b and (ymin<ymax) do begin
- inc(ymin);
- for i:=0 to br-1 do
- if (buf[4*(i+br*ymin)+0]<>$ff) or
+ b:=false;
+ end;
+ if b then begin
+ gibAus('Leeres Bild!',3);
+ halt(1);
+ end;
+ ymin:=-1;
+ b:=true;
+ while b and (ymin<ymax) do begin
+ inc(ymin);
+ for i:=0 to br-1 do
+ if (buf[4*(i+br*ymin)+0]<>$ff) or
(buf[4*(i+br*ymin)+1]<>$ff) or
(buf[4*(i+br*ymin)+2]<>$ff) then
- b:=false;
- end;
- if b then begin
- gibAus('Leeres Bild!',3);
- halt(1);
- end;
-
- xmax:=br;
- b:=true;
- while b and (xmax>0) do begin
- dec(xmax);
- for i:=ymin to ymax do
- if (buf[4*(xmax+br*i)+0]<>$ff) or
+ b:=false;
+ end;
+ if b then begin
+ gibAus('Leeres Bild!',3);
+ halt(1);
+ end;
+
+ xmax:=br;
+ b:=true;
+ while b and (xmax>0) do begin
+ dec(xmax);
+ for i:=ymin to ymax do
+ if (buf[4*(xmax+br*i)+0]<>$ff) or
(buf[4*(xmax+br*i)+1]<>$ff) or
(buf[4*(xmax+br*i)+2]<>$ff) then
- b:=false;
- end;
- if b then begin
- gibAus('Leeres Bild!',3);
- halt(1);
- end;
- xmin:=-1;
- b:=true;
- while b and (xmin<=xmax) do begin
- inc(xmin);
- for i:=ymin to ymax do
- if (buf[4*(xmin+br*i)+0]<>$ff) or
+ b:=false;
+ end;
+ if b then begin
+ gibAus('Leeres Bild!',3);
+ halt(1);
+ end;
+ xmin:=-1;
+ b:=true;
+ while b and (xmin<=xmax) do begin
+ inc(xmin);
+ for i:=ymin to ymax do
+ if (buf[4*(xmin+br*i)+0]<>$ff) or
(buf[4*(xmin+br*i)+1]<>$ff) or
(buf[4*(xmin+br*i)+2]<>$ff) then
- b:=false;
- end;
- if b then begin
- gibAus('Leeres Bild!',3);
- halt(1);
- end;
-
- dec(xmin);
- dec(ymin);
- inc(xmax);
- inc(ymax);
-
- result.breite:=xmax-xmin+1;
- result.hoehe:=ymax-ymin+1;
-
- setlength(result.farben,result.breite*result.hoehe);
- for i:=0 to result.breite-1 do
- for j:=0 to result.hoehe-1 do begin
- result.farben[i + j*result.breite].rgbBlue:= byte(buf[4*(i+xmin+br*(j+ymin))+0]);
- result.farben[i + j*result.breite].rgbGreen:=byte(buf[4*(i+xmin+br*(j+ymin))+1]);
- result.farben[i + j*result.breite].rgbRed:= byte(buf[4*(i+xmin+br*(j+ymin))+2]);
- end;
+ b:=false;
+ end;
+ if b then begin
+ gibAus('Leeres Bild!',3);
+ halt(1);
+ end;
+
+ dec(xmin);
+ dec(ymin);
+ inc(xmax);
+ inc(ymax);
+
+ result.breite:=xmax-xmin+1;
+ result.hoehe:=ymax-ymin+1;
+
+ setlength(result.farben,result.breite*result.hoehe);
+ for i:=0 to result.breite-1 do
+ for j:=0 to result.hoehe-1 do begin
+ result.farben[i + j*result.breite].rgbBlue:= byte(buf[4*(i+xmin+br*(j+ymin))+0]);
+ result.farben[i + j*result.breite].rgbGreen:=byte(buf[4*(i+xmin+br*(j+ymin))+1]);
+ result.farben[i + j*result.breite].rgbRed:= byte(buf[4*(i+xmin+br*(j+ymin))+2]);
+ end;
{ for i:=0 to 1 do
- for j:=0 to 1 do begin
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbRed:=
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbRed xor $ff;
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbGreen:=
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbGreen xor $ff;
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbBlue:=
- result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbBlue xor $ff;
- end; }
- setlength(buf,0);
+ for j:=0 to 1 do begin
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbRed:=
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbRed xor $ff;
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbGreen:=
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbGreen xor $ff;
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbBlue:=
+ result.farben[i*(result.breite-1) + j*(result.hoehe-1)*result.breite].rgbBlue xor $ff;
+ end; }
+ setlength(buf,0);
end;
// tTransformation *************************************************************
+constructor tTransformation.create;
+begin
+ inherited create;
+ fillchar(vorgaenger,sizeOf(vorgaenger),#0);
+ fillchar(nachfolger,sizeOf(nachfolger),#0);
+end;
+
+destructor tTransformation.destroy;
+var
+ i: longint;
+begin
+ for i:=0 to length(vorgaenger)-1 do
+ vorgaenger[i].loescheNachfolger(self);
+ setlength(vorgaenger,0);
+ if hatNachfolger then begin
+ gibAus('Ich habe noch '+inttostr(length(nachfolger))+' Nachfolger, da kann ich mich nicht zerstören!',3);
+ raise exception.create('Ich habe noch '+inttostr(length(nachfolger))+' Nachfolger, da kann ich mich nicht zerstören!');
+ end;
+ inherited destroy;
+end;
+
+destructor tTransformation.freeAll;
+var
+ i: longint;
+begin
+ for i:=0 to length(vorgaenger)-1 do
+ vorgaenger[i].loescheNachfolger(self);
+ if hatNachfolger then begin
+ gibAus('Ich habe noch '+inttostr(length(nachfolger))+' Nachfolger, da kann ich mich nicht zerstören!',3);
+ raise exception.create('Ich habe noch '+inttostr(length(nachfolger))+' Nachfolger, da kann ich mich nicht zerstören!');
+ end;
+ for i:=0 to length(vorgaenger)-1 do
+ vorgaenger[i].freeAll;
+ setlength(vorgaenger,0);
+ inherited destroy;
+end;
+
procedure tTransformation.testeAuszerhalb(const p: tExtPoint);
begin
- if (p['x']<0) or (p['x']>in_xs_ts['x']-1) or
- (p['y']<0) or (p['y']>in_xs_ts['y']-1) then
- raise exception.create('Punkt '+tExtPointToStr(p)+' liegt außerhalb des gültigen Eingabebereich (0..'+inttostr(in_xs_ts['x']-1)+' x 0..'+inttostr(in_xs_ts['y']-1)+')!');
+ if (p['x']<0) or (p['x']>in_xs_ts['x']-1) or
+ (p['y']<0) or (p['y']>in_xs_ts['y']-1) then begin
+ gibAus('Punkt '+tExtPointToStr(p)+' liegt außerhalb des gültigen Eingabebereich (0..'+inttostr(in_xs_ts['x']-1)+' x 0..'+inttostr(in_xs_ts['y']-1)+')!',3);
+ raise exception.create('Punkt '+tExtPointToStr(p)+' liegt außerhalb des gültigen Eingabebereich (0..'+inttostr(in_xs_ts['x']-1)+' x 0..'+inttostr(in_xs_ts['y']-1)+')!');
+ end;
+end;
+
+procedure tTransformation.aktualisiereAchsen; // nicht zum direkten Aufrufen
+begin
+end;
+
+procedure tTransformation.aktualisiereXsTs; // nicht zum direkten Aufrufen
+begin
end;
-function tTransformation.transformiereKoordinaten(const x,y: longint): tExtPoint;
-var p: tExtPoint;
+procedure tTransformation.aktualisiereWmia; // nicht zum direkten Aufrufen
begin
- p['x']:=x;
- p['y']:=y;
- result:=transformiereKoordinaten(p);
end;
-function tTransformation.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
+function tTransformation.rXstart: extended;
begin
- result:=p;
- testeAuszerhalb(p);
+ result:=out_achsen['x','x'];
end;
-function tTransformation.transformiereWert(const x: extended): extended;
+procedure tTransformation.wXstart(x: extended);
begin
- result:=x;
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will xstart schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will xstart schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_achsen['x','x']:=x;
+ aktualisiereAlles;
+end;
+
+function tTransformation.rXstop: extended;
+begin
+ result:=out_Achsen['x','y'];
+end;
+
+procedure tTransformation.wXstop(x: extended);
+begin
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will xstop schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will xstop schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_achsen['x','y']:=x;
+ aktualisiereAlles;
end;
-function tTransformation.xsteps_tsiz: tIntPoint;
+function tTransformation.rTstart: extended;
begin
- result:=in_xs_ts;
+ result:=out_Achsen['y','x'];
end;
-function tTransformation.achsen: t2x2Extended;
-var c,d: char;
+procedure tTransformation.wTstart(t: extended);
begin
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- result[c,d]:=in_achsen[c,d]*byte((in_xs_ts['x']>0) and (in_xs_ts['y']>0));
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will tstart schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will tstart schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_achsen['y','x']:=t;
+ aktualisiereAlles;
+end;
+
+function tTransformation.rTstop: extended;
+begin
+ result:=out_Achsen['y','y'];
+end;
+
+procedure tTransformation.wTstop(t: extended);
+begin
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will tstop schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will tstop schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_achsen['y','y']:=t;
+ aktualisiereAlles;
+end;
+
+function tTransformation.rWmin: extended;
+begin
+ result:=out_wmia['x'];
+end;
+
+procedure tTransformation.wWmin(w: extended);
+begin
+ out_wmia['x']:=w;
+ wmiaExplizit:=true;
+ aktualisiereAlles;
+end;
+
+function tTransformation.rWmax: extended;
+begin
+ result:=out_wmia['y'];
+end;
+
+procedure tTransformation.wWmax(w: extended);
+begin
+ wmiaExplizit:=true;
+ out_wmia['y']:=w;
+end;
+
+function tTransformation.rXsteps: longint;
+begin
+ result:=out_xs_ts['x'];
+end;
+
+procedure tTransformation.wXsteps(x: longint);
+begin
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will xsteps schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will xsteps schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_xs_ts['x']:=x;
+end;
+
+function tTransformation.rTsiz: longint;
+begin
+ result:=out_xs_ts['y'];
+end;
+
+procedure tTransformation.wTsiz(t: longint);
+begin
+ if not (self is tKeineTransformation) then begin
+ gibAus('Will tsiz schreiben, aber bin nicht der Anfang einer Transformationskette!',3);
+ raise exception.create('Will tsiz schreiben, aber bin nicht der Anfang einer Transformationskette!');
+ end;
+ in_xs_ts['y']:=t;
+end;
+
+procedure tTransformation.fuegeNachfolgerHinzu(tr: tTransformation);
+begin
+ if assigned(tr) then begin
+ setlength(nachfolger,length(nachfolger)+1);
+ nachfolger[length(nachfolger)-1]:=tr;
+ end;
+end;
+
+procedure tTransformation.loescheNachfolger(tr: tTransformation);
+var
+ i,j: longint;
+begin
+ for i:=0 to length(nachfolger)-1 do
+ if nachfolger[i]=tr then begin
+ for j:=i+1 to length(nachfolger)-1 do
+ nachfolger[j-1]:=nachfolger[j];
+ setlength(nachfolger,length(nachfolger)-1);
+ exit;
+ end;
+ gibAus('Kann zu löschenden Nachfolger nicht finden!',3);
+ raise exception.create('Kann zu löschenden Nachfolger nicht finden!');
+end;
+
+procedure tTransformation.fuegeVorgaengerHinzu(tr: tTransformation);
+begin
+ if assigned(tr) then begin
+ setlength(vorgaenger,length(vorgaenger)+1);
+ vorgaenger[length(vorgaenger)-1]:=tr;
+ end;
+end;
+
+procedure tTransformation.loescheVorgaenger(tr: tTransformation);
+var
+ i,j: longint;
+begin
+ for i:=0 to length(vorgaenger)-1 do
+ if vorgaenger[i]=tr then begin
+ for j:=i+1 to length(vorgaenger)-1 do
+ vorgaenger[j-1]:=vorgaenger[j];
+ setlength(vorgaenger,length(vorgaenger)-1);
+ exit;
+ end;
+ gibAus('Kann zu löschenden Vorgänger nicht finden!',3);
+ raise exception.create('Kann zu löschenden Vorgänger nicht finden!');
+end;
+
+function tTransformation.hatNachfolger: boolean;
+begin
+ result:=length(nachfolger)>0;
+end;
+
+procedure tTransformation.aktualisiereAlles; // (inkl. Informieren der Nachfolger)
+var
+ i: longint;
+begin
+ aktualisiereAchsen;
+ aktualisiereWmia;
+ aktualisiereXsTs;
+ for i:=0 to length(nachfolger)-1 do
+ nachfolger[i].aktualisiereAlles;
+end;
+
+function tTransformation.ersetzeAnfangDurch(tr: tTransformation): boolean;
+begin
+ result:=false;
+
+ if length(vorgaenger)<>1 then begin
+ gibAus('Kann Anfang von Transformation nicht ersetzen, da nicht genau ein Vorgänger!',3);
+ exit;
+ end;
+
+ if vorgaenger[0] is tKeineTransformation then begin
+ vorgaenger[0].loescheNachfolger(self);
+ if not vorgaenger[0].hatNachfolger then
+ vorgaenger[0].free;
+ vorgaenger[0]:=tr;
+ vorgaenger[0].fuegeNachfolgerHinzu(self);
+ result:=true;
+ end
+ else
+ result:=vorgaenger[0].ersetzeAnfangDurch(tr);
+end;
+
+function tTransformation.beliebigerVorgaenger: tTransformation;
+begin
+ result:=vorgaenger[0];
+end;
+
+function tTransformation.transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint;
+begin
+ result:=p;
+ testeAuszerhalb(p);
+end;
+
+function tTransformation.transformiereKoordinaten(const p: tExtPoint; const tiefe: longint = -1): tExtPoint;
+begin
+ if (length(vorgaenger)>0) and (tiefe<>0) then
+ result:=vorgaenger[0].transformiereKoordinaten(p,tiefe-1)
+ else
+ result:=p;
+ result:=transformiereKoordinatenEinzeln(result);
+end;
+
+function tTransformation.transformiereKoordinaten(const x,y: longint; const tiefe: longint = -1): tExtPoint;
+var
+ p: tExtPoint;
+begin
+ p['x']:=x;
+ p['y']:=y;
+ result:=transformiereKoordinaten(p,tiefe);
+end;
+
+function tTransformation.wertZuPositionAufAchse(const l: tLage; x: extended): extended;
+var
+ c,d: char;
+ p: tExtPoint;
+begin
+ c:=char(ord('x')+byte(l in [lOben,lUnten]));
+ d:=char(ord('y')-byte(l in [lOben,lUnten]));
+ p[c]:=(x-in_achsen[c,'x'])/(in_achsen[c,'y']-in_achsen[c,'x']);
+ p[d]:=byte(l in [lRechts,lOben]);
+
+ for d:='x' to 'y' do
+ p[d]:=p[d] * (in_xs_ts[d]-1);
+
+ transformiereKoordinaten(p,0);
+
+ result:=p[c]/(out_xs_ts[d]-1);
+end;
+
+function tTransformation.transformiereWertEinzeln(const x: extended): extended;
+begin
+ result:=x;
+end;
+
+function tTransformation.transformiereWert(const x: extended; const tiefe: longint = -1): extended;
+begin
+ if (length(vorgaenger)>0) and (tiefe<>0) then
+ result:=vorgaenger[0].transformiereWert(x,tiefe-1)
+ else
+ result:=x;
+ result:=transformiereWertEinzeln(result);
end;
function tTransformation.dumpParams: string;
begin
- result:='';
+ result:='';
+end;
+
+function tTransformation.dumpParams(tiefe: longint): string;
+var
+ i: longint;
+begin
+ if tiefe=0 then
+ result:=''
+ else
+ for i:=0 to length(vorgaenger)-1 do begin
+ if length(vorgaenger)>1 then
+ result:=result+#13'< '+inttostr(i)+' >';
+ result:=result+#13+vorgaenger[i].dumpParams(tiefe-1);
+ end;
+ result:=result+inttostr(tiefe+1)+': '+dumpParams;
+end;
+
+// tUeberlagerung **************************************************************
+
+procedure tUeberlagerung.addKomponente(tr: tTransformation);
+begin
+ fuegeVorgaengerHinzu(tr);
end;
// tFFTTransformation **********************************************************
constructor tFFTTransformation.create;
begin
- inherited create;
- horizontal:=false;
- vertikal:=false;
+ inherited create;
+ horizontal:=false;
+ vertikal:=false;
end;
-constructor tFFTTransformation.create(original: tFFTTransformation);
+constructor tFFTTransformation.create(vorg: tTransformation; hor,ver: boolean);
begin
- inherited create;
- horizontal:=original.horizontal;
- vertikal:=original.vertikal;
+ inherited create;
+ fuegeVorgaengerHinzu(vorg);
+ horizontal:=hor;
+ vertikal:=ver;
end;
-function tFFTTransformation.achsen: t2x2Extended;
-var c: char;
+procedure tFFTTransformation.aktualisiereAchsen;
+var
+ c: char;
begin
- if horizontal then begin
- result['x','x']:=0;
- result['x','y']:=(in_xs_ts['x']-1)/(in_achsen['x','y']-in_achsen['x','x']);
- end
- else
- for c:='x' to 'y' do
- result['x',c]:=in_achsen['x',c];
- if vertikal then begin
- result['y','x']:=0;
- result['y','y']:=(in_xs_ts['y']-1)/(in_achsen['y','y']-in_achsen['y','x']);
- end
- else
- for c:='x' to 'y' do
- result['y',c]:=in_achsen['y',c];
+ if horizontal then begin
+ out_achsen['x','x']:=0;
+ out_achsen['x','y']:=(in_xs_ts['x']-1)/(in_achsen['x','y']-in_achsen['x','x']);
+ end
+ else
+ for c:='x' to 'y' do
+ out_achsen['x',c]:=in_achsen['x',c];
+ if vertikal then begin
+ out_achsen['y','x']:=0;
+ out_achsen['y','y']:=(in_xs_ts['y']-1)/(in_achsen['y','y']-in_achsen['y','x']);
+ end
+ else
+ for c:='x' to 'y' do
+ out_achsen['y',c]:=in_achsen['y',c];
end;
function tFFTTransformation.dumpParams: string;
begin
- result:='FFT: ';
- if horizontal then result:=result+'h';
- if vertikal then result:=result+'v';
+ result:='FFT: ';
+ if horizontal then result:=result+'h';
+ if vertikal then result:=result+'v';
end;
// tSpiegelungsTransformation **************************************************
constructor tSpiegelungsTransformation.create;
begin
- inherited create;
+ inherited create;
end;
-function tSpiegelungsTransformation.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
+constructor tSpiegelungsTransformation.create(vorg: tTransformation);
begin
- testeAuszerhalb(p);
- result['x']:=in_xs_ts['x']-1-p['x'];
- result['y']:=p['y'];
+ inherited create;
+ fuegeVorgaengerHinzu(vorg);
+end;
+
+function tSpiegelungsTransformation.transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint;
+begin
+ testeAuszerhalb(p);
+ result['x']:=in_xs_ts['x']-1-p['x'];
+ result['y']:=p['y'];
end;
function tSpiegelungsTransformation.dumpParams: string;
begin
- result:='horizontale Spiegelung';
+ result:='horizontale Spiegelung';
end;
// tKonkreteKoordinatenTransformation ******************************************
constructor tKonkreteKoordinatenTransformation.create;
-var c,d: char;
-begin
- for c:='x' to 'y' do begin
- for d:='x' to 'y' do begin
- lin[c,d]:=byte(c=d);
- lnInt[c,d]:=0;
- expExp[c,d]:=0;
- end;
- off[c]:=0;
- lnFak[c]:=0;
- expFak[c]:=0;
- lnOff[c]:=1;
- end;
-end;
-
-constructor tKonkreteKoordinatenTransformation.create(original: tKonkreteKoordinatenTransformation);
-var c,d: char;
-begin
- for c:='x' to 'y' do begin
- for d:='x' to 'y' do begin
- lin[c,d]:=original.lin[c,d];
- lnInt[c,d]:=original.lnInt[c,d];
- expExp[c,d]:=original.expExp[c,d];
- end;
- off[c]:=original.off[c];
- lnFak[c]:=original.lnFak[c];
- expFak[c]:=original.expFak[c];
- lnOff[c]:=original.lnOff[c];
- end;
+var
+ c,d: char;
+begin
+ for c:='x' to 'y' do begin
+ for d:='x' to 'y' do begin
+ lin[c,d]:=byte(c=d);
+ lnInt[c,d]:=0;
+ expExp[c,d]:=0;
+ end;
+ off[c]:=0;
+ lnFak[c]:=0;
+ expFak[c]:=0;
+ lnOff[c]:=1;
+ end;
end;
function tKonkreteKoordinatenTransformation.findeLineareParameter(syntaxtest: boolean; auszenSkala: char; s: string; xscale,yscale: extended; var off,xl,yl: extended; ueberschreiben: boolean; etf: tExprToFloat): boolean;
-var t: string;
- c: char;
- tmp: extended;
-begin
- result:=false;
- if ueberschreiben then begin
- off:=0;
- xl:=0;
- yl:=0;
- end;
- while length(s)>0 do begin
- t:=leftStr(s,max(binOpPos('+',s),binOpPos('-',s))-1);
- if (binOpPos('+',t)>0) or (binOpPos('-',t)>0) then
- t:=leftStr(s,min(binOpPos('+',s),binOpPos('-',s))-1);
- if t='' then begin
- t:=s;
- s:='';
- end
- else
- delete(s,1,length(t));
- if t='' then exit;
- c:=rightStr(t,1)[1];
- if c in ['x','y'] then delete(t,length(t),1);
- if leftStr(t,1)='+' then delete(t,1,1);
- if t='' then tmp:=1
- else if t='-' then tmp:=-1
- else try
- tmp:=etf(syntaxtest,t);
- case c of
- 'x': tmp:=tmp*xscale;
- 'y': tmp:=tmp*yscale;
- end;
- case auszenSkala of
- 'x': tmp:=tmp/xscale;
- 'y': tmp:=tmp/yscale;
- end;
- except
- exit;
- end;
- case c of
- 'x':
- xl:=xl+tmp;
- 'y','t':
- yl:=yl+tmp;
- else
- off:=off+tmp;
- end{of case};
- end;
- result:=true;
-end;
-
-function tKonkreteKoordinatenTransformation.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
-var c,d: char;
- lt,et: extended;
-begin
- testeAuszerhalb(p);
- for c:='x' to 'y' do begin
- result[c]:=off[c];
- lt:=lnOff[c];
- et:=0;
- for d:='x' to 'y' do begin
- result[c]:=
- result[c] + p[d]*lin[c,d];
- lt:=lt+p[d]*lnInt[c,d];
- et:=et+p[d]*expExp[c,d];
- end;
- result[c]:=
- result[c] + lnFak[c] * ln(lt) + expFak[c] * exp(et);
- end;
+var
+ t: string;
+ c: char;
+ tmp: extended;
+begin
+ result:=false;
+ if ueberschreiben then begin
+ off:=0;
+ xl:=0;
+ yl:=0;
+ end;
+ while length(s)>0 do begin
+ t:=leftStr(s,max(binOpPos('+',s),binOpPos('-',s))-1);
+ if (binOpPos('+',t)>0) or (binOpPos('-',t)>0) then
+ t:=leftStr(s,min(binOpPos('+',s),binOpPos('-',s))-1);
+ if t='' then begin
+ t:=s;
+ s:='';
+ end
+ else
+ delete(s,1,length(t));
+ if t='' then exit;
+ c:=rightStr(t,1)[1];
+ if c in ['x','y'] then delete(t,length(t),1);
+ if leftStr(t,1)='+' then delete(t,1,1);
+ if t='' then tmp:=1
+ else if t='-' then tmp:=-1
+ else try
+ tmp:=etf(syntaxtest,t);
+ case c of
+ 'x': tmp:=tmp*xscale;
+ 'y': tmp:=tmp*yscale;
+ end;
+ case auszenSkala of
+ 'x': tmp:=tmp/xscale;
+ 'y': tmp:=tmp/yscale;
+ end;
+ except
+ exit;
+ end;
+ case c of
+ 'x':
+ xl:=xl+tmp;
+ 'y','t':
+ yl:=yl+tmp;
+ else
+ off:=off+tmp;
+ end{of case};
+ end;
+ result:=true;
+end;
+
+function tKonkreteKoordinatenTransformation.transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint;
+var
+ c,d: char;
+ lt,et: extended;
+begin
+ testeAuszerhalb(p);
+ for c:='x' to 'y' do begin
+ result[c]:=off[c];
+ lt:=lnOff[c];
+ et:=0;
+ for d:='x' to 'y' do begin
+ result[c]:=
+ result[c] + p[d]*lin[c,d];
+ lt:=lt+p[d]*lnInt[c,d];
+ et:=et+p[d]*expExp[c,d];
+ end;
+ result[c]:=
+ result[c] + lnFak[c] * ln(lt) + expFak[c] * exp(et);
+ end;
end;
function tKonkreteKoordinatenTransformation.initAbbildung(syntaxtest: boolean; s: string; xscale,yscale: extended; etf: tExprToFloat): boolean;
-var c,d: char;
- i: longint;
- t,u,v: string;
- tmp: extended;
-begin
- result:=false;
- if not assigned(etf) then exit;
- for c:='x' to 'y' do begin
- for d:='x' to 'y' do begin
- lin[c,d]:=0;
- lnInt[c,d]:=0;
- expExp[c,d]:=0;
- end;
- off[c]:=0;
- lnFak[c]:=0;
- expFak[c]:=0;
- lnOff[c]:=1;
- end;
- while pos(' ',s)>0 do
- delete(s,pos(' ',s),1);
- if (not startetMit('(',s)) or
+var
+ c,d: char;
+ i: longint;
+ t,u,v: string;
+ tmp: extended;
+begin
+ result:=false;
+ if not assigned(etf) then exit;
+ for c:='x' to 'y' do begin
+ for d:='x' to 'y' do begin
+ lin[c,d]:=0;
+ lnInt[c,d]:=0;
+ expExp[c,d]:=0;
+ end;
+ off[c]:=0;
+ lnFak[c]:=0;
+ expFak[c]:=0;
+ lnOff[c]:=1;
+ end;
+ while pos(' ',s)>0 do
+ delete(s,pos(' ',s),1);
+ if (not startetMit('(',s)) or
(not endetMit(')',s)) then exit;
- if pos(';',s)=0 then exit;
- t:=erstesArgument(s,';');
- if (t='') or (s='') then exit;
- for c:='x' to 'y' do begin
- while pos('(',t)>0 do begin
- u:=t;
- delete(u,1,pos('(',u));
- if pos(')',u)=0 then exit;
- u:=leftStr(u,pos(')',u)-1);
- i:=pos('(',t);
- while (i>=1) and not (t[i] in ['+','-']) do
- dec(i);
- if i=0 then i:=1;
- v:=copy(t,i,pos('(',t)-i-3);
- if leftStr(v,1)='+' then delete(v,1,1);
- if v='' then tmp:=1
- else if v='-' then tmp:=-1
- else try
- tmp:=etf(syntaxtest,v);
- if c='x' then tmp:=tmp/xscale
- else tmp:=tmp/yscale;
- except
- exit;
- end;
- if copy(t,pos('(',t)-3,3)='log' then begin
- lnFak[c]:=tmp;
- if not findeLineareParameter(syntaxtest,' ',u,xscale,yscale,lnOff[c],lnInt[c,'x'],lnInt[c,'y'],true,etf) then exit;
- end
- else if copy(t,pos('(',t)-3,3)='exp' then begin
- expFak[c]:=tmp;
- tmp:=0;
- if not findeLineareParameter(syntaxtest,' ',u,xscale,yscale,tmp,expExp[c,'x'],expExp[c,'y'],true,etf) then exit;
- if tmp<>0 then exit;
- end
- else exit;
- delete(t,i,pos(')',t)-i+1);
- end;
- if t<>'' then
- if not findeLineareParameter(syntaxtest,c,t,xscale,yscale,off[c],lin[c,'x'],lin[c,'y'],false,etf) then exit;
- t:=s;
- end;
- result:=true;
+ if pos(';',s)=0 then exit;
+ t:=erstesArgument(s,';');
+ if (t='') or (s='') then exit;
+ for c:='x' to 'y' do begin
+ while pos('(',t)>0 do begin
+ u:=t;
+ delete(u,1,pos('(',u));
+ if pos(')',u)=0 then exit;
+ u:=leftStr(u,pos(')',u)-1);
+ i:=pos('(',t);
+ while (i>=1) and not (t[i] in ['+','-']) do
+ dec(i);
+ if i=0 then i:=1;
+ v:=copy(t,i,pos('(',t)-i-3);
+ if leftStr(v,1)='+' then delete(v,1,1);
+ if v='' then tmp:=1
+ else if v='-' then tmp:=-1
+ else try
+ tmp:=etf(syntaxtest,v);
+ if c='x' then tmp:=tmp/xscale
+ else tmp:=tmp/yscale;
+ except
+ exit;
+ end;
+ if copy(t,pos('(',t)-3,3)='log' then begin
+ lnFak[c]:=tmp;
+ if not findeLineareParameter(syntaxtest,' ',u,xscale,yscale,lnOff[c],lnInt[c,'x'],lnInt[c,'y'],true,etf) then exit;
+ end
+ else if copy(t,pos('(',t)-3,3)='exp' then begin
+ expFak[c]:=tmp;
+ tmp:=0;
+ if not findeLineareParameter(syntaxtest,' ',u,xscale,yscale,tmp,expExp[c,'x'],expExp[c,'y'],true,etf) then exit;
+ if tmp<>0 then exit;
+ end
+ else exit;
+ delete(t,i,pos(')',t)-i+1);
+ end;
+ if t<>'' then
+ if not findeLineareParameter(syntaxtest,c,t,xscale,yscale,off[c],lin[c,'x'],lin[c,'y'],false,etf) then exit;
+ t:=s;
+ end;
+ result:=true;
end;
function tKonkreteKoordinatenTransformation.dumpParams: string;
-var c,d: char;
-begin
- result:='';
- for c:='x' to 'y' do begin
- result:=result+#13#10+c+' = ';
- if off[c]<>0 then
- result:=result + floattostr(off[c]) + ' ';
- for d:='x' to 'y' do
- if lin[c,d]<>0 then
- result:=result + '+ ' + floattostr(lin[c,d]) + ' ' + d + ' ';
- if lnFak[c]<>0 then begin
- result:=result + '+ ' + floattostr(lnFak[c])+' log ( ';
- if lnOff[c]<>0 then
- result:=result + floattostr(lnoff[c]) + ' ';
- for d:='x' to 'y' do
- if lnInt[c,d]<>0 then
- result:=result + '+ ' + floattostr(lnInt[c,d]) + ' ' + d + ' ';
- result:=result + ') ';
- end;
- if expFak[c]<>0 then begin
- result:=result + '+ ' + floattostr(expFak[c])+' exp ( ';
- for d:='x' to 'y' do
- if expExp[c,d]<>0 then
- result:=result + '+ ' + floattostr(expExp[c,d]) + ' ' + d + ' ';
- result:=result + ') ';
- end;
- end;
- delete(result,1,2);
+var
+ c,d: char;
+begin
+ result:='';
+ for c:='x' to 'y' do begin
+ result:=result+#13#10+c+' = ';
+ if off[c]<>0 then
+ result:=result + floattostr(off[c]) + ' ';
+ for d:='x' to 'y' do
+ if lin[c,d]<>0 then
+ result:=result + '+ ' + floattostr(lin[c,d]) + ' ' + d + ' ';
+ if lnFak[c]<>0 then begin
+ result:=result + '+ ' + floattostr(lnFak[c])+' log ( ';
+ if lnOff[c]<>0 then
+ result:=result + floattostr(lnoff[c]) + ' ';
+ for d:='x' to 'y' do
+ if lnInt[c,d]<>0 then
+ result:=result + '+ ' + floattostr(lnInt[c,d]) + ' ' + d + ' ';
+ result:=result + ') ';
+ end;
+ if expFak[c]<>0 then begin
+ result:=result + '+ ' + floattostr(expFak[c])+' exp ( ';
+ for d:='x' to 'y' do
+ if expExp[c,d]<>0 then
+ result:=result + '+ ' + floattostr(expExp[c,d]) + ' ' + d + ' ';
+ result:=result + ') ';
+ end;
+ end;
+ delete(result,1,2);
end;
function tKonkreteKoordinatenTransformation.zielausdehnung: t2x2Longint;
-var RandPkt: tExtPoint;
- i,j,k: longint;
- c,d: char;
-begin
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- result[c,d]:=-1;
- for k:=0 to 1 do
- for i:=0 to (in_xs_ts['x']*(1-k)+in_xs_ts['y']*k)-1 do
- for j:=0 to 1 do begin
- RandPkt:=transformiereKoordinaten(
- i*(1-k) + j*k*(in_xs_ts['x']-1),
- j*(1-k)*(in_xs_ts['y']-1) + i*k);
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- if ((i=0) and (j=0)) or ((d='y') xor (result[c,d]>floor(RandPkt[c]) + byte(d='y'))) then
- result[c,d]:=floor(RandPkt[c]) + byte(d='y');
- end;
-end;
-
-function tKonkreteKoordinatenTransformation.xsteps_tsiz: tIntPoint;
-var gr: t2x2Longint;
- c: char;
-begin
- gr:=zielausdehnung;
- for c:='x' to 'y' do
- result[c]:=gr[c,'y']-gr[c,'x']+1;
+var
+ RandPkt: tExtPoint;
+ i,j,k: longint;
+ c,d: char;
+begin
+ for c:='x' to 'y' do
+ for d:='x' to 'y' do
+ result[c,d]:=-1;
+ for k:=0 to 1 do
+ for i:=0 to (in_xs_ts['x']*(1-k)+in_xs_ts['y']*k)-1 do
+ for j:=0 to 1 do begin
+ RandPkt:=transformiereKoordinaten(
+ i*(1-k) + j*k*(in_xs_ts['x']-1),
+ j*(1-k)*(in_xs_ts['y']-1) + i*k);
+ for c:='x' to 'y' do
+ for d:='x' to 'y' do
+ if ((i=0) and (j=0)) or ((d='y') xor (result[c,d]>floor(RandPkt[c]) + byte(d='y'))) then
+ result[c,d]:=floor(RandPkt[c]) + byte(d='y');
+ end;
+end;
+
+procedure tKonkreteKoordinatenTransformation.aktualisiereXsTs;
+var
+ gr: t2x2Longint;
+ c: char;
+begin
+ gr:=zielausdehnung;
+ for c:='x' to 'y' do
+ out_xs_ts[c]:=gr[c,'y']-gr[c,'x']+1;
end;
// tKoordinatenAusschnitt ******************************************************
constructor tKoordinatenAusschnitt.create;
-var c,d: char;
+var
+ c,d: char;
begin
- inherited create;
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- gr[c,d]:=0;
+ inherited create;
+ for c:='x' to 'y' do
+ for d:='x' to 'y' do
+ gr[c,d]:=0;
end;
-constructor tKoordinatenAusschnitt.create(original: tKoordinatenAusschnitt);
-var c,d: char;
+constructor tKoordinatenAusschnitt.create(vorg: tTransformation; xmin,xmax,tmin,tmax: longint);
begin
- inherited create;
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- gr[c,d]:=original.gr[c,d];
+ inherited create;
+ fuegeVorgaengerHinzu(vorg);
+ gr['x','x']:=xmin;
+ gr['x','y']:=xmax;
+ gr['y','x']:=tmin;
+ gr['y','y']:=tmax;
end;
-function tKoordinatenAusschnitt.xsteps_tsiz: tIntPoint;
-var c: char;
+procedure tKoordinatenAusschnitt.aktualisiereXsTs;
+var
+ c: char;
begin
- for c:='x' to 'y' do
- result[c]:=max(0,min(in_xs_ts[c],gr[c,'y']+1)-gr[c,'x']);
+ for c:='x' to 'y' do
+ out_xs_ts[c]:=max(0,min(in_xs_ts[c],gr[c,'y']+1)-gr[c,'x']);
end;
-function tKoordinatenAusschnitt.achsen: t2x2Extended;
-var c,d: char;
+procedure tKoordinatenAusschnitt.aktualisiereAchsen;
+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];
- 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
- for d:='x' to 'y' do
- result[c,d]:=in_achsen[c,'x'] + gr[c,d]/(in_xs_ts[c]-1)*(in_achsen[c,'y']-in_achsen[c,'x']);
+ for c:='x' to 'y' do
+ if in_xs_ts[c]<=1 then begin
+ for d:='x' to 'y' do
+ out_achsen[c,d]:=in_achsen[c,d];
+ 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
+ for d:='x' to 'y' do
+ out_achsen[c,d]:=in_achsen[c,'x'] + gr[c,d]/(in_xs_ts[c]-1)*(in_achsen[c,'y']-in_achsen[c,'x']);
end;
-function tKoordinatenAusschnitt.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
-var c: char;
+function tKoordinatenAusschnitt.transformiereKoordinatenEinzeln(const p: tExtPoint): tExtPoint;
+var
+ c: char;
begin
- testeAuszerhalb(p);
- for c:='x' to 'y' do
- result[c]:=max(0,min(gr[c,'y'],p[c])-gr[c,'x']);
+ testeAuszerhalb(p);
+ for c:='x' to 'y' do
+ result[c]:=max(0,min(gr[c,'y'],p[c])-gr[c,'x']);
end;
function tKoordinatenAusschnitt.dumpParams: string;
begin
- result:='Koordinatenausschnitt: '+inttostr(gr['x','x'])+'..'+inttostr(gr['x','y'])+' x '+inttostr(gr['y','x'])+'..'+inttostr(gr['y','y']);
+ result:='Koordinatenausschnitt: '+inttostr(gr['x','x'])+'..'+inttostr(gr['x','y'])+' x '+inttostr(gr['y','x'])+'..'+inttostr(gr['y','y']);
end;
// tAgglomeration **************************************************************
@@ -1486,55 +1819,68 @@ end;
constructor tAgglomeration.create;
begin
inherited create;
- schritt:=0;
- anzahl:=0;
+ schritt:=-1;
horizontal:=false;
end;
-constructor tAgglomeration.create(original: tAgglomeration);
+procedure tAgglomeration.addKomponente(tr: tTransformation);
begin
- inherited create;
- schritt:=original.schritt;
- anzahl:=original.anzahl;
- horizontal:=original.horizontal;
+ fuegeVorgaengerHinzu(tr);
end;
-function tAgglomeration.xsteps_tsiz: tIntPoint;
+procedure tAgglomeration.aktualisiereXsTs;
var
c: char;
begin
for c:='x' to 'y' do
- result[c]:=in_xs_ts[c]*(1+(anzahl-1)*byte(horizontal xor (c='y')));
+ out_xs_ts[c]:=in_xs_ts[c]*(1+(length(vorgaenger)-1)*byte(horizontal xor (c='y')));
end;
-function tAgglomeration.achsen: t2x2Extended;
+procedure tAgglomeration.aktualisiereAchsen;
var
c,d: char;
begin
for c:='x' to 'y' do
- if in_xs_ts[c]<=1 then begin
+ if in_xs_ts[c]<=1 then begin // diese Dimension gibt es in der Quelle nicht
+ if (horizontal xor (c='y')) and (schritt<0) then
+ fehler('Die Richtung einer Agglomeration ohne explizite Schrittweite kann nicht senkrecht zur Dimension eindimensionaler Daten sein!');
for d:='x' to 'y' do
- result[c,d]:=in_achsen[c,d] + schritt*(anzahl-1)*byte((horizontal xor (c='y')) and (d='y'));
+ out_achsen[c,d]:=in_achsen[c,d] + schritt*(length(vorgaenger)-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!');
+ else // diese Dimension gibt es in der Quelle
for d:='x' to 'y' do
- result[c,d]:=in_achsen[c,d];
- end;
+ out_achsen[c,d]:=
+ in_achsen[c,d] +
+ (in_achsen[c,'y']-in_achsen[c,'x'])/
+ (1+1/in_xs_ts[c]) *
+ (length(vorgaenger)-1) *
+ byte((horizontal xor (c='y')) and (d='y'));
end;
-function tAgglomeration.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
+function tAgglomeration.wertZuPositionAufAchse(const l: tLage; x: extended): extended;
+var
+ i: longint;
+ c: char;
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))
+ i:=0;
+ if horizontal xor not (l in [lOben,lUnten]) then begin
+ c:=char(ord('x')+byte(l in [lOben,lUnten]));
+ while (i<length(vorgaenger)) and (vorgaenger[i].achsen[c,'y']<x) do
+ inc(i);
+ end;
+
+ if (i>=length(vorgaenger)) or
+ (vorgaenger[i].achsen[c,'x']>x) then result:=0
+ else result:=vorgaenger[i].wertZuPositionAufAchse(l,x);
+
+ result:=(result+i)/length(vorgaenger);
end;
function tAgglomeration.dumpParams: string;
begin
- result:='Agglomeration: '+inttostr(anzahl)+'x ';
+ result:='Agglomeration: '+inttostr(length(vorgaenger))+'x ';
if horizontal then
result:=result+'horizont'
else
@@ -1546,475 +1892,462 @@ end;
constructor tWerteKnickTransformation.create;
begin
- inherited create;
- setlength(parameter,0);
-end;
-
-constructor tWerteKnickTransformation.create(original: tWerteKnickTransformation);
-var i: longint;
-begin
- inherited create;
- setlength(parameter,length(original.parameter));
- for i:=0 to length(parameter)-1 do
- parameter[i]:=original.parameter[i];
+ inherited create;
+ setlength(parameter,0);
end;
destructor tWerteKnickTransformation.destroy;
begin
- setlength(parameter,0);
- inherited destroy;
+ setlength(parameter,0);
+ inherited destroy;
end;
-function tWerteKnickTransformation.transformiereWert(const x: extended): extended;
-var i: longint;
+function tWerteKnickTransformation.transformiereWertEinzeln(const x: extended): extended;
+var
+ i: longint;
begin
- if x>=parameter[length(parameter)-2] then begin
- result:=parameter[length(parameter)-1];
- exit;
- end;
- i:=0;
- while (i<length(parameter)-2) and (x>=parameter[i+2]) do
- inc(i,2);
- result:=x-parameter[i];
- result:=result/(parameter[i+2]-parameter[i]);
- result:=parameter[i+1]+result*(parameter[i+3]-parameter[i+1])
+ if x>=parameter[length(parameter)-2] then begin
+ result:=parameter[length(parameter)-1];
+ exit;
+ end;
+ i:=0;
+ while (i<length(parameter)-2) and (x>=parameter[i+2]) do
+ inc(i,2);
+ result:=x-parameter[i];
+ result:=result/(parameter[i+2]-parameter[i]);
+ result:=parameter[i+1]+result*(parameter[i+3]-parameter[i+1])
end;
function tWerteKnickTransformation.dumpParams: string;
-var i: longint;
+var
+ i: longint;
begin
- result:='Knick:';
- for i:=0 to length(parameter) div 2 - 1 do
- result:=result + ' (' + floattostr(parameter[2*i])+';'+floattostr(parameter[2*i+1])+')';
+ result:='Knick:';
+ for i:=0 to length(parameter) div 2 - 1 do
+ result:=result + ' (' + floattostr(parameter[2*i])+';'+floattostr(parameter[2*i+1])+')';
end;
// tWerteLogTransformation *****************************************************
constructor tWerteLogTransformation.create;
begin
- inherited create;
- logMin:=0.1;
-end;
-
-constructor tWerteLogTransformation.create(original: tWerteLogTransformation);
-begin
- inherited create;
- logMin:=original.logMin;
+ inherited create;
+ logMin:=0.1;
end;
-function tWerteLogTransformation.transformiereWert(const x: extended): extended;
+function tWerteLogTransformation.transformiereWertEinzeln(const x: extended): extended;
begin
- result:=ln(max(x/logMin,1))/ln(max(1/logMin,1));
+ result:=ln(max(x/logMin,1))/ln(max(1/logMin,1));
end;
function tWerteLogTransformation.dumpParams: string;
begin
- result:='Logarithmus: '+floattostr(logMin);
+ result:='Logarithmus: '+floattostr(logMin);
end;
// tWerteLogAbsTransformation **************************************************
constructor tWerteLogAbsTransformation.create;
begin
- inherited create;
- logSkala:=0.1;
-end;
-
-constructor tWerteLogAbsTransformation.create(original: tWerteLogAbsTransformation);
-begin
- inherited create;
- logSkala:=original.logSkala;
+ inherited create;
+ logSkala:=0.1;
end;
-function tWerteLogAbsTransformation.transformiereWert(const x: extended): extended;
+function tWerteLogAbsTransformation.transformiereWertEinzeln(const x: extended): extended;
begin
- result:=(1+sign(x-0.5)*ln(logSkala*abs(x-0.5)+1)/ln(logSkala*0.5+1))/2;
+ result:=(1+sign(x-0.5)*ln(logSkala*abs(x-0.5)+1)/ln(logSkala*0.5+1))/2;
end;
function tWerteLogAbsTransformation.dumpParams: string;
begin
- result:='Betragslogarithmus: '+floattostr(logSkala);
+ result:='Betragslogarithmus: '+floattostr(logSkala);
end;
// tWerteAbsTransformation *****************************************************
constructor tWerteAbsTransformation.create;
begin
- inherited create;
+ inherited create;
end;
-function tWerteAbsTransformation.transformiereWert(const x: extended): extended;
+function tWerteAbsTransformation.transformiereWertEinzeln(const x: extended): extended;
begin
- result:=2*abs(x-0.5);
+ result:=2*abs(x-0.5);
end;
function tWerteAbsTransformation.dumpParams: string;
begin
- result:='Betrag';
+ result:='Betrag';
end;
// tTransformationen ***********************************************************
-
+(*
constructor tTransformationen.create;
begin
- inherited create;
- setlength(Schritte,0);
+ inherited create;
+ setlength(Schritte,0);
end;
constructor tTransformationen.create(original: tTransformationen);
begin
- inherited create;
- setlength(Schritte,0);
- if not kopiereVon(original) then
- halt(1);
+ inherited create;
+ setlength(Schritte,0);
+ if not kopiereVon(original) then
+ halt(1);
end;
destructor tTransformationen.destroy;
-var i: longint;
+var
+ i: longint;
begin
- for i:=0 to length(Schritte)-1 do
- if assigned(Schritte[i]) then
- Schritte[i].free;
- setlength(Schritte,0);
- inherited destroy;
+ for i:=0 to length(Schritte)-1 do
+ if assigned(Schritte[i]) then
+ Schritte[i].free;
+ setlength(Schritte,0);
+ inherited destroy;
end;
function tTransformationen.gibInhalt(ii: longint): tTransformation;
begin
- result:=Schritte[ii];
+ result:=Schritte[ii];
end;
procedure tTransformationen.nimmInhalt(ii: longint; inh: tTransformation);
begin
- Schritte[ii]:=inh;
+ Schritte[ii]:=inh;
end;
function tTransformationen.rXstart: extended;
begin
- result:=gibAchsen['x','x'];
+ result:=gibAchsen['x','x'];
end;
procedure tTransformationen.wXstart(x: extended);
begin
- if kCount>0 then begin
- gibAus('Will xstart schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will xstart schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xtstao['x','x']:=x;
+ if kCount>0 then begin
+ gibAus('Will xstart schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will xstart schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xtstao['x','x']:=x;
end;
function tTransformationen.rXstop: extended;
begin
- result:=gibAchsen['x','y'];
+ result:=gibAchsen['x','y'];
end;
procedure tTransformationen.wXstop(x: extended);
begin
- if kCount>0 then begin
- gibAus('Will xstop schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will xstop schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xtstao['x','y']:=x;
+ if kCount>0 then begin
+ gibAus('Will xstop schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will xstop schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xtstao['x','y']:=x;
end;
function tTransformationen.rTstart: extended;
begin
- result:=gibAchsen['y','x'];
+ result:=gibAchsen['y','x'];
end;
procedure tTransformationen.wTstart(t: extended);
begin
- if kCount>0 then begin
- gibAus('Will tstart schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will tstart schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xtstao['y','x']:=t;
+ if kCount>0 then begin
+ gibAus('Will tstart schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will tstart schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xtstao['y','x']:=t;
end;
function tTransformationen.rTstop: extended;
begin
- result:=gibAchsen['y','y'];
+ result:=gibAchsen['y','y'];
end;
procedure tTransformationen.wTstop(t: extended);
begin
- if kCount>0 then begin
- gibAus('Will tstop schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will tstop schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xtstao['y','y']:=t;
+ if kCount>0 then begin
+ gibAus('Will tstop schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will tstop schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xtstao['y','y']:=t;
end;
function tTransformationen.rWmin: extended;
begin
- result:=_wmia['x'];
+ result:=_wmia['x'];
end;
procedure tTransformationen.wWmin(w: extended);
begin
- _wmia['x']:=w;
+ _wmia['x']:=w;
end;
function tTransformationen.rWmax: extended;
begin
- result:=_wmia['y'];
+ result:=_wmia['y'];
end;
procedure tTransformationen.wWmax(w: extended);
begin
- _wmia['y']:=w;
+ _wmia['y']:=w;
end;
function tTransformationen.rXsteps: longint;
begin
- result:=xsteps_tsiz['x'];
+ result:=xsteps_tsiz['x'];
end;
procedure tTransformationen.wXsteps(x: longint);
begin
- if kCount>0 then begin
- gibAus('Will xsteps schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will xsteps schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xs_ts['x']:=x;
+ if kCount>0 then begin
+ gibAus('Will xsteps schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will xsteps schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xs_ts['x']:=x;
end;
function tTransformationen.rTsiz: longint;
begin
- result:=xsteps_tsiz['y'];
+ result:=xsteps_tsiz['y'];
end;
function tTransformationen.xsteps_tsiz: tIntPoint;
begin
- if count=0 then result:=_xs_ts
- else result:=last.xsteps_tsiz;
+ if count=0 then result:=_xs_ts
+ else result:=last.xsteps_tsiz;
end;
procedure tTransformationen.wTsiz(t: longint);
begin
- if kCount>0 then begin
- gibAus('Will tsiz schreiben, aber der kCount ist '+inttostr(kCount),3);
- raise exception.create('Will tsiz schreiben, aber der kCount ist '+inttostr(kCount));
- end;
- _xs_ts['y']:=t;
+ if kCount>0 then begin
+ gibAus('Will tsiz schreiben, aber der kCount ist '+inttostr(kCount),3);
+ raise exception.create('Will tsiz schreiben, aber der kCount ist '+inttostr(kCount));
+ end;
+ _xs_ts['y']:=t;
end;
function tTransformationen.count: longint;
begin
- result:=length(Schritte);
+ result:=length(Schritte);
end;
function tTransformationen.kCount: longint;
-var i: longint;
+var
+ i: longint;
begin
- result:=0;
- for i:=0 to count-1 do
- if Inhalt[i] is tKoordinatenTransformation then
- inc(result);
+ result:=0;
+ for i:=0 to count-1 do
+ if Inhalt[i] is tKoordinatenTransformation then
+ inc(result);
end;
function tTransformationen.wCount: longint;
-var i: longint;
+var
+ i: longint;
begin
- result:=0;
- for i:=0 to count-1 do
- if Inhalt[i] is tWerteTransformation then
- inc(result);
+ result:=0;
+ for i:=0 to count-1 do
+ if Inhalt[i] is tWerteTransformation then
+ inc(result);
end;
procedure tTransformationen.achsenUndGroeszeAktualisieren;
-var i: longint;
+var
+ i: longint;
begin
- for i:=0 to count-1 do begin
- if i=0 then begin
- schritte[i].in_xs_ts:=_xs_ts;
- schritte[i].in_achsen:=_xtstao;
- end
- else begin
- schritte[i].in_xs_ts:=schritte[i-1].xsteps_tsiz;
- schritte[i].in_achsen:=schritte[i-1].achsen;
- end
- end;
+ for i:=0 to count-1 do begin
+ if i=0 then begin
+ schritte[i].in_xs_ts:=_xs_ts;
+ schritte[i].in_achsen:=_xtstao;
+ end
+ else begin
+ schritte[i].in_xs_ts:=schritte[i-1].xsteps_tsiz;
+ schritte[i].in_achsen:=schritte[i-1].achsen;
+ end
+ end;
end;
function tTransformationen.gibAchsen: t2x2Extended;
begin
- if count=0 then result:=_xtstao
- else result:=last.achsen;
+ if count=0 then result:=_xtstao
+ else result:=last.achsen;
end;
function tTransformationen.last: tTransformation;
begin
- result:=gibInhalt(count-1);
+ result:=gibInhalt(count-1);
end;
procedure tTransformationen.clear;
-var i: longint;
+var
+ i: longint;
begin
- for i:=0 to length(Schritte)-1 do
- if assigned(Schritte[i]) then
- Schritte[i].free;
- setlength(Schritte,0);
+ for i:=0 to length(Schritte)-1 do
+ if assigned(Schritte[i]) then
+ Schritte[i].free;
+ setlength(Schritte,0);
end;
procedure tTransformationen.clearWerte;
-var i,j: longint;
-begin
- for i:=0 to length(Schritte)-1 do
- if assigned(Schritte[i]) and (Schritte[i] is tWerteTransformation) then
- Schritte[i].free;
- j:=0;
- for i:=0 to length(Schritte)-1 do
- if assigned(Schritte[i]) then begin
- Schritte[j]:=Schritte[i];
- inc(j);
- end;
- setlength(Schritte,j);
- achsenUndGroeszeAktualisieren;
+var
+ i,j: longint;
+begin
+ for i:=0 to length(Schritte)-1 do
+ if assigned(Schritte[i]) and (Schritte[i] is tWerteTransformation) then
+ Schritte[i].free;
+ j:=0;
+ for i:=0 to length(Schritte)-1 do
+ if assigned(Schritte[i]) then begin
+ Schritte[j]:=Schritte[i];
+ inc(j);
+ end;
+ setlength(Schritte,j);
+ achsenUndGroeszeAktualisieren;
end;
procedure tTransformationen.addFFT(hor,ver: boolean);
begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tFFTTransformation.create;
- with last as tFFTTransformation do begin
- horizontal:=hor;
- vertikal:=ver;
- end;
- achsenUndGroeszeAktualisieren;
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tFFTTransformation.create;
+ with last as tFFTTransformation do begin
+ horizontal:=hor;
+ vertikal:=ver;
+ end;
+ achsenUndGroeszeAktualisieren;
end;
procedure tTransformationen.AddSpiegelung;
begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tSpiegelungsTransformation.create;
- achsenUndGroeszeAktualisieren;
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tSpiegelungsTransformation.create;
+ achsenUndGroeszeAktualisieren;
end;
function tTransformationen.add(inh: tTransformation): boolean;
begin
- result:=false;
- setlength(Schritte,length(Schritte)+1);
- if inh is tFFTTransformation then
- Schritte[length(Schritte)-1]:=tFFTTransformation.create(inh as tFFTTransformation)
- else if inh is tKoordinatenAusschnitt then
- Schritte[length(Schritte)-1]:=tKoordinatenAusschnitt.create(inh as tKoordinatenAusschnitt)
- else if inh is tKonkreteKoordinatenTransformation then
- Schritte[length(Schritte)-1]:=tKonkreteKoordinatenTransformation.create(inh as tKonkreteKoordinatenTransformation)
- else if inh is tSpiegelungsTransformation then
- Schritte[length(Schritte)-1]:=tSpiegelungsTransformation.create
- else if inh is tWerteKnickTransformation then
- Schritte[length(Schritte)-1]:=tWerteKnickTransformation.create(inh as tWerteKnickTransformation)
- else if inh is tWerteLogTransformation then
- Schritte[length(Schritte)-1]:=tWerteLogTransformation.create(inh as tWerteLogTransformation)
- else if inh is tWerteLogAbsTransformation then
- Schritte[length(Schritte)-1]:=tWerteLogAbsTransformation.create(inh as tWerteLogAbsTransformation)
- else if inh is tWerteAbsTransformation then
- Schritte[length(Schritte)-1]:=tWerteAbsTransformation.create
- else begin
- gibAus('Ich kann unbekannten Transformationstyp ('+inh.ClassName+') nicht einfügen, da ich ihn nicht kopieren kann!',3);
- exit;
- end;
- achsenUndGroeszeAktualisieren;
- result:=true;
+ result:=false;
+ setlength(Schritte,length(Schritte)+1);
+ if inh is tFFTTransformation then
+ Schritte[length(Schritte)-1]:=tFFTTransformation.create(inh as tFFTTransformation)
+ else if inh is tKoordinatenAusschnitt then
+ Schritte[length(Schritte)-1]:=tKoordinatenAusschnitt.create(inh as tKoordinatenAusschnitt)
+ else if inh is tAgglomeration then
+ Schritte[length(Schritte)-1]:=tAgglomeration.create(inh as tAgglomeration)
+ else if inh is tKonkreteKoordinatenTransformation then
+ Schritte[length(Schritte)-1]:=tKonkreteKoordinatenTransformation.create(inh as tKonkreteKoordinatenTransformation)
+ else if inh is tSpiegelungsTransformation then
+ Schritte[length(Schritte)-1]:=tSpiegelungsTransformation.create
+ else if inh is tWerteKnickTransformation then
+ Schritte[length(Schritte)-1]:=tWerteKnickTransformation.create(inh as tWerteKnickTransformation)
+ else if inh is tWerteLogTransformation then
+ Schritte[length(Schritte)-1]:=tWerteLogTransformation.create(inh as tWerteLogTransformation)
+ else if inh is tWerteLogAbsTransformation then
+ Schritte[length(Schritte)-1]:=tWerteLogAbsTransformation.create(inh as tWerteLogAbsTransformation)
+ else if inh is tWerteAbsTransformation then
+ Schritte[length(Schritte)-1]:=tWerteAbsTransformation.create
+ else begin
+ gibAus('Ich kann unbekannten Transformationstyp ('+inh.ClassName+') nicht einfügen, da ich ihn nicht kopieren kann!',3);
+ exit;
+ end;
+ achsenUndGroeszeAktualisieren;
+ result:=true;
end;
function tTransformationen.add(st: boolean; s: string; f: tMyStringlist; etf: tExprToFloat): boolean;
-var i: longint;
-begin
- result:=false;
- if s='Knick' then begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tWerteKnickTransformation.create;
- with (last as tWerteKnickTransformation) do begin
- setlength(parameter,2);
- parameter[0]:=0;
- parameter[1]:=0;
- repeat
- if not f.metaReadln(s,true) then begin
- gibAus('Unerwartetes Dateiende!',3);
- exit;
- end;
- if s='Ende' then break;
- setlength(parameter,length(parameter)+2);
- parameter[length(parameter)-2]:=
- etf(st,erstesArgument(s,' '));
- if s='' then s:=inttostr(length(parameter) div 2 - 1);
- parameter[length(parameter)-1]:=
- etf(st,s);
- until false;
- for i:=0 to length(parameter)-1 do
- if odd(i) then
- parameter[i]:=
- parameter[i]/
- (length(parameter) div 2);
- setlength(parameter,length(parameter)+2);
- parameter[length(parameter)-2]:= 1;
- parameter[length(parameter)-1]:= 1;
- end;
- result:=true;
- exit;
- end;
- if startetMit('Log:',s) then begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tWerteLogTransformation.create;
- (last as tWerteLogTransformation).logMin:=etf(st,s);
- result:=true;
- exit;
- end;
- if startetMit('AbsLog:',s) then begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tWerteLogAbsTransformation.create;
- (last as tWerteLogAbsTransformation).logSkala:=etf(st,s);
- result:=true;
- exit;
- end;
- if s='Abs' then begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tWerteAbsTransformation.create;
- result:=true;
- exit;
- end;
- gibAus('Kenne Nachbearbeitungsmethode '''+s+''' nicht!',3);
+var
+ i: longint;
+begin
+ result:=false;
+ if s='Knick' then begin
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tWerteKnickTransformation.create;
+ with (last as tWerteKnickTransformation) do begin
+ setlength(parameter,2);
+ parameter[0]:=0;
+ parameter[1]:=0;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende!',3);
+ exit;
+ end;
+ if s='Ende' then break;
+ setlength(parameter,length(parameter)+2);
+ parameter[length(parameter)-2]:=
+ etf(st,erstesArgument(s,' '));
+ if s='' then s:=inttostr(length(parameter) div 2 - 1);
+ parameter[length(parameter)-1]:=
+ etf(st,s);
+ until false;
+ for i:=0 to length(parameter)-1 do
+ if odd(i) then
+ parameter[i]:=
+ parameter[i]/
+ (length(parameter) div 2);
+ setlength(parameter,length(parameter)+2);
+ parameter[length(parameter)-2]:= 1;
+ parameter[length(parameter)-1]:= 1;
+ end;
+ result:=true;
+ exit;
+ end;
+ if startetMit('Log:',s) then begin
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tWerteLogTransformation.create;
+ (last as tWerteLogTransformation).logMin:=etf(st,s);
+ result:=true;
+ exit;
+ end;
+ if startetMit('AbsLog:',s) then begin
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tWerteLogAbsTransformation.create;
+ (last as tWerteLogAbsTransformation).logSkala:=etf(st,s);
+ result:=true;
+ exit;
+ end;
+ if s='Abs' then begin
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tWerteAbsTransformation.create;
+ result:=true;
+ exit;
+ end;
+ gibAus('Kenne Nachbearbeitungsmethode '''+s+''' nicht!',3);
end;
function tTransformationen.add(syntaxtest: boolean; s: string; xscale,yscale: extended; etf: tExprToFloat): boolean;
begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tKonkreteKoordinatenTransformation.create;
- result:=(last as tKonkreteKoordinatenTransformation).initAbbildung(syntaxtest,s,xscale,yscale,etf);
- achsenUndGroeszeAktualisieren;
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tKonkreteKoordinatenTransformation.create;
+ result:=(last as tKonkreteKoordinatenTransformation).initAbbildung(syntaxtest,s,xscale,yscale,etf);
+ achsenUndGroeszeAktualisieren;
end;
function tTransformationen.append(inhs: tTransformationen): boolean;
-var i: longint;
+var
+ i: longint;
begin
- result:=true;
- for i:=0 to inhs.count-1 do
- result:=result and add(inhs[i]);
- achsenUndGroeszeAktualisieren;
+ result:=true;
+ for i:=0 to inhs.count-1 do
+ result:=result and add(inhs[i]);
+ achsenUndGroeszeAktualisieren;
end;
procedure tTransformationen.addAusschnitt(xmin,xmax,tmin,tmax: longint);
begin
- setlength(Schritte,length(Schritte)+1);
- Schritte[length(Schritte)-1]:=tKoordinatenAusschnitt.create;
- (last as tKoordinatenAusschnitt).gr['x','x']:=xmin;
- (last as tKoordinatenAusschnitt).gr['x','y']:=xmax;
- (last as tKoordinatenAusschnitt).gr['y','x']:=tmin;
- (last as tKoordinatenAusschnitt).gr['y','y']:=tmax;
- achsenUndGroeszeAktualisieren;
+ setlength(Schritte,length(Schritte)+1);
+ Schritte[length(Schritte)-1]:=tKoordinatenAusschnitt.create;
+ (last as tKoordinatenAusschnitt).gr['x','x']:=xmin;
+ (last as tKoordinatenAusschnitt).gr['x','y']:=xmax;
+ (last as tKoordinatenAusschnitt).gr['y','x']:=tmin;
+ (last as tKoordinatenAusschnitt).gr['y','y']:=tmax;
+ 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);
+ if (xsteps_tsiz[char(ord('y')-byte(horizontal))]>1) xor (schritt<0) then begin
+ gibAus('Eine explizite Schrittweite ist genau dann anzugeben, wenn die Werte in der Agglomerationsrichtung keine Ausdehnung haben!',3);
exit;
end;
setlength(Schritte,length(Schritte)+1);
@@ -2028,80 +2361,150 @@ end;
function tTransformationen.kopiereVon(original: tTransformationen): boolean;
begin
- clear;
- _xs_ts:=original._xs_ts;
- _xtstao:=original._xtstao;
- _wmia:=original._wmia;
- result:=append(original);
+ clear;
+ _xs_ts:=original._xs_ts;
+ _xtstao:=original._xtstao;
+ _wmia:=original._wmia;
+ result:=append(original);
end;
function tTransformationen.transformiereKoordinaten(const lage: tLage; const x: extended): extended;
-var p: tExtPoint;
- c,d: char;
+var
+ p: tExtPoint;
+ c,d: char;
begin
- c:=char(ord('x')+byte(not(lage in [lOben,lUnten])));
- d:=char(ord('x')+byte(lage in [lOben,lUnten]));
- if lage in [lLinks,lUnten] then p[d]:=0
- else p[d]:=1;
+ c:=char(ord('x')+byte(not(lage in [lOben,lUnten])));
+ d:=char(ord('x')+byte(lage in [lOben,lUnten]));
- p[c]:=(x-gibAchsen[c,'x'])/(gibAchsen[c,'y']-gibAchsen[c,'x']);
- for d:='x' to 'y' do
- p[d]:=p[d]*(_xs_ts[d]-1);
- p:=transformiereKoordinaten(p);
- result:=p[c]/xsteps_tsiz[c];
+ p[d]:=byte(lage in [lRechts,lOben]);
+ p[c]:=(x-_xtstao[c,'x'])/(_xtstao[c,'y']-_xtstao[c,'x']);
+ for d:='x' to 'y' do
+ p[d]:=p[d]*(_xs_ts[d]-1);
+ p:=transformiereKoordinaten(p);
+ result:=p[c]/xsteps_tsiz[c]; writeln(' ',floattostr(result));
end;
function tTransformationen.transformiereKoordinaten(const x,y: extended): tExtPoint;
begin
- result['x']:=x;
- result['y']:=y;
- result:=transformiereKoordinaten(result);
+ result['x']:=x;
+ result['y']:=y;
+ result:=transformiereKoordinaten(result);
end;
function tTransformationen.transformiereKoordinaten(const p: tExtPoint): tExtPoint;
-var i: longint;
+var
+ i: longint;
begin
- result:=p;
- for i:=0 to count-1 do
- result:=inhalt[i].transformiereKoordinaten(result);
+ result:=p;
+ for i:=0 to count-1 do
+ result:=inhalt[i].transformiereKoordinaten(result);
end;
function tTransformationen.transformiereWert(const x: extended): extended;
-var i: longint;
+var
+ i: longint;
begin
- result:=x;
- for i:=0 to count-1 do
- result:=inhalt[i].transformiereWert(result);
+ result:=x;
+ for i:=0 to count-1 do
+ result:=inhalt[i].transformiereWert(result);
end;
function tTransformationen.dumpParams: string;
-var i: longint;
+var
+ i: longint;
begin
- result:=inttostr(xsteps)+' x '+inttostr(tsiz)+' ('+floattostr(xstart)+'..'+floattostr(xstop)+' x '+floattostr(tstart)+'..'+floattostr(tstop)+')';
- for i:=0 to count-1 do
- result:=result+#10' '+inhalt[i].dumpParams;
+ result:=inttostr(xsteps)+' x '+inttostr(tsiz)+' ('+floattostr(xstart)+'..'+floattostr(xstop)+' x '+floattostr(tstart)+'..'+floattostr(tstop)+')';
+ for i:=0 to count-1 do
+ result:=result+#10' '+inhalt[i].dumpParams;
end;
procedure tTransformationen.berechneZielausdehnung(out grenzen: t2x2Longint);
-var RandPkt: tExtPoint;
- i,j,k: longint;
- c,d: char;
-begin
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- grenzen[c,d]:=-1;
- for k:=0 to 1 do
- for i:=0 to (_xs_ts['x']*(1-k)+_xs_ts['y']*k)-1 do
- for j:=0 to 1 do begin
- RandPkt:=transformiereKoordinaten(
- i*(1-k) + j*k*(_xs_ts['x']-1),
- j*(1-k)*(_xs_ts['y']-1) + i*k);
- for c:='x' to 'y' do
- for d:='x' to 'y' do
- if ((d='y') xor (grenzen[c,d]>floor(RandPkt[c]) + byte(d='y'))) or
+var
+ RandPkt: tExtPoint;
+ i,j,k: longint;
+ c,d: char;
+begin
+ for c:='x' to 'y' do
+ for d:='x' to 'y' do
+ grenzen[c,d]:=-1;
+ for k:=0 to 1 do
+ for i:=0 to (_xs_ts['x']*(1-k)+_xs_ts['y']*k)-1 do
+ for j:=0 to 1 do begin
+ RandPkt:=transformiereKoordinaten(
+ i*(1-k) + j*k*(_xs_ts['x']-1),
+ j*(1-k)*(_xs_ts['y']-1) + i*k);
+ for c:='x' to 'y' do
+ for d:='x' to 'y' do
+ if ((d='y') xor (grenzen[c,d]>floor(RandPkt[c]) + byte(d='y'))) or
((k=0) and (i=0) and (j=0)) then
- grenzen[c,d]:=floor(RandPkt[c]) + byte(d='y');
- end;
+ grenzen[c,d]:=floor(RandPkt[c]) + byte(d='y');
+ end;
+end;
+*)
+
+function liesTWerteTransformationen(st: boolean; s: string; f: tMyStringlist; etf: tExprToFloat; var tr: tTransformation): boolean;
+var
+ i: longint;
+ tmp: tTransformation;
+begin
+ result:=false;
+ if s='Knick' then begin
+ tmp:=tWerteKnickTransformation.create;
+ with (tmp as tWerteKnickTransformation) do begin
+ setlength(parameter,2);
+ parameter[0]:=0;
+ parameter[1]:=0;
+ repeat
+ if not f.metaReadln(s,true) then begin
+ gibAus('Unerwartetes Dateiende!',3);
+ exit;
+ end;
+ if s='Ende' then break;
+ setlength(parameter,length(parameter)+2);
+ parameter[length(parameter)-2]:=
+ etf(st,erstesArgument(s,' '));
+ if s='' then s:=inttostr(length(parameter) div 2 - 1);
+ parameter[length(parameter)-1]:=
+ etf(st,s);
+ until false;
+ for i:=0 to length(parameter)-1 do
+ if odd(i) then
+ parameter[i]:=
+ parameter[i]/
+ (length(parameter) div 2);
+ setlength(parameter,length(parameter)+2);
+ parameter[length(parameter)-2]:= 1;
+ parameter[length(parameter)-1]:= 1;
+ end;
+ result:=true;
+ tmp.fuegeVorgaengerHinzu(tr);
+ tr:=tmp;
+ exit;
+ end;
+ if startetMit('Log:',s) then begin
+ tmp:=tWerteLogTransformation.create;
+ (tmp as tWerteLogTransformation).logMin:=etf(st,s);
+ result:=true;
+ tmp.fuegeVorgaengerHinzu(tr);
+ tr:=tmp;
+ exit;
+ end;
+ if startetMit('AbsLog:',s) then begin
+ tmp:=tWerteLogAbsTransformation.create;
+ (tmp as tWerteLogAbsTransformation).logSkala:=etf(st,s);
+ result:=true;
+ tmp.fuegeVorgaengerHinzu(tr);
+ tr:=tmp;
+ exit;
+ end;
+ if s='Abs' then begin
+ tmp:=tWerteAbsTransformation.create;
+ result:=true;
+ tmp.fuegeVorgaengerHinzu(tr);
+ tr:=tmp;
+ exit;
+ end;
+ gibAus('Kenne Bearbeitungsmethode '''+s+''' nicht!',3);
end;
end.
diff --git a/werteunit.pas b/werteunit.pas
index b1d46f5..c1b66ec 100644
--- a/werteunit.pas
+++ b/werteunit.pas
@@ -38,9 +38,9 @@ type
procedure kopiereVonNach(original: pTLLWerteSingle; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint); overload;
procedure kopiereVonNach(original: pTLLWerteDouble; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint); overload;
procedure kopiereVonNach(original: pTLLWerteExtended; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint); overload;
- procedure kopiereVerzerrt(original: pTLLWerteSingle; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen); overload;
- procedure kopiereVerzerrt(original: pTLLWerteDouble; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen); overload;
- procedure kopiereVerzerrt(original: pTLLWerteExtended; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen); overload;
+ procedure kopiereVerzerrt(original: pTLLWerteSingle; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint); overload;
+ procedure kopiereVerzerrt(original: pTLLWerteDouble; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint); overload;
+ procedure kopiereVerzerrt(original: pTLLWerteExtended; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint); overload;
destructor destroy; override;
function liesDateien(dateien: tGenerischeInputDateiInfoArray): boolean;
function fft(senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fen: tFenster; out pvFehler: extended): boolean; overload;
@@ -85,9 +85,9 @@ uses systemunit;
constructor tLLWerte.create(ps: tExtrainfos);
begin
- inherited create;
- params:=ps;
- setlength(werte,0);
+ inherited create;
+ params:=ps;
+ setlength(werte,0);
end;
constructor tLLWerte.create(original: pTLLWerteSingle; ps: tExtrainfos; xmin,xmax: longint);
@@ -142,116 +142,123 @@ begin
end;
procedure tLLWerte.kopiereVon(st: boolean; original: pTLLWerteSingle; xmin,xmax,tmin,tmax: longint);
-var i,j: longint;
+var
+ i,j: longint;
begin
- inherited create;
- tmax:=min(tmax,original^.params.tsiz-1);
- tmin:=max(tmin,0);
- params.tsiz:=tmax+1-tmin;
- xmax:=min(xmax,original^.params.xsteps-1);
- xmin:=max(xmin,0);
- params.xsteps:=xmax+1-xmin;
- params.transformationen.kopiereVon(original^.params.transformationen);
- params.transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
- params.maxW:=0;
- params.minW:=0;
- params.np:=original^.params.np;
- params.beta:=original^.params.beta;
- params.refreshKnownValues;
- if not st then begin
- holeRam(0);
- for i:=xmin to xmax do
- for j:=tmin to tmax do
- werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
- end;
+ inherited create;
+ tmax:=min(tmax,original^.params.tsiz-1);
+ tmin:=max(tmin,0);
+ params.tsiz:=tmax+1-tmin;
+ xmax:=min(xmax,original^.params.xsteps-1);
+ xmin:=max(xmin,0);
+ params.xsteps:=xmax+1-xmin;
+ if not params.transformationen.hatNachfolger then
+ params.transformationen.free;
+ params.transformationen:=tKoordinatenAusschnitt.create(original^.params.transformationen,xmin,xmax,tmin,tmax);
+ params.maxW:=0;
+ params.minW:=0;
+ params.np:=original^.params.np;
+ params.beta:=original^.params.beta;
+ params.refreshKnownValues;
+ if not st then begin
+ holeRam(0);
+ for i:=xmin to xmax do
+ for j:=tmin to tmax do
+ werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
+ end;
end;
procedure tLLWerte.kopiereVon(st: boolean; original: pTLLWerteDouble; xmin,xmax,tmin,tmax: longint);
-var i,j: longint;
+var
+ i,j: longint;
begin
- inherited create;
- tmax:=min(tmax,original^.params.tsiz-1);
- tmin:=max(tmin,0);
- params.tsiz:=tmax+1-tmin;
- xmax:=min(xmax,original^.params.xsteps-1);
- xmin:=max(xmin,0);
- params.xsteps:=xmax+1-xmin;
- params.transformationen.kopiereVon(original^.params.transformationen);
- params.transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
- params.maxW:=0;
- params.minW:=0;
- params.np:=original^.params.np;
- params.beta:=original^.params.beta;
- params.refreshKnownValues;
- if not st then begin
- holeRam(0);
- for i:=xmin to xmax do
- for j:=tmin to tmax do
- werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
- end;
+ inherited create;
+ tmax:=min(tmax,original^.params.tsiz-1);
+ tmin:=max(tmin,0);
+ params.tsiz:=tmax+1-tmin;
+ xmax:=min(xmax,original^.params.xsteps-1);
+ xmin:=max(xmin,0);
+ params.xsteps:=xmax+1-xmin;
+ if not params.transformationen.hatNachfolger then
+ params.transformationen.free;
+ params.transformationen:=tKoordinatenAusschnitt.create(original^.params.transformationen,xmin,xmax,tmin,tmax);
+ params.maxW:=0;
+ params.minW:=0;
+ params.np:=original^.params.np;
+ params.beta:=original^.params.beta;
+ params.refreshKnownValues;
+ if not st then begin
+ holeRam(0);
+ for i:=xmin to xmax do
+ for j:=tmin to tmax do
+ werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
+ end;
end;
procedure tLLWerte.kopiereVon(st: boolean; original: pTLLWerteExtended; xmin,xmax,tmin,tmax: longint);
-var i,j: longint;
+var
+ i,j: longint;
begin
- inherited create;
- tmax:=min(tmax,original^.params.tsiz-1);
- tmin:=max(tmin,0);
- params.tsiz:=tmax+1-tmin;
- xmax:=min(xmax,original^.params.xsteps-1);
- xmin:=max(xmin,0);
- params.xsteps:=xmax+1-xmin;
- params.transformationen.kopiereVon(original^.params.transformationen);
- params.transformationen.addAusschnitt(xmin,xmax,tmin,tmax);
- params.maxW:=0;
- params.minW:=0;
- params.np:=original^.params.np;
- params.beta:=original^.params.beta;
- params.refreshKnownValues;
- if not st then begin
- holeRam(0);
- for i:=xmin to xmax do
- for j:=tmin to tmax do
- werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
- end;
+ inherited create;
+ tmax:=min(tmax,original^.params.tsiz-1);
+ tmin:=max(tmin,0);
+ params.tsiz:=tmax+1-tmin;
+ xmax:=min(xmax,original^.params.xsteps-1);
+ xmin:=max(xmin,0);
+ params.xsteps:=xmax+1-xmin;
+ if not params.transformationen.hatNachfolger then
+ params.transformationen.free;
+ params.transformationen:=tKoordinatenAusschnitt.create(original^.params.transformationen,xmin,xmax,tmin,tmax);
+ params.maxW:=0;
+ params.minW:=0;
+ params.np:=original^.params.np;
+ params.beta:=original^.params.beta;
+ params.refreshKnownValues;
+ if not st then begin
+ holeRam(0);
+ for i:=xmin to xmax do
+ for j:=tmin to tmax do
+ werte[i-xmin+(j-tmin)*params.xsteps]:=original^.werte[i+j*original^.params.xsteps];
+ end;
end;
procedure tLLWerte.kopiereVonNach(original: pTLLWerteSingle; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint);
var
i,j: longint;
begin
- inherited create;
- for i:=qxmin to qxmax do
- for j:=qtmin to qtmax do
- werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
- original^.werte[i+j*original^.params.xsteps];
+ inherited create;
+ for i:=qxmin to qxmax do
+ for j:=qtmin to qtmax do
+ werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
+ original^.werte[i+j*original^.params.xsteps];
end;
procedure tLLWerte.kopiereVonNach(original: pTLLWerteDouble; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint);
var
i,j: longint;
begin
- inherited create;
- for i:=qxmin to qxmax do
- for j:=qtmin to qtmax do
- werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
- original^.werte[i+j*original^.params.xsteps];
+ inherited create;
+ for i:=qxmin to qxmax do
+ for j:=qtmin to qtmax do
+ werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
+ original^.werte[i+j*original^.params.xsteps];
end;
procedure tLLWerte.kopiereVonNach(original: pTLLWerteExtended; qxmin,qxmax,qtmin,qtmax,zxmin,ztmin: longint);
var
i,j: longint;
begin
- inherited create;
- for i:=qxmin to qxmax do
- for j:=qtmin to qtmax do
- werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
- original^.werte[i+j*original^.params.xsteps];
+ inherited create;
+ for i:=qxmin to qxmax do
+ for j:=qtmin to qtmax do
+ werte[i-qxmin+zxmin + (j-qtmin+ztmin)*params.xsteps]:=
+ original^.werte[i+j*original^.params.xsteps];
end;
-procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteSingle; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen);
-var i,j,k,l: longint;
- tmp: extended;
+procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteSingle; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint);
+var
+ i,j,k: longint;
+ tmp: extended;
begin
for i:=tmin to tmax do
for j:=xmin to xmax do
@@ -260,12 +267,12 @@ begin
for j:=0 to 1 do
for k:=0 to 1 do
if (ZPs[i]['x']+j>=xmin) and (ZPs[i]['x']+j<=xmax) and
- (ZPs[i]['y']+k>=tmin) and (ZPs[i]['y']+k<=tmax) then begin
+ (ZPs[i]['y']+k>=tmin) and (ZPs[i]['y']+k<=tmax) then begin
tmp:=original^.werte[i];
- if (vb.count>0) or (nb.count>0) then
+ if (va>0) or (na>0) then
tmp:=(tmp-original^.params.minW)/(original^.params.maxW-original^.params.minW);
- for l:=0 to vb.count-1 do
- tmp:=vb[l].transformiereWert(tmp);
+ if va>0 then
+ vb.transformiereWert(tmp,va-1);
tmp:=tmp * (ZGs[i]['x'] * (2*j-1) + 1-j) * (ZGs[i]['y'] * (2*k-1) + 1-k);
werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps]:=
werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps] +
@@ -274,351 +281,355 @@ begin
for i:=tmin to tmax do
for j:=xmin to xmax do begin
tmp:=werte[j + i*params.xsteps] / ZAs[j + i*params.xsteps];
- for k:=0 to nb.count-1 do
- tmp:=nb[k].transformiereWert(tmp);
+ if na>0 then
+ tmp:=nb.transformiereWert(tmp,na-1);
werte[j + i*params.xsteps]:=tmp;
end;
end;
-procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteDouble; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen);
-var i,j,k,l: longint;
- tmp: extended;
+procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteDouble; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint);
+var
+ i,j,k: longint;
+ tmp: extended;
begin
- for i:=tmin to tmax do
- for j:=xmin to xmax do
- werte[j+i*params.xsteps]:=0;
- for i:=0 to length(ZPs)-1 do
- for j:=0 to 1 do
- for k:=0 to 1 do
- if (ZPs[i]['x']+j>=xmin) and (ZPs[i]['x']+j<=xmax) and
+ for i:=tmin to tmax do
+ for j:=xmin to xmax do
+ werte[j+i*params.xsteps]:=0;
+ for i:=0 to length(ZPs)-1 do
+ for j:=0 to 1 do
+ for k:=0 to 1 do
+ if (ZPs[i]['x']+j>=xmin) and (ZPs[i]['x']+j<=xmax) and
(ZPs[i]['y']+k>=tmin) and (ZPs[i]['y']+k<=tmax) then begin
- tmp:=original^.werte[i];
- if (vb.count>0) or (nb.count>0) then
- tmp:=(tmp-original^.params.minW)/(original^.params.maxW-original^.params.minW);
- for l:=0 to vb.count-1 do
- tmp:=vb[l].transformiereWert(tmp);
- tmp:=tmp * (ZGs[i]['x'] * (2*j-1) + 1-j) * (ZGs[i]['y'] * (2*k-1) + 1-k);
- werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps]:=
- werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps] +
- tmp;
- end;
- for i:=tmin to tmax do
- for j:=xmin to xmax do begin
- tmp:=werte[j + i*params.xsteps] / ZAs[j + i*params.xsteps];
- for k:=0 to nb.count-1 do
- tmp:=nb[k].transformiereWert(tmp);
- werte[j + i*params.xsteps]:=tmp;
- end;
+ tmp:=original^.werte[i];
+ if (va>0) or (na>0) then
+ tmp:=(tmp-original^.params.minW)/(original^.params.maxW-original^.params.minW);
+ if va>0 then
+ vb.transformiereWert(tmp,va-1);
+ tmp:=tmp * (ZGs[i]['x'] * (2*j-1) + 1-j) * (ZGs[i]['y'] * (2*k-1) + 1-k);
+ werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps]:=
+ werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps] +
+ tmp;
+ end;
+ for i:=tmin to tmax do
+ for j:=xmin to xmax do begin
+ tmp:=werte[j + i*params.xsteps] / ZAs[j + i*params.xsteps];
+ if na>0 then
+ tmp:=nb.transformiereWert(tmp,na-1);
+ werte[j + i*params.xsteps]:=tmp;
+ end;
end;
-procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteExtended; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformationen);
-var i,j,k,l: longint;
- tmp: extended;
+procedure tLLWerte.kopiereVerzerrt(original: pTLLWerteExtended; ZPs: tIntPointArray; ZGs: tExtPointArray; ZAs: tExtendedArray; xmin,xmax,tmin,tmax: longint; vb,nb: tTransformation; va,na: longint);
+var
+ i,j,k: longint;
+ tmp: extended;
begin
- for i:=tmin to tmax do
- for j:=xmin to xmax do
- werte[j+i*params.xsteps]:=0;
- for i:=0 to length(ZPs)-1 do
- for j:=0 to 1 do
- for k:=0 to 1 do
- if (ZPs[i]['x']+j>=xmin) and (ZPs[i]['x']+j<=xmax) and
+ for i:=tmin to tmax do
+ for j:=xmin to xmax do
+ werte[j+i*params.xsteps]:=0;
+ for i:=0 to length(ZPs)-1 do
+ for j:=0 to 1 do
+ for k:=0 to 1 do
+ if (ZPs[i]['x']+j>=xmin) and (ZPs[i]['x']+j<=xmax) and
(ZPs[i]['y']+k>=tmin) and (ZPs[i]['y']+k<=tmax) then begin
- tmp:=original^.werte[i];
- if (vb.count>0) or (nb.count>0) then
- tmp:=(tmp-original^.params.minW)/(original^.params.maxW-original^.params.minW);
- for l:=0 to vb.count-1 do
- tmp:=vb[l].transformiereWert(tmp);
- tmp:=tmp * (ZGs[i]['x'] * (2*j-1) + 1-j) * (ZGs[i]['y'] * (2*k-1) + 1-k);
- werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps]:=
- werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps] +
- tmp;
- end;
- for i:=tmin to tmax do
- for j:=xmin to xmax do begin
- tmp:=werte[j + i*params.xsteps] / ZAs[j + i*params.xsteps];
- for k:=0 to nb.count-1 do
- tmp:=nb[k].transformiereWert(tmp);
- werte[j + i*params.xsteps]:=tmp;
- end;
+ tmp:=original^.werte[i];
+ if (va>0) or (na>0) then
+ tmp:=(tmp-original^.params.minW)/(original^.params.maxW-original^.params.minW);
+ if va>0 then
+ vb.transformiereWert(tmp,va-1);
+ tmp:=tmp * (ZGs[i]['x'] * (2*j-1) + 1-j) * (ZGs[i]['y'] * (2*k-1) + 1-k);
+ werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps]:=
+ werte[ZPs[i]['x']+j + (ZPs[i]['y']+k)*params.xsteps] +
+ tmp;
+ end;
+ for i:=tmin to tmax do
+ for j:=xmin to xmax do begin
+ tmp:=werte[j + i*params.xsteps] / ZAs[j + i*params.xsteps];
+ if na>0 then
+ tmp:=nb.transformiereWert(tmp,na-1);
+ werte[j + i*params.xsteps]:=tmp;
+ end;
end;
destructor tLLWerte.destroy;
begin
- setlength(werte,0);
- inherited destroy;
+ setlength(werte,0);
+ inherited destroy;
end;
function tLLWerte.liesDateien(dateien: tGenerischeInputDateiInfoArray): boolean;
-var i,j,k,l,tmpi,etsiz,spAnz,br: longint;
- f: file;
- tmps: single;
- tmpd: double;
- tmpe,Zeit: extended;
- sa: tSingleArray;
- da: tDoubleArray;
- ea: tExtendedArray;
- ipp: tProcess;
- buf: tByteArray;
- etwasGelesen: boolean;
+var
+ i,j,k,l,tmpi,etsiz,spAnz,br: longint;
+ f: file;
+ tmps: single;
+ tmpd: double;
+ tmpe,Zeit: extended;
+ sa: tSingleArray;
+ da: tDoubleArray;
+ ea: tExtendedArray;
+ ipp: tProcess;
+ buf: tByteArray;
+ etwasGelesen: boolean;
begin
- result:=false;
- gibAus('... Dateien einlesen ...',1);
- zeit:=now;
- tmpi:=0;
- tmps:=0;
- tmpd:=0;
- etsiz:=0;
- spAnz:=-1;
- for i:=0 to length(dateien)-1 do begin
- gibAus(' '+dateien[i].Name,1);
- etwasGelesen:=false;
- if dateien[i] is tPipeInputDateiInfo then begin
- if ((dateien[i] as tPipeInputDateiInfo).bytesPerSample<>4) or
+ result:=false;
+ gibAus('... Dateien einlesen ...',1);
+ zeit:=now;
+ tmpi:=0;
+ tmps:=0;
+ tmpd:=0;
+ etsiz:=0;
+ spAnz:=-1;
+ for i:=0 to length(dateien)-1 do begin
+ gibAus(' '+dateien[i].Name,1);
+ etwasGelesen:=false;
+ if dateien[i] is tPipeInputDateiInfo then begin
+ if ((dateien[i] as tPipeInputDateiInfo).bytesPerSample<>4) or
((dateien[i] as tPipeInputDateiInfo).Kodierung<>k32BitSignedInteger) then begin
- gibAus('Ich kann nur vier Bytes mit einem mal als Integer interpretiert aus einer Pipe einlesen!',3);
- exit;
- end;
- tmpe:=power(2,-31);
- ipp:=tProcess.create(nil);
- ipp.Options:=ipp.Options + [poUsePipes];
- ipp.Executable:=(dateien[i] as tPipeInputDateiInfo).Executable;
- ipp.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).ParametersText;
- ipp.execute;
- setlength(buf,0);
- br:=0;
- while ipp.running or (ipp.Output.NumBytesAvailable>0) do begin
- if ipp.Output.NumBytesAvailable > 0 then begin
- if br+ipp.Output.NumBytesAvailable>=length(buf) then
- setlength(buf,br+ipp.Output.NumBytesAvailable+65536*1024);
- tmpi:=ipp.Output.Read(buf[br],min(ipp.Output.NumBytesAvailable,length(buf)-br));
- if ((br+tmpi) shr 24) > (br shr 24) then gibAus(inttostr(br+tmpi)+' von '+inttostr(dateien[i].tsiz*dateien[i].xsteps*4)+' Bytes bisher gelesen ('+floattostrtrunc((br+tmpi)/(dateien[i].tsiz*dateien[i].xsteps*4)*100,2,true)+'%).',1);
- br:=br+tmpi;
- end
- else
- sleep(10);
- end;
- ipp.free;
- gibAus('insgesamt '+inttostr(br div 1024 div 1024)+' MB gelesen.',1);
- setlength(buf,br);
- if dateien[i].tsiz*dateien[i].xsteps*4>length(buf) then begin
- gibAus('Ich habe '+inttostr(length(buf))+' Bytes aus der Pipe gelesen, anstelle von wenigstens '+inttostr(dateien[i].tsiz*dateien[i].xsteps*4)+', wie erwartet!',3);
- setlength(buf,0);
- exit;
- end;
- tmpi:=length(buf)-4*dateien[i].tsiz*dateien[i].xsteps; // der Offset des ersten Daten-Wortes
- for j:=dateien[i].tmin to dateien[i].tmax do
- for k:=dateien[i].xmin to dateien[i].xmax do
- werte[dateien[i].t0abs+ k-dateien[i].xmin + (j-dateien[i].tmin)*(dateien[i].xmax-dateien[i].xmin+1)]:=
- int32((((((buf[tmpi+3+4*(k+j*dateien[i].xsteps)] shl 8) or
- buf[tmpi+2+4*(k+j*dateien[i].xsteps)]) shl 8) or
+ gibAus('Ich kann nur vier Bytes mit einem mal als Integer interpretiert aus einer Pipe einlesen!',3);
+ exit;
+ end;
+ tmpe:=power(2,-31);
+ ipp:=tProcess.create(nil);
+ ipp.Options:=ipp.Options + [poUsePipes];
+ ipp.Executable:=(dateien[i] as tPipeInputDateiInfo).Executable;
+ ipp.Parameters.Text:=(dateien[i] as tPipeInputDateiInfo).ParametersText;
+ ipp.execute;
+ setlength(buf,0);
+ br:=0;
+ while ipp.running or (ipp.Output.NumBytesAvailable>0) do begin
+ if ipp.Output.NumBytesAvailable > 0 then begin
+ if br+ipp.Output.NumBytesAvailable>=length(buf) then
+ setlength(buf,br+ipp.Output.NumBytesAvailable+65536*1024);
+ tmpi:=ipp.Output.Read(buf[br],min(ipp.Output.NumBytesAvailable,length(buf)-br));
+ if ((br+tmpi) shr 24) > (br shr 24) then gibAus(inttostr(br+tmpi)+' von '+inttostr(dateien[i].tsiz*dateien[i].xsteps*4)+' Bytes bisher gelesen ('+floattostrtrunc((br+tmpi)/(dateien[i].tsiz*dateien[i].xsteps*4)*100,2,true)+'%).',1);
+ br:=br+tmpi;
+ end
+ else
+ sleep(10);
+ end;
+ ipp.free;
+ gibAus('insgesamt '+inttostr(br div 1024 div 1024)+' MB gelesen.',1);
+ setlength(buf,br);
+ if dateien[i].tsiz*dateien[i].xsteps*4>length(buf) then begin
+ gibAus('Ich habe '+inttostr(length(buf))+' Bytes aus der Pipe gelesen, anstelle von wenigstens '+inttostr(dateien[i].tsiz*dateien[i].xsteps*4)+', wie erwartet!',3);
+ setlength(buf,0);
+ exit;
+ end;
+ tmpi:=length(buf)-4*dateien[i].tsiz*dateien[i].xsteps; // der Offset des ersten Daten-Wortes
+ for j:=dateien[i].tmin to dateien[i].tmax do
+ for k:=dateien[i].xmin to dateien[i].xmax do
+ werte[dateien[i].t0abs+ k-dateien[i].xmin + (j-dateien[i].tmin)*(dateien[i].xmax-dateien[i].xmin+1)]:=
+ int32((((((buf[tmpi+3+4*(k+j*dateien[i].xsteps)] shl 8) or
+ buf[tmpi+2+4*(k+j*dateien[i].xsteps)]) shl 8) or
buf[tmpi+1+4*(k+j*dateien[i].xsteps)]) shl 8) or
- buf[tmpi+4*(k+j*dateien[i].xsteps)]) * tmpe;
- setlength(buf,0);
- if etwasGelesen then begin
- gibAus('Ich habe diese Runde schon Daten gelesen!',3);
- exit;
- end;
- etwasGelesen:=true;
- end;
- if (dateien[i] is tSpaceTimeInputDateiInfo) or
+ buf[tmpi+4*(k+j*dateien[i].xsteps)]) * tmpe;
+ setlength(buf,0);
+ if etwasGelesen then begin
+ gibAus('Ich habe diese Runde schon Daten gelesen!',3);
+ exit;
+ end;
+ etwasGelesen:=true;
+ end;
+ if (dateien[i] is tSpaceTimeInputDateiInfo) or
(dateien[i] is tTraceInputDateiInfo) then begin
- assign(f,dateien[i].Name);
- reset(f,1);
- blockread(f,tmpi,sizeof(integer));
- dec(tmpi);
- if tmpi-round(params.tstart/dateien[i].groeszenFaktor)<>i then begin
- gibAus('Datei '''+dateien[i].Name+''' kommt nicht an '+inttostr(i)+'-ter Stelle, wie sie sollte, sondern an '+inttostr(tmpi-round(params.tstart/dateien[i].groeszenFaktor))+'-ter.',3);
- writeln(tmpi);
- close(f);
- exit;
- end;
- if dateien[i] is tTraceInputDateiInfo then begin
- blockread(f,tmpi,sizeof(integer)); // #Traces
- spAnz:=tmpi;
- end;
- blockread(f,etsiz,sizeof(integer));
- if dateien[i] is tSpaceTimeInputDateiInfo then begin
- for j:=0 to etsiz-1 do begin
- case Dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single)); // xstart
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double)); // xstart
- tmpe:=tmpd;
- end;
- gExtended:
- blockread(f,tmpe,sizeof(extended)); // xstart
- end{of Case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- if j=0 then params.transformationen.xstart:=tmpe;
- if tmpe<>params.transformationen.xstart then begin
- gibAus('Falscher linker Rand in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(params.transformationen.xstart)+'!',3);
- close(f);
- exit;
- end;
- case Dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single)); // xstop
- tmpe:=tmps;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double)); // xstop
- tmpe:=tmpd;
- end;
- gExtended:
- blockread(f,tmpe,sizeof(extended)); // xstop
- end{of Case};
- tmpe:=tmpe*dateien[i].groeszenFaktor;
- if j=0 then params.transformationen.xstop:=tmpe;
- if tmpe<>params.transformationen.xstop then begin
- gibAus('Falscher rechter Rand in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(params.transformationen.xstop)+'!',3);
- close(f);
- exit;
- end;
- blockread(f,tmpi,sizeof(integer)); // xsteps
- if tmpi<>params.xsteps then begin
- gibAus('Falsche Anzahl an x-Schritten in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+inttostr(tmpi)+' statt '+myfloattostr(params.xsteps)+'!',3);
- close(f);
- exit;
- end;
- if ((sizeof(wgen) = sizeof(single)) and (Dateien[i].Genauigkeit=gSingle)) or
+ assign(f,dateien[i].Name);
+ reset(f,1);
+ blockread(f,tmpi,sizeof(integer));
+ dec(tmpi);
+ if tmpi-round(params.tstart/dateien[i].groeszenFaktor)<>i then begin
+ gibAus('Datei '''+dateien[i].Name+''' kommt nicht an '+inttostr(i)+'-ter Stelle, wie sie sollte, sondern an '+inttostr(tmpi-round(params.tstart/dateien[i].groeszenFaktor))+'-ter.',3);
+ writeln(tmpi);
+ close(f);
+ exit;
+ end;
+ if dateien[i] is tTraceInputDateiInfo then begin
+ blockread(f,tmpi,sizeof(integer)); // #Traces
+ spAnz:=tmpi;
+ end;
+ blockread(f,etsiz,sizeof(integer));
+ if dateien[i] is tSpaceTimeInputDateiInfo then begin
+ for j:=0 to etsiz-1 do begin
+ case Dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single)); // xstart
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double)); // xstart
+ tmpe:=tmpd;
+ end;
+ gExtended:
+ blockread(f,tmpe,sizeof(extended)); // xstart
+ end{of Case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ if j=0 then params.transformationen.xstart:=tmpe;
+ if tmpe<>params.transformationen.xstart then begin
+ gibAus('Falscher linker Rand in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(params.transformationen.xstart)+'!',3);
+ close(f);
+ exit;
+ end;
+ case Dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single)); // xstop
+ tmpe:=tmps;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double)); // xstop
+ tmpe:=tmpd;
+ end;
+ gExtended:
+ blockread(f,tmpe,sizeof(extended)); // xstop
+ end{of Case};
+ tmpe:=tmpe*dateien[i].groeszenFaktor;
+ if j=0 then params.transformationen.xstop:=tmpe;
+ if tmpe<>params.transformationen.xstop then begin
+ gibAus('Falscher rechter Rand in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+myfloattostr(tmpe)+' statt '+myfloattostr(params.transformationen.xstop)+'!',3);
+ close(f);
+ exit;
+ end;
+ blockread(f,tmpi,sizeof(integer)); // xsteps
+ if tmpi<>params.xsteps then begin
+ gibAus('Falsche Anzahl an x-Schritten in '''+dateien[i].Name+''' im Schritt '+inttostr(j)+', nämlich '+inttostr(tmpi)+' statt '+myfloattostr(params.xsteps)+'!',3);
+ close(f);
+ exit;
+ end;
+ if ((sizeof(wgen) = sizeof(single)) and (Dateien[i].Genauigkeit=gSingle)) or
((sizeof(wgen) = sizeof(double)) and (Dateien[i].Genauigkeit=gDouble)) or
((sizeof(wgen) = sizeof(extended)) and (Dateien[i].Genauigkeit=gExtended)) then
- blockread(f,werte[(j+Dateien[i].t0abs)*params.xsteps],params.xsteps*sizeof(wgen))
- else begin
- setlength(sa,params.xsteps);
- blockread(f,sa[0],params.xsteps*sizeof(single));
- for k:=0 to params.xsteps-1 do
- werte[(j+Dateien[i].t0abs)*params.xsteps+k]:=sa[k];
- end;
- if power(dateien[i].gamma,3)/sqr(dateien[i].groeszenFaktor)<>1 then // gamma^3 als Skalierungsfaktor für Dichten ?
- for k:=0 to params.xsteps-1 do
- werte[(j+Dateien[i].t0abs)*params.xsteps+k]:=werte[(j+Dateien[i].t0abs)*params.xsteps+k]*power(dateien[i].gamma,3)/sqr(dateien[i].groeszenFaktor);
- end;
- if etwasGelesen then begin
- gibAus('Ich habe diese Runde schon Daten gelesen!',3);
- exit;
- end;
- etwasGelesen:=true;
- end;
- if dateien[i] is tTraceInputDateiInfo then begin
- case Dateien[i].Genauigkeit of
- gSingle: begin
- setlength(sa,etsiz);
- setlength(da,0);
- setlength(ea,0);
- end;
- gDouble: begin
- setlength(sa,0);
- setlength(da,etsiz);
- setlength(ea,0);
- end;
- gExtended: begin
- setlength(sa,0);
- setlength(da,0);
- setlength(ea,etsiz);
- end;
- end{of case};
- for j:=0 to spAnz-1 do
- case Dateien[i].Genauigkeit of
- gSingle: begin
- blockread(f,tmps,sizeof(single)); // x
- if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
- params.transformationen.xstop:=tmps;
- params.transformationen.xstart:=params.xstop;
- end;
- for k:=0 to length(FeldgroeszenNamen)-1 do begin
- blockread(f,sa[0],sizeof(single)*length(sa));
- if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
+ blockread(f,werte[(j+Dateien[i].t0abs)*params.xsteps],params.xsteps*sizeof(wgen))
+ else begin
+ setlength(sa,params.xsteps);
+ blockread(f,sa[0],params.xsteps*sizeof(single));
+ for k:=0 to params.xsteps-1 do
+ werte[(j+Dateien[i].t0abs)*params.xsteps+k]:=sa[k];
+ end;
+ if power(dateien[i].gamma,3)/sqr(dateien[i].groeszenFaktor)<>1 then // gamma^3 als Skalierungsfaktor für Dichten ?
+ for k:=0 to params.xsteps-1 do
+ werte[(j+Dateien[i].t0abs)*params.xsteps+k]:=werte[(j+Dateien[i].t0abs)*params.xsteps+k]*power(dateien[i].gamma,3)/sqr(dateien[i].groeszenFaktor);
+ end;
+ if etwasGelesen then begin
+ gibAus('Ich habe diese Runde schon Daten gelesen!',3);
+ exit;
+ end;
+ etwasGelesen:=true;
+ end;
+ if dateien[i] is tTraceInputDateiInfo then begin
+ case Dateien[i].Genauigkeit of
+ gSingle: begin
+ setlength(sa,etsiz);
+ setlength(da,0);
+ setlength(ea,0);
+ end;
+ gDouble: begin
+ setlength(sa,0);
+ setlength(da,etsiz);
+ setlength(ea,0);
+ end;
+ gExtended: begin
+ setlength(sa,0);
+ setlength(da,0);
+ setlength(ea,etsiz);
+ end;
+ end{of case};
+ for j:=0 to spAnz-1 do
+ case Dateien[i].Genauigkeit of
+ gSingle: begin
+ blockread(f,tmps,sizeof(single)); // x
+ if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
+ params.transformationen.xstop:=tmps;
+ params.transformationen.xstart:=params.xstop;
+ end;
+ for k:=0 to length(FeldgroeszenNamen)-1 do begin
+ blockread(f,sa[0],sizeof(single)*length(sa));
+ if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
(k=(Dateien[i] as tTraceInputDateiInfo).Feldnummer) then begin
- for l:=0 to length(sa)-1 do
- werte[l+Dateien[i].t0abs]:=sa[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
- if etwasGelesen then begin
- gibAus('Ich habe diese Runde schon Daten gelesen!',3);
- exit;
- end;
- etwasGelesen:=true;
- end;
- end;
- end;
- gDouble: begin
- blockread(f,tmpd,sizeof(double)); // x
- if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
- params.transformationen.xstop:=tmpd;
- params.transformationen.xstart:=params.xstop;
- end;
- for k:=0 to length(FeldgroeszenNamen)-1 do begin
- blockread(f,da[0],sizeof(double)*length(da));
- if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
+ for l:=0 to length(sa)-1 do
+ werte[l+Dateien[i].t0abs]:=sa[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
+ if etwasGelesen then begin
+ gibAus('Ich habe diese Runde schon Daten gelesen!',3);
+ exit;
+ end;
+ etwasGelesen:=true;
+ end;
+ end;
+ end;
+ gDouble: begin
+ blockread(f,tmpd,sizeof(double)); // x
+ if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
+ params.transformationen.xstop:=tmpd;
+ params.transformationen.xstart:=params.xstop;
+ end;
+ for k:=0 to length(FeldgroeszenNamen)-1 do begin
+ blockread(f,da[0],sizeof(double)*length(da));
+ if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
(k=(Dateien[i] as tTraceInputDateiInfo).Feldnummer) then begin
- for l:=0 to length(da)-1 do
- werte[l+dateien[i].t0abs]:=da[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
- if etwasGelesen then begin
- gibAus('Ich habe diese Runde schon Daten gelesen!',3);
- exit;
- end;
- etwasGelesen:=true;
- end;
- end;
- end;
- gExtended: begin
- blockread(f,tmpe,sizeof(extended)); // x
- if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
- params.transformationen.xstop:=tmpe;
- params.transformationen.xstart:=params.xstop;
- end;
- for k:=0 to length(FeldgroeszenNamen)-1 do begin
- blockread(f,ea[0],sizeof(extended)*length(ea));
- if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
+ for l:=0 to length(da)-1 do
+ werte[l+dateien[i].t0abs]:=da[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
+ if etwasGelesen then begin
+ gibAus('Ich habe diese Runde schon Daten gelesen!',3);
+ exit;
+ end;
+ etwasGelesen:=true;
+ end;
+ end;
+ end;
+ gExtended: begin
+ blockread(f,tmpe,sizeof(extended)); // x
+ if j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer then begin
+ params.transformationen.xstop:=tmpe;
+ params.transformationen.xstart:=params.xstop;
+ end;
+ for k:=0 to length(FeldgroeszenNamen)-1 do begin
+ blockread(f,ea[0],sizeof(extended)*length(ea));
+ if (j=(Dateien[i] as tTraceInputDateiInfo).Spurnummer) and
(k=(Dateien[i] as tTraceInputDateiInfo).Feldnummer) then begin
- for l:=0 to length(ea)-1 do
- werte[l+dateien[i].t0abs]:=ea[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
- if etwasGelesen then begin
- gibAus('Ich habe diese Runde schon Daten gelesen!',3);
- exit;
- end;
- etwasGelesen:=true;
- end;
- end;
- end;
- end{of Case};
- end;
- if not eof(f) then begin
- gibAus('Zu viele Daten in '''+dateien[i].Name+'''!',3);
- close(f);
- exit;
- end;
- close(f);
- end;
- if dateien[i] is tPhaseSpaceInputDateiInfo then begin
- if i<>0 then begin
- gibAus('Ich kann Phasenraumdateien nicht kaskadieren!',3);
- close(f);
- exit;
- end;
- assign(f,dateien[i].Name);
- reset(f,1);
- seek(f,filepos(f)
- + 4*wertGroesze(dateien[i].genauigkeit) // xstart,xstop,tstart,tstop
- + 2*sizeof(longint)); // xsteps,tsiz
- blockread(f,werte[0],params.xsteps*params.tsiz*wertGroesze(dateien[i].genauigkeit));
- close(f);
- etwasGelesen:=true;
- end;
- if not etwasGelesen then begin
- gibAus('Ich habe diese Runde keine Daten gelesen!',3);
- exit;
- end;
- end;
- params.refreshKnownValues;
- gibAus('... fertig '+timetostr(now-Zeit),1);
- result:=true;
+ for l:=0 to length(ea)-1 do
+ werte[l+dateien[i].t0abs]:=ea[l]*sqr(dateien[i].gamma)/sqr(dateien[i].groeszenFaktor);
+ if etwasGelesen then begin
+ gibAus('Ich habe diese Runde schon Daten gelesen!',3);
+ exit;
+ end;
+ etwasGelesen:=true;
+ end;
+ end;
+ end;
+ end{of Case};
+ end;
+ if not eof(f) then begin
+ gibAus('Zu viele Daten in '''+dateien[i].Name+'''!',3);
+ close(f);
+ exit;
+ end;
+ close(f);
+ end;
+ if dateien[i] is tPhaseSpaceInputDateiInfo then begin
+ if i<>0 then begin
+ gibAus('Ich kann Phasenraumdateien nicht kaskadieren!',3);
+ close(f);
+ exit;
+ end;
+ assign(f,dateien[i].Name);
+ reset(f,1);
+ seek(f,filepos(f)
+ + 4*wertGroesze(dateien[i].genauigkeit) // xstart,xstop,tstart,tstop
+ + 2*sizeof(longint)); // xsteps,tsiz
+ blockread(f,werte[0],params.xsteps*params.tsiz*wertGroesze(dateien[i].genauigkeit));
+ close(f);
+ etwasGelesen:=true;
+ end;
+ if not etwasGelesen then begin
+ gibAus('Ich habe diese Runde keine Daten gelesen!',3);
+ exit;
+ end;
+ end;
+ params.refreshKnownValues;
+ gibAus('... fertig '+timetostr(now-Zeit),1);
+ result:=true;
end;
procedure tLLWerte.gibMinMaxDichten(out wMi,wMa: extended; xmin,xmax,tmin,tmax: longint);
-var i,j: longint;
+var
+ i,j: longint;
begin
wMi:=werte[xmin+tmin*params.xsteps];
wMa:=Werte[xmin+tmin*params.xsteps];
@@ -630,7 +641,8 @@ begin
end;
function tLLWerte.fft(senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fen: tFenster; out pvFehler: extended): boolean;
-var len: longint;
+var
+ len: longint;
begin
len:=1;
if senkrecht then begin
@@ -646,12 +658,13 @@ begin
end;
function tLLWerte.fft(xmin,xmax,tmin,tmax: longint; senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; const fen: tFenster; out pvFehler: extended): boolean;
-var i,j,k,n,dist,absch,wnum,wstep,haL,
- pmax,pmin,smax,smin: longint;
- in0,out0: boolean;
- ims,wRe,wIm: tExtendedArray;
- t1,t2,vorher,nachher,fenavg: extended;
- umsortierung: tLongintArray;
+var
+ i,j,k,n,dist,absch,wnum,wstep,haL,
+ pmax,pmin,smax,smin: longint;
+ in0,out0: boolean;
+ ims,wRe,wIm: tExtendedArray;
+ t1,t2,vorher,nachher,fenavg: extended;
+ umsortierung: tLongintArray;
const faktoren: array[tFFTDatenordnung,0..2] of longint = // (doResIms,doResSmi,doRes,doBetr,doBetrQdr);
((2,1,1),(2,1,1),(1,1,1),(1,1,1),(1,1,1));
begin
@@ -710,7 +723,7 @@ begin
vorher:=vorher + werte[i+j*params.xsteps]*werte[i+j*params.xsteps]
*faktoren[vor,
Byte(((not senkrecht) and (i=xmin)) or (senkrecht and (j=tmin)))
- +2*Byte(((not senkrecht) and (2*i=xmin+xmax+1)) or (senkrecht and (2*j=tmin+tmax+1)))];
+ +2*Byte(((not senkrecht) and (2*i=xmin+xmax+1)) or (senkrecht and (2*j=tmin+tmax+1)))];
end;
setlength(umsortierung,pmax+1-pmin);
@@ -944,7 +957,7 @@ begin
nachher:=nachher + werte[i+j*params.xsteps]*werte[i+j*params.xsteps]
*faktoren[nach,
Byte(((not senkrecht) and (i=xmin)) or (senkrecht and (j=tmin)))
- +2*Byte(((not senkrecht) and (2*i=xmin+xmax+1)) or (senkrecht and (2*j=tmin+tmax+1)))];
+ +2*Byte(((not senkrecht) and (2*i=xmin+xmax+1)) or (senkrecht and (2*j=tmin+tmax+1)))];
end;
if (nachher=0) and (vorher=0) then pvFehler:=0
else pvFehler:=abs(nachher-vorher)/(nachher+vorher);
@@ -957,68 +970,71 @@ end;
procedure tLLWerte.schreibeWert(var f: textfile; x,y: longint);
begin
- schreibeWert(f,x,y,werte[x+y*params.xsteps]);
+ schreibeWert(f,x,y,werte[x+y*params.xsteps]);
end;
procedure tLLWerte.schreibeWert(var f: textfile; x,y,wert: extended);
-var xa,ta: extended;
+var
+ xa,ta: extended;
begin
- if params.xstop=params.xstart then
- xa:=params.xstop
- else
- xa:=params.xstart+x/(params.xsteps-1)*(params.xstop-params.xstart);
- if params.tstop=params.tstart then
- ta:=params.tstop
- else
- ta:=params.tstart+y/(params.tsiz-1)*(params.tstop-params.tstart);
- writeln(f,floattostr(xa)+' '+floattostr(ta)+' '+floattostr(wert));
+ if params.xstop=params.xstart then
+ xa:=params.xstop
+ else
+ xa:=params.xstart+x/(params.xsteps-1)*(params.xstop-params.xstart);
+ if params.tstop=params.tstart then
+ ta:=params.tstop
+ else
+ ta:=params.tstart+y/(params.tsiz-1)*(params.tstop-params.tstart);
+ writeln(f,floattostr(xa)+' '+floattostr(ta)+' '+floattostr(wert));
end;
procedure tLLWerte.schreibeWertIntegriert(var f: textfile; i: longint; hor: boolean);
-var j: longint;
- tmp: extended;
+var
+ j: longint;
+ tmp: extended;
begin
- tmp:=0;
- if hor then begin
- for j:=0 to params.xsteps-1 do
- tmp:=tmp+werte[j+i*params.xsteps];
- schreibeWert(f,(params.xsteps-1)/2,i,tmp);
- end
- else begin
- for j:=0 to params.tsiz-1 do
- tmp:=tmp+werte[i+j*params.xsteps];
- schreibeWert(f,i,(params.tsiz-1)/2,tmp);
- end;
+ tmp:=0;
+ if hor then begin
+ for j:=0 to params.xsteps-1 do
+ tmp:=tmp+werte[j+i*params.xsteps];
+ schreibeWert(f,(params.xsteps-1)/2,i,tmp);
+ end
+ else begin
+ for j:=0 to params.tsiz-1 do
+ tmp:=tmp+werte[i+j*params.xsteps];
+ schreibeWert(f,i,(params.tsiz-1)/2,tmp);
+ end;
end;
procedure tLLWerte.erzeugeBinning(senkrecht,linien: boolean; x0,dx: extended; s: string);
-var f: textfile;
- i: longint;
- sum,x: extended;
+var
+ f: textfile;
+ i: longint;
+ sum,x: extended;
begin
- assignfile(f,s);
- rewrite(f);
- sum:=0;
- while x0<0 do
- x0:=x0+dx;
- for i:=0 to params.xsteps*params.tsiz-1 do
- if i+1>x0 then begin
- sum:=sum+werte[i]*(x0-i);
- if senkrecht then
- x:=x0/(params.tsiz-1)*(params.tstop-params.tstart)+params.tstart
- else
- x:=x0/(params.xsteps-1)*(params.xstop-params.xstart)+params.xstart;
- writeln(f,floattostr(x)+' '+floattostr(sum/dx));
- if linien then begin
- writeln(f,floattostr(x)+' 0');
- writeln(f)
- end;
- sum:=werte[i]*(i+1-x0);
- x0:=x0+dx;
- end
- else
- sum:=sum+werte[i];
- closefile(f);
+ assignfile(f,s);
+ rewrite(f);
+ sum:=0;
+ while x0<0 do
+ x0:=x0+dx;
+ for i:=0 to params.xsteps*params.tsiz-1 do
+ if i+1>x0 then begin
+ sum:=sum+werte[i]*(x0-i);
+ if senkrecht then
+ x:=x0/(params.tsiz-1)*(params.tstop-params.tstart)+params.tstart
+ else
+ x:=x0/(params.xsteps-1)*(params.xstop-params.xstart)+params.xstart;
+ writeln(f,floattostr(x)+' '+floattostr(sum/dx));
+ if linien then begin
+ writeln(f,floattostr(x)+' 0');
+ writeln(f)
+ end;
+ sum:=werte[i]*(i+1-x0);
+ x0:=x0+dx;
+ end
+ else
+ sum:=sum+werte[i];
+ closefile(f);
end;
procedure tLLWerte.spiegle;
@@ -1027,8 +1043,9 @@ begin
end;
procedure tLLWerte.spiegle(tmin,tmax: longint);
-var i,j: longint;
- tmp: wgen;
+var
+ i,j: longint;
+ tmp: wgen;
begin
for i:=tmin to tmax do
for j:=0 to params.xsteps div 2 -1 do begin
@@ -1039,7 +1056,8 @@ begin
end;
procedure tLLWerte.fft2dNachbearbeitungA(nb: tFFTDatenordnung);
-var i: longint;
+var
+ i: longint;
begin
case NB of
doResIms,doResSmi: ;
@@ -1089,7 +1107,8 @@ begin
end;
procedure tLLWerte.fft2dNachbearbeitungB(xmin,xmax: longint; nb: tFFTDatenordnung);
-var i,j: longint;
+var
+ i,j: longint;
begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte) nach!
case nb of
doBetr: begin
@@ -1104,10 +1123,10 @@ begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte)
end;
end;
doBetrQdr: begin
- for i:=xmin to xmax do
+ for i:=xmin to xmax do
for j:=1 to params.tsiz div 2 -1 do begin
werte[i+j*params.xsteps]:=
- sqr(extended(werte[i+j*params.xsteps]-werte[params.xsteps-i+(params.tsiz-j)*params.xsteps])) // Re^2
+ sqr(extended(werte[i+j*params.xsteps]-werte[params.xsteps-i+(params.tsiz-j)*params.xsteps])) // Re^2
+sqr(extended(werte[params.xsteps-i+j*params.xsteps]+werte[i+(params.tsiz-j)*params.xsteps])); // Im^2
werte[params.xsteps-i+j*params.xsteps]:=werte[i+j*params.xsteps];
werte[i+(params.tsiz-j)*params.xsteps]:=werte[i+j*params.xsteps];
@@ -1128,8 +1147,9 @@ begin
end;
procedure tLLWerte.holeRam(ausgaben: byte; gemaeszTXMinMax: boolean);
-var Zeit: extended;
- br,ho: longint;
+var
+ Zeit: extended;
+ br,ho: longint;
begin
Zeit:=now;
if gemaeszTXMinMax then begin
@@ -1149,9 +1169,10 @@ begin
end;
function tLLWerte.zuPixelWerten(whoehe,wbreite,xpmi,xmi,tmi: longint; xz,yz: extended; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean;
-var i,j,k,l,
- xv,xb,tv,tb: longint;
- b: boolean;
+var
+ i,j,k,l,
+ xv,xb,tv,tb: longint;
+ b: boolean;
begin
result:=false;
for i:=0 to length(pPWerte^)-1 do begin
@@ -1190,8 +1211,9 @@ begin
end;
function tLLWerte.findeSchwellwerte(xmi,xma,tmi,tma: longint; Schw: extended): tExtPointArray;
-var i,j,k,l,m,vz: longint;
- dx,dy,x0,y0: extended;
+var
+ i,j,k,l,m,vz: longint;
+ dx,dy,x0,y0: extended;
begin
setlength(result,0);
gibAus('Schwellwerte finden ('+inttostr(xmi)+'-'+inttostr(xma)+') '+floattostr(Schw)+' ...',1);
@@ -1206,7 +1228,7 @@ begin
for l:=0 to 1 do
for m:=0 to 1 do
vz:=
- vz or (byte(werte[j-l+(k-m)*params.xsteps]>=Schw) shl 1) or
+ vz or (byte(werte[j-l+(k-m)*params.xsteps]>=Schw) shl 1) or
byte(werte[j-l+(k-m)*params.xsteps]<=Schw);
if vz=3 then begin
if i>=length(result) then
@@ -1224,8 +1246,9 @@ begin
end;
procedure tLLWerte.integriereSingle(qu: pTLLWerteSingle; xmi,xma,tmi,tma,xof,tof: longint; richtung: tIntegrationsRichtung);
-var i,j: longint;
- int,faktor: extended;
+var
+ i,j: longint;
+ int,faktor: extended;
begin
case richtung of
irHorizontal: begin
@@ -1296,8 +1319,9 @@ begin
end;
procedure tLLWerte.integriereDouble(qu: pTLLWerteDouble; xmi,xma,tmi,tma,xof,tof: longint; richtung: tIntegrationsRichtung);
-var i,j: longint;
- int,faktor: extended;
+var
+ i,j: longint;
+ int,faktor: extended;
begin
case richtung of
irHorizontal: begin
@@ -1368,8 +1392,9 @@ begin
end;
procedure tLLWerte.integriereExtended(qu: pTLLWerteDouble; xmi,xma,tmi,tma,xof,tof: longint; richtung: tIntegrationsRichtung);
-var i,j: longint;
- int,faktor: extended;
+var
+ i,j: longint;
+ int,faktor: extended;
begin
case richtung of
irHorizontal: begin
@@ -1457,10 +1482,11 @@ begin
end;
function tWavelet.berechneWerte: boolean;
-var i: longint;
- tmp: extended;
- fenster: tFenster;
- nur0: boolean;
+var
+ i: longint;
+ tmp: extended;
+ fenster: tFenster;
+ nur0: boolean;
begin
result:=false;
werte.params.xsteps:=2;
@@ -1510,9 +1536,9 @@ begin
(* gibAus('dump:',3);
for i:=0 to werte.tsiz-1 do
if (i=0) or (i=werte.tsiz-1) or
- (werte.werte[2*i+1]<>0) or
- (werte.werte[2*i]<>werte.werte[2*(i-1)]) or
- (werte.werte[2*i]<>werte.werte[2*(i+1)]) then
+ (werte.werte[2*i+1]<>0) or
+ (werte.werte[2*i]<>werte.werte[2*(i-1)]) or
+ (werte.werte[2*i]<>werte.werte[2*(i+1)]) then
gibAus(inttostr(i)+' '+floattostr(werte.werte[2*i])+' '+floattostr(werte.werte[2*i+1]),3);
gibAus('ende',3);
exit; *)
@@ -1542,7 +1568,8 @@ begin
end;
constructor tWavelet.create;
-var ps: tExtrainfos;
+var
+ ps: tExtrainfos;
begin
inherited create;
ps:=tExtrainfos.create;