diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 75 |
1 files changed, 60 insertions, 15 deletions
diff --git a/epostunit.pas b/epostunit.pas index fdba2da..ab1a0c7 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -4020,23 +4020,25 @@ end; function tWerte.entferneArtefakte(sT: boolean; f: tMyStringList; threads: longint): boolean; var - Zeit: extended; - hintergrund: tExtendedArray; - fensters: array[boolean] of tSin2Fenster; - s: string; - b,heiszePixel,fertig: boolean; - hintergrundAbziehen: tHintergrundAbzugsArt; - fensterThreads: array of tFensterThread; - i: int64; - bekannteBefehle: tMyStringList; - heiszPixelSchwellen: array[0..2] of extended; + Zeit,epsilon: extended; + hintergrund: tExtendedArray; + fensters: array[boolean] of tFenster; + s: string; + b,heiszePixel,fertig: boolean; + hintergrundAbziehen,haDummy: tHintergrundAbzugsArt; + fensterThreads: array of tFensterThread; + i: int64; + bekannteBefehle: tMyStringList; + heiszPixelSchwellen: array[0..2] of extended; begin result:=false; Zeit:=now; if not sT then gibAus('Artefakte entfernen ...',3); - for b:=false to true do + for b:=false to true do begin fensters[b]:=tSin2Fenster.create; + (fensters[b] as tSin2Fenster).breite:=_tSiz; + end; hintergrundAbziehen.art:=haaKeine; setLength(hintergrundAbziehen.parameter,0); setLength(hintergrund,0); @@ -4044,6 +4046,7 @@ begin heiszPixelSchwellen[1]:=-infinity; heiszPixelSchwellen[2]:=infinity; heiszePixel:=false; + epsilon:=1e-9; bekannteBefehle:=tMyStringList.create; repeat if not f.metaReadln(s,true) then begin @@ -4066,12 +4069,40 @@ begin delete(s,1,pos(':',s)); s:=trim(s); if b then - fensters[b].rand:=round(kont2diskFak('t',exprToFloat(sT,s))) + (fensters[b] as tSin2Fenster).rand:=round(kont2diskFak('t',exprToFloat(sT,s))) else - fensters[b].rand:=round(kont2diskFak('x',exprToFloat(sT,s))); + (fensters[b] as tSin2Fenster).rand:=round(kont2diskFak('x',exprToFloat(sT,s))); fensters[b].aktiv:=true; continue; end; + if istDasBefehl('epsilon:',s,bekannteBefehle,true) then begin + epsilon:=exprToFloat(sT,s); + continue; + end; + if istDasBefehl('durch horizontalen Verlauf teilen:',s,bekannteBefehle,true) then begin + if not stringToTHintergrundAbzugsArt(s,sT,knownValues,@callBackGetValue,haDummy) then begin + bekannteBefehle.free; + exit; + end; + if haDummy.art<>haaVertikaleMittel then begin + haDummy.art:=haaVertikaleMittel; + setLength(haDummy.parameter,2); + haDummy.parameter[0]:=3; + haDummy.parameter[1]:=3.141; + gibAus('Syntaxfehler beim Entfernen von Artefakten - erwartet: "durch horizontalen Verlauf teilen: '+tHintergrundAbzugsArtToStr(haDummy)+'"',3); + bekannteBefehle.free; + exit; + end; + if fensters[false].aktiv then begin + gibAus('Beim Entfernen von Artefakten kann ich nicht gleichzeitig in x Fenstern und durch einen horizontalen Verlauf teilen!',3); + bekannteBefehle.free; + exit; + end; + fensters[false].free; + fensters[false]:=tVerlaufTeilFenster.create(haDummy,epsilon); + fensters[false].aktiv:=true; + continue; + end; if istDasBefehl('Hintergrund abziehen:',s,bekannteBefehle,true) then begin if not stringToTHintergrundAbzugsArt(s,sT,knownValues,@callBackGetValue,hintergrundAbziehen) then begin bekannteBefehle.free; @@ -4098,12 +4129,26 @@ begin exit; until false; bekannteBefehle.free; - fensters[true].breite:=_tSiz-fensters[true].breite; - fensters[false].breite:=_xSteps-fensters[false].breite; if not ermittleHintergrund(sT,threads,hintergrundAbziehen,hintergrund) then exit; + if fensters[false] is tVerlaufTeilFenster then begin + haDummy.art:=haaVertikaleMittel; + setLength(haDummy.parameter,2); + haDummy.parameter[0]:=kont2disk('t',(fensters[false] as tVerlaufTeilFenster).tMin); + haDummy.parameter[1]:=kont2disk('t',(fensters[false] as tVerlaufTeilFenster).tMax); + if not ermittleHintergrund(sT,threads,haDummy,fensters[false].werte) then + exit; + for i:=0 to length(fensters[false].werte)-1 do + if abs(fensters[false].werte[i])>epsilon then + fensters[false].werte[i]:=1/fensters[false].werte[i] + else if fensters[false].werte[i]<0 then + fensters[false].werte[i]:=-1/epsilon + else + fensters[false].werte[i]:=1/epsilon; + end; + if sT then begin for b:=false to true do fensters[b].free; |