diff options
author | Erich Eckner <git@eckner.net> | 2019-10-18 16:14:44 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2019-10-18 16:14:44 +0200 |
commit | 66000f787560c38678cb24c96543560b58d6cebb (patch) | |
tree | 7531ee1deabb0576959a800df4866616b9b3ca21 | |
parent | e5457f7f50db8b629808349380c8f0a403b4a4f1 (diff) | |
download | epost-66000f787560c38678cb24c96543560b58d6cebb.tar.xz |
Radontransformation nun per fft (momentan noch nicht 100% ok)
-rw-r--r-- | epost.lpr | 6 | ||||
-rw-r--r-- | epost.lps | 126 | ||||
-rw-r--r-- | epostunit.pas | 177 | ||||
-rw-r--r-- | typenunit.pas | 12 | ||||
-rw-r--r-- | werteunit.inc | 58 | ||||
-rw-r--r-- | werteunit.pas | 16 |
6 files changed, 245 insertions, 150 deletions
@@ -190,8 +190,10 @@ begin aufraeumen; halt(1); end; - wertes[j].berechneRadonTransformation(syntaxTest,inf,maxThreads,wertes[i]); - continue; + if wertes[j].berechneRadonTransformation(syntaxTest,inf,maxThreads,wertes[i],Warnstufe) then + continue; + aufraeumen; + halt(1); end; if istDasBefehl('erzeuge Dummy-Werte',s,bekannteBefehle,true) then begin b1:=startetMit('gefüllt',s); @@ -7,8 +7,9 @@ <Unit0> <Filename Value="epost.lpr"/> <IsPartOfProject Value="True"/> - <TopLine Value="693"/> - <CursorPos Y="728"/> + <IsVisibleTab Value="True"/> + <TopLine Value="187"/> + <CursorPos X="17" Y="196"/> <UsageCount Value="202"/> <Loaded Value="True"/> </Unit0> @@ -22,10 +23,9 @@ <Unit2> <Filename Value="epostunit.pas"/> <IsPartOfProject Value="True"/> - <IsVisibleTab Value="True"/> <EditorIndex Value="2"/> - <TopLine Value="1974"/> - <CursorPos Y="2003"/> + <TopLine Value="6102"/> + <CursorPos X="50" Y="6129"/> <UsageCount Value="201"/> <Loaded Value="True"/> </Unit2> @@ -33,6 +33,8 @@ <Filename Value="werteunit.pas"/> <IsPartOfProject Value="True"/> <EditorIndex Value="5"/> + <TopLine Value="713"/> + <CursorPos Y="729"/> <UsageCount Value="200"/> <Loaded Value="True"/> </Unit3> @@ -40,8 +42,8 @@ <Filename Value="typenunit.pas"/> <IsPartOfProject Value="True"/> <EditorIndex Value="10"/> - <TopLine Value="1009"/> - <CursorPos X="5" Y="1032"/> + <TopLine Value="498"/> + <CursorPos X="4" Y="516"/> <UsageCount Value="200"/> <Loaded Value="True"/> </Unit4> @@ -73,8 +75,8 @@ <Filename Value="werteunit.inc"/> <IsPartOfProject Value="True"/> <EditorIndex Value="6"/> - <TopLine Value="19"/> - <CursorPos X="65" Y="32"/> + <TopLine Value="173"/> + <CursorPos X="15" Y="202"/> <UsageCount Value="200"/> <Loaded Value="True"/> </Unit8> @@ -84,7 +86,7 @@ <EditorIndex Value="7"/> <TopLine Value="86"/> <CursorPos X="26" Y="115"/> - <UsageCount Value="65"/> + <UsageCount Value="74"/> <Loaded Value="True"/> </Unit9> <Unit10> @@ -92,27 +94,27 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="8"/> <CursorPos X="3" Y="2"/> - <UsageCount Value="61"/> + <UsageCount Value="70"/> <Loaded Value="True"/> </Unit10> <Unit11> <Filename Value="fileunit.pas"/> <EditorIndex Value="-1"/> <CursorPos Y="204"/> - <UsageCount Value="192"/> + <UsageCount Value="191"/> </Unit11> <Unit12> <Filename Value="../units/mystringlistunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="712"/> <CursorPos X="22" Y="735"/> - <UsageCount Value="92"/> + <UsageCount Value="91"/> </Unit12> <Unit13> <Filename Value="../units/lowlevelunit.pas"/> <EditorIndex Value="1"/> - <TopLine Value="386"/> - <CursorPos X="27" Y="403"/> + <TopLine Value="68"/> + <CursorPos X="46" Y="87"/> <UsageCount Value="101"/> <Loaded Value="True"/> </Unit13> @@ -127,48 +129,48 @@ <EditorIndex Value="-1"/> <TopLine Value="190"/> <CursorPos X="22" Y="195"/> - <UsageCount Value="96"/> + <UsageCount Value="95"/> </Unit15> <Unit16> <Filename Value="/usr/lib/fpc/src/rtl/inc/objpash.inc"/> <EditorIndex Value="-1"/> <TopLine Value="176"/> <CursorPos X="23" Y="194"/> - <UsageCount Value="2"/> + <UsageCount Value="1"/> </Unit16> <Unit17> <Filename Value="/usr/lib/fpc/src/rtl/unix/bunxovlh.inc"/> <EditorIndex Value="-1"/> <TopLine Value="61"/> <CursorPos X="10" Y="99"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit17> <Unit18> <Filename Value="/usr/lib/fpc/src/rtl/unix/baseunix.pp"/> <UnitName Value="BaseUnix"/> <EditorIndex Value="-1"/> <TopLine Value="61"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit18> <Unit19> <Filename Value="/usr/lib/fpc/src/rtl/unix/bunxovl.inc"/> <EditorIndex Value="-1"/> <TopLine Value="414"/> <CursorPos X="20" Y="434"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit19> <Unit20> <Filename Value="/usr/lib/fpc/src/rtl/linux/bunxsysc.inc"/> <EditorIndex Value="-1"/> <TopLine Value="16"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit20> <Unit21> <Filename Value="/usr/lib/fpc/src/rtl/unix/bunxh.inc"/> <EditorIndex Value="-1"/> <TopLine Value="74"/> <CursorPos X="15" Y="102"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit21> <Unit22> <Filename Value="/usr/lib/fpc/src/packages/fcl-image/src/fpimage.pp"/> @@ -176,152 +178,154 @@ <EditorIndex Value="-1"/> <TopLine Value="10"/> <CursorPos X="3" Y="30"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit22> <Unit23> <Filename Value="../units/protokollunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="18"/> <CursorPos X="3" Y="18"/> - <UsageCount Value="41"/> + <UsageCount Value="40"/> </Unit23> <Unit24> <Filename Value="../fpGUI/src/corelib/render/software/agg_2D.pas"/> <EditorIndex Value="-1"/> <TopLine Value="2116"/> <CursorPos X="2" Y="2134"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit24> <Unit25> <Filename Value="../units/randomunit.pas"/> <EditorIndex Value="-1"/> <CursorPos X="19" Y="11"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit25> <Unit26> <Filename Value="epost.lpi"/> <EditorIndex Value="-1"/> - <UsageCount Value="8"/> + <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="XML"/> </Unit26> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> - <Filename Value="werteunit.pas"/> - <Caret Line="955" Column="134" TopLine="929"/> + <Filename Value="epostunit.pas"/> + <Caret Line="735" Column="62" TopLine="724"/> </Position1> <Position2> - <Filename Value="werteunit.pas"/> - <Caret Line="981" Column="55" TopLine="963"/> + <Filename Value="epostunit.pas"/> + <Caret Line="761" Column="79" TopLine="734"/> </Position2> <Position3> <Filename Value="epostunit.pas"/> - <Caret Line="2349" Column="132" TopLine="2335"/> + <Caret Line="757" Column="78" TopLine="740"/> </Position3> <Position4> - <Filename Value="epostunit.pas"/> - <Caret Line="6508" Column="51" TopLine="6502"/> + <Filename Value="werteunit.pas"/> + <Caret Line="36" Column="17" TopLine="19"/> </Position4> <Position5> <Filename Value="epostunit.pas"/> - <Caret Line="6098" Column="3" TopLine="6080"/> + <Caret Line="788" TopLine="768"/> </Position5> <Position6> <Filename Value="epostunit.pas"/> - <Caret Line="6508" Column="37" TopLine="6502"/> + <Caret Line="792" Column="2" TopLine="730"/> </Position6> <Position7> <Filename Value="epostunit.pas"/> - <Caret Line="6098" Column="3" TopLine="6080"/> + <Caret Line="6136" Column="29" TopLine="6118"/> </Position7> <Position8> <Filename Value="epostunit.pas"/> - <Caret Line="234" Column="22" TopLine="216"/> + <Caret Line="6128" TopLine="6119"/> </Position8> <Position9> <Filename Value="epostunit.pas"/> - <Caret Line="240" Column="53" TopLine="216"/> + <Caret Line="6130" Column="58" TopLine="6112"/> </Position9> <Position10> <Filename Value="epostunit.pas"/> - <Caret Line="6099" Column="70" TopLine="6070"/> + <Caret Line="6080" Column="39" TopLine="6070"/> </Position10> <Position11> <Filename Value="epostunit.pas"/> - <Caret Line="6100" Column="61" TopLine="6071"/> + <Caret Line="6130" Column="71" TopLine="6112"/> </Position11> <Position12> <Filename Value="epostunit.pas"/> - <Caret Line="6157" Column="36" TopLine="6129"/> </Position12> <Position13> <Filename Value="epostunit.pas"/> - <Caret Line="6334" Column="68" TopLine="6306"/> + <Caret Line="99" TopLine="112"/> </Position13> <Position14> <Filename Value="epostunit.pas"/> - <Caret Line="7681" TopLine="7649"/> + <Caret Line="6078" Column="110" TopLine="6069"/> </Position14> <Position15> <Filename Value="epostunit.pas"/> + <Caret Line="187" Column="123" TopLine="171"/> </Position15> <Position16> <Filename Value="epostunit.pas"/> - <Caret Line="7684" TopLine="7649"/> + <Caret Line="6149" Column="20" TopLine="6133"/> </Position16> <Position17> <Filename Value="epostunit.pas"/> + <Caret Line="6126" TopLine="6112"/> </Position17> <Position18> <Filename Value="epostunit.pas"/> - <Caret Line="234" Column="22" TopLine="205"/> + <Caret Line="6129" Column="24" TopLine="6112"/> </Position18> <Position19> <Filename Value="epostunit.pas"/> - <Caret Line="240" Column="53" TopLine="211"/> + <Caret Line="181" Column="29" TopLine="165"/> </Position19> <Position20> <Filename Value="epostunit.pas"/> - <Caret Line="6099" Column="70" TopLine="6070"/> + <Caret Line="5414" Column="32" TopLine="5394"/> </Position20> <Position21> <Filename Value="epostunit.pas"/> - <Caret Line="6100" Column="61" TopLine="6071"/> + <Caret Line="5470" TopLine="5451"/> </Position21> <Position22> - <Filename Value="werteunit.pas"/> - <Caret Line="981" Column="55" TopLine="963"/> + <Filename Value="epostunit.pas"/> + <Caret Line="5466" TopLine="5451"/> </Position22> <Position23> - <Filename Value="epostunit.pas"/> - <Caret Line="6156" Column="36" TopLine="6156"/> + <Filename Value="typenunit.pas"/> + <Caret Line="516" Column="4" TopLine="498"/> </Position23> <Position24> <Filename Value="epostunit.pas"/> + <Caret Line="5465" Column="22" TopLine="5448"/> </Position24> <Position25> <Filename Value="epostunit.pas"/> - <Caret Line="1968" Column="136" TopLine="1939"/> + <Caret Line="6131" Column="37" TopLine="6111"/> </Position25> <Position26> <Filename Value="epostunit.pas"/> - <Caret Line="1967" Column="10" TopLine="1950"/> + <Caret Line="181" Column="29" TopLine="165"/> </Position26> <Position27> <Filename Value="epostunit.pas"/> - <Caret Line="2003" Column="83" TopLine="1974"/> + <Caret Line="5414" Column="32" TopLine="5385"/> </Position27> <Position28> - <Filename Value="typenunit.pas"/> - <Caret Line="107" Column="27" TopLine="83"/> + <Filename Value="epostunit.pas"/> + <Caret Line="5479" Column="29" TopLine="5451"/> </Position28> <Position29> <Filename Value="epostunit.pas"/> - <Caret Line="2003" Column="83" TopLine="1974"/> + <Caret Line="6131" Column="52" TopLine="6114"/> </Position29> <Position30> - <Filename Value="typenunit.pas"/> - <Caret Line="105" Column="31" TopLine="89"/> + <Filename Value="werteunit.pas"/> + <Caret Line="2601" Column="77" TopLine="2570"/> </Position30> </JumpHistory> <RunParams> diff --git a/epostunit.pas b/epostunit.pas index 5c7ebdf..0f28c94 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -148,6 +148,7 @@ type sWerte: tLLWerteSingle; genauigkeit: tGenauigkeit; constructor create(kont: pTKonturenArray; wert: pTWerteArray); overload; + constructor create(original: tWerte; gen: tGenauigkeit); overload; constructor create(original: tWerte; xMin,xMax: longint); overload; destructor destroy; override; procedure warteAufBeendigungDesLeseThreads; @@ -183,7 +184,7 @@ type function berechneFFT(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; function berechneFFT2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; function berechneAutokorrelation2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; - function berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean; + function berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte; warn: tWarnStufe): boolean; function erzeugeLinearesBild(sT: boolean; var f: tMyStringList; threads: longint): boolean; function erzeugeAscii(sT: boolean; f: tMyStringList): boolean; function erzeugeLineout(sT: boolean; f: tMyStringList): boolean; @@ -491,7 +492,7 @@ type destructor destroy; override; procedure stExecute; override; end; - tRadonTransformationsThread = class(tLogThread) + tRadonTransformationsLineOutThread = class(tLogThread) qu,zi: tWerte; xMi,xMa: longint; constructor create(quelle,ziel: tWerte; xMin,xMax: longint); @@ -731,6 +732,65 @@ begin transformationen:=tIdentitaet.create(original.transformationen); end; +constructor tWerte.create(original: tWerte; gen: tGenauigkeit); +var + ps: tExtraInfos; +begin + inherited create(original.konturen,original.wertes); + original.warteAufBeendigungDesLeseThreads; + leseThread:=nil; + genauigkeit:=gen; + case original.genauigkeit of + gSingle: + ps:=tExtraInfos.create(original.sWerte.params); + gDouble: + ps:=tExtraInfos.create(original.dWerte.params); + gExtended: + ps:=tExtraInfos.create(original.eWerte.params); + end{of case}; + case genauigkeit of + gSingle: begin + dWerte:=tLLWerteDouble.create(ps); + eWerte:=tLLWerteExtended.create(ps); + case original.genauigkeit of + gSingle: + sWerte:=tLLWerteSingle.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1); + gDouble: + sWerte:=tLLWerteSingle.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1); + gExtended: + sWerte:=tLLWerteSingle.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1); + end{of case}; + end; + gDouble: begin + sWerte:=tLLWerteSingle.create(ps); + eWerte:=tLLWerteExtended.create(ps); + case original.genauigkeit of + gSingle: + dWerte:=tLLWerteDouble.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1); + gDouble: + dWerte:=tLLWerteDouble.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1); + gExtended: + dWerte:=tLLWerteDouble.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1); + end{of case}; + end; + gExtended: begin + sWerte:=tLLWerteSingle.create(ps); + dWerte:=tLLWerteDouble.create(ps); + case original.genauigkeit of + gSingle: + eWerte:=tLLWerteExtended.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1); + gDouble: + eWerte:=tLLWerteExtended.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1); + gExtended: + eWerte:=tLLWerteExtended.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1); + end{of case}; + end; + end{of case}; + if original.bezeichner='' then bezeichner:='' + else bezeichner:=original.bezeichner+''''; + transformationen:=tIdentitaet.create(original.transformationen); +end; + destructor tWerte.destroy; begin warteAufBeendigungDesLeseThreads; @@ -6015,21 +6075,21 @@ begin result:=true; end; -function tWerte.berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean; +function tWerte.berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte; warn: tWarnStufe): boolean; var - Zeit: extended; - winkelSchritte,verschiebungsSchritte: int64; - s: string; - bekannteBefehle: tMyStringList; - i: longint; - fertig: boolean; - radonTransformationsThreads: array of tRadonTransformationsThread; + Zeit,pvFehler: extended; + winkelSchritte: int64; + s: string; + bekannteBefehle: tMyStringList; + i: longint; + fertig: boolean; + hilfsWerte: tWerte; + radonTransformationsLineOutThreads: array of tRadonTransformationsLineOutThread; begin result:=false; warteAufBeendigungDesLeseThreads; Zeit:=now; winkelSchritte:=180; - verschiebungsSchritte:=180; bekannteBefehle:=tMyStringList.create; repeat if not f.metaReadln(s,true) then begin @@ -6043,10 +6103,6 @@ begin winkelSchritte:=round(exprToFloat(sT,s)); continue; end; - if istDasBefehl('Verschiebungsschritte:',s,bekannteBefehle,true) then begin - verschiebungsSchritte:=round(exprToFloat(sT,s)); - continue; - end; bekannteBefehle.sort; gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer Radon-Transformation!'#10'Ich kenne:'#10+bekannteBefehle.text,3); bekannteBefehle.free; @@ -6054,29 +6110,66 @@ begin until false; bekannteBefehle.free; - _xSteps:=winkelSchritte; - _tSiz:=verschiebungsSchritte; - transformationen:=tRTTransformation.create(quelle.transformationen,winkelSchritte,verschiebungsSchritte); + if istKomplex then begin + gibAus('Ich kann keine Radontransformation von voll-komplexen Werte machen!',3); + exit + end; + + if quelle.disk2kontFak('x',1) <> quelle.disk2kontFak('y',1) then + gibAus('Warnung: dx ('+floatToStr(quelle.disk2kontFak('x',1))+') und dy ('+floatToStr(quelle.disk2kontFak('y',1))+') unterscheiden sich bei Radontransformation - die Winkel-Achse (horizontal) verläuft nicht linear!',3); + + transformationen:=tRTTransformation.create(quelle.transformationen,winkelSchritte); + _xSteps:=transformationen.xSteps; + _tSiz:=transformationen.tSiz; if not sT then begin + gibAus('kopiere Werte für Radon-Transformation ...',3); + hilfsWerte:=tWerte.create(quelle,gExtended); // quelle zu hilfsWerte kopieren ... + hilfsWerte._xSteps:=2*_tSiz+1; // ... und quadratisch ergänzen: Kantenlänge = 2*Diagonale von quelle + 1 + hilfsWerte._tSiz:=2*_tSiz+1; + hilfsWerte.holeRAM(3); + hilfsWerte.eWerte.nullenEinfuegen(quelle._xSteps,quelle._tSiz); + gibAus('berechne t-FFT für Radon-Transformation ...',3); + if not hilfsWerte.fft(threads,true,false,doRes,doResSmi,nil,nil,pvFehler,warn) then begin + gibAus('Es traten Fehler auf!',3); + exit; + end; + gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); + gibAus('... fertig! '+timetostr(now-Zeit),3); + gibAus('berechne x-FFT für Radon-Transformation ...',3); + if not hilfsWerte.fft(threads,false,false,doRes,doResSmi,nil,nil,pvFehler,warn) then begin + gibAus('Es traten Fehler auf!',3); + exit; + end; + gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); + gibAus('... fertig! '+timetostr(now-Zeit),3); + holeRAM(3); - gibAus('berechne Radon-Transformation ...',3); - setLength(radonTransformationsThreads,threads); - for i:=0 to length(radonTransformationsThreads)-1 do - radonTransformationsThreads[i]:=tRadonTransformationsThread.create( - quelle, + gibAus('Lineouts für Radon-Transformation extrahieren ...',3); + setLength(radonTransformationsLineOutThreads,threads); + for i:=0 to length(radonTransformationsLineOutThreads)-1 do + radonTransformationsLineOutThreads[i]:=tRadonTransformationsLineOutThread.create( + hilfsWerte, self, - round(_xSteps/length(radonTransformationsThreads)*i), - round(_xSteps/length(radonTransformationsThreads)*(i+1))-1 + round(_xSteps/length(radonTransformationsLineOutThreads)*i), + round(_xSteps/length(radonTransformationsLineOutThreads)*(i+1))-1 ); repeat fertig:=true; - for i:=0 to length(radonTransformationsThreads)-1 do - fertig:=radonTransformationsThreads[i].fertig and fertig; + for i:=0 to length(radonTransformationsLineOutThreads)-1 do + fertig:=radonTransformationsLineOutThreads[i].fertig and fertig; if not fertig then sleep(10); until fertig; gibAus('... fertig! '+timetostr(now-Zeit),3); + hilfsWerte.free; + gibAus('berechne inverse t-FFT für Radon-Transformation ...',3); + if not fft(threads,true,true,doResSmi,doRes,nil,nil,pvFehler,warn) then begin + gibAus('Es traten Fehler auf!',3); + exit; + end; + gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); + gibAus('... fertig! '+timetostr(now-Zeit),3); end; result:=true; end; @@ -9756,9 +9849,9 @@ begin gibAus('SkalierungsThread beendet',1); end; -// tRadonTransformationsThread ************************************************* +// tRadonTransformationsLineOutThread ****************************************** -constructor tRadonTransformationsThread.create(quelle,ziel: tWerte; xMin,xMax: longint); +constructor tRadonTransformationsLineOutThread.create(quelle,ziel: tWerte; xMin,xMax: longint); begin inherited create; qu:=quelle; @@ -9766,46 +9859,46 @@ begin xMi:=xMin; xMa:=xMax; suspended:=false; - gibAus('RadonTransformationsThread erzeugt: '+intToStr(xMi)+'-'+intToStr(xMa),1); + gibAus('RadonTransformationsLineOutThread erzeugt: '+intToStr(xMi)+'-'+intToStr(xMa),1); end; -procedure tRadonTransformationsThread.stExecute; +procedure tRadonTransformationsLineOutThread.stExecute; var dX,dY: extended; begin - gibAus('RadonTransformationsThread gestartet',1); + gibAus('RadonTransformationsLineOutThread gestartet',1); dX:=(zi._xStop-zi._xStart)/(zi._xSteps-1); dY:=(zi._tStop-zi._tStart)/(zi._tSiz-1); case zi.genauigkeit of gSingle: case qu.genauigkeit of gSingle: - zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); + zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); gDouble: - zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); + zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); gExtended: - zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); + zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); end{of case}; gDouble: case qu.genauigkeit of gSingle: - zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); + zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); gDouble: - zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); + zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); gExtended: - zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); + zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); end{of case}; gExtended: case qu.genauigkeit of gSingle: - zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); + zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte)); gDouble: - zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); + zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte)); gExtended: - zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); + zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte)); end{of case}; end{of case}; - gibAus('RadonTransformationsThread beendet',1); + gibAus('RadonTransformationsLineOutThread beendet',1); end; // sonstiges ******************************************************************* diff --git a/typenunit.pas b/typenunit.pas index b776f43..693896d 100644 --- a/typenunit.pas +++ b/typenunit.pas @@ -449,9 +449,9 @@ type end; tRTTransformation = class (tKoordinatenTransformation) // repräsentiert die Transformation der Koordinaten bei einer Radontransformation - winkelSchritte, verschiebeSchritte: int64; + winkelSchritte: int64; constructor create; overload; - constructor create(vorg: tTransformation; ws,vs: int64); + constructor create(vorg: tTransformation; ws: int64); procedure aktualisiereAchsen; override; procedure aktualisiereXsTs; override; // keine Änderung der Positionen, der Werte(skalierung) @@ -2501,14 +2501,12 @@ constructor tRTTransformation.create; begin inherited create; winkelSchritte:=180; - verschiebeSchritte:=180; end; -constructor tRTTransformation.create(vorg: tTransformation; ws,vs: int64); +constructor tRTTransformation.create(vorg: tTransformation; ws: int64); begin inherited create; winkelSchritte:=ws; - verschiebeSchritte:=vs; fuegeVorgaengerHinzu(vorg); end; @@ -2523,7 +2521,7 @@ end; procedure tRTTransformation.aktualisiereXsTs; begin outXSTS['x']:=winkelSchritte; - outXSTS['y']:=verschiebeSchritte; + outXSTS['y']:=round(2*sqrt(inXSTS*inXSTS)); end; function tRTTransformation.wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended; @@ -2561,7 +2559,7 @@ end; function tRTTransformation.dumpParams: string; begin - result:='RT: '+intToStr(winkelSchritte)+' x '+intToStr(verschiebeSchritte); + result:='RT: '+intToStr(winkelSchritte); result:=result + ' ' + inherited dumpParams; end; diff --git a/werteunit.inc b/werteunit.inc index 4ee71ce..884edbc 100644 --- a/werteunit.inc +++ b/werteunit.inc @@ -170,39 +170,37 @@ begin end; {$ENDIF} -{$IFDEF tLLWerte_radonTransformation} -//procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); +{$IFDEF tLLWerte_radonTransformationsLineOut} +//procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); var - oX,oY,iX,iY: longint; - oYf,cX,sX,iXM,iYM,oXM,oYM,wert: extended; + oX,oY,iXG,iYG: int64; + cX,sX,iX,iY,iXF,iYF: extended; begin - iXM:=(qu^.params.xSteps-1)/2; - iYM:=(qu^.params.tSiz-1)/2; - oXM:=(params.xSteps-1)/2; - oYM:=(params.tSiz-1)/2; + // y-doResSmi-georndeter Wert an Stelle (oX,oY) soll gefüllt werden mit + // x-&y-doResSmi-geornetem Wert auf der Ursprungsgerade mit Winkel oX*XStep; Position oY*yStep + // Wir gehen davon aus, dass das Feld groß genug ist, sodass wir die Mitte nicht erreichen. for oX:=xMin to xMax do begin - cX:=cos((oX-oXM)*xStep); - sX:=sin((oX-oXM)*xStep); - for oY:=0 to params.tSiz-1 do - werte[oX+oY*params.xSteps]:=0; - for iY:=0 to qu^.params.tSiz-1 do - for iX:=0 to qu^.params.xSteps-1 do begin - oYf:=((iX-iXM)*sX + (iY-iYM)*cX) / yStep + oYM; - wert:=qu^.werte[iX + iY*qu^.params.xSteps]; - if oYf<=0 then - werte[oX]:= - werte[oX] + wert - else if oYf >= params.tSiz-1 then - werte[oX + (params.tSiz-1)*params.xSteps]:= - werte[oX + (params.tSiz-1)*params.xSteps] + wert - else begin - oY:=floor(oYf); - werte[oX + oY*params.xSteps]:= - werte[oX + oY*params.xSteps] + wert * (1-oYf+oY); - werte[oX + (oY+1)*params.xSteps]:= - werte[oX + (oY+1)*params.xSteps] + wert * (oYf-oY); - end; - end; + cX:=cos(oX*xStep); + sX:=sin(oX*xStep); + for oY:=0 to params.tSiz div 2 do begin + iX:=oY*yStep*cX; + iY:=oY*yStep*sX; + iXG:=floor(iX); + iXF:=iX-iXG; + iYG:=floor(iY); + iYF:=iY-iYG; + werte[oX+oY*params.xSteps]:= + qu^.reBei2DDoResSmi(iXG,iYG)*(1-iXF)*(1-iYF) + + qu^.reBei2DDoResSmi(iXG+1,iYG)*iXF*(1-iYF) + + qu^.reBei2DDoResSmi(iXG,iYG+1)*(1-iXF)*iYF + + qu^.reBei2DDoResSmi(iXG+1,iYG+1)*iXF*iYF; + if (oY>0) and (2*oY<params.tSiz) then + werte[oX+(params.tSiz-oY)*params.xSteps]:= + qu^.imBei2DDoResSmi(iXG,iYG)*(1-iXF)*(1-iYF) + + qu^.imBei2DDoResSmi(iXG+1,iYG)*iXF*(1-iYF) + + qu^.imBei2DDoResSmi(iXG,iYG+1)*(1-iXF)*iYF + + qu^.imBei2DDoResSmi(iXG+1,iYG+1)*iXF*iYF; + end; end; end; {$ENDIF} diff --git a/werteunit.pas b/werteunit.pas index db14755..27e88ff 100644 --- a/werteunit.pas +++ b/werteunit.pas @@ -56,9 +56,9 @@ type function liesDateien(dateien: tGenerischeInputDateiInfoArray): boolean; function fft(senkrecht,invers: boolean; algo: tFFTAlgorithmus; fen: tFenster; hg: tExtendedArray; out pvFehler: extended): boolean; overload; inline; function fft(sMin,sMax: longint; senkrecht,invers: boolean; algo: tFFTAlgorithmus; fen: tFenster; hg: tExtendedArray; out pvFehler: extended): boolean; overload; - procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); overload; - procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); overload; - procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); overload; + procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); overload; + procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); overload; + procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); overload; procedure spiegle; overload; procedure spiegle(tMin,tMax: longint); overload; procedure fft2dNachbearbeitungA(nB: tFFTDatenordnung); @@ -910,14 +910,14 @@ begin result:=not (in0 or out0); end; -{$DEFINE tLLWerte_radonTransformation} -procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); +{$DEFINE tLLWerte_radonTransformationsLineOut} +procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); {$INCLUDE werteunit.inc} -procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); +procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); {$INCLUDE werteunit.inc} -procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); +procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); {$INCLUDE werteunit.inc} -{$UNDEF tLLWerte_radonTransformation} +{$UNDEF tLLWerte_radonTransformationsLineOut} procedure tLLWerte.schreibeWert(var f: textFile; x,y: extended; beschriftung: tExtPoint; var letzterWert: extended; entspringen,verschiebung: extended; skalierung: string; kvs: tKnownValues; linienIntegral: tLinienIntegral; cbgv: tCallBackGetValue); var |