diff options
Diffstat (limited to 'werteunit.pas')
-rw-r--r-- | werteunit.pas | 108 |
1 files changed, 63 insertions, 45 deletions
diff --git a/werteunit.pas b/werteunit.pas index d2f4a97..eaa400b 100644 --- a/werteunit.pas +++ b/werteunit.pas @@ -73,6 +73,7 @@ type procedure holeRAM(ausgaben: byte; gemaeszTXMinMax: boolean); inline; overload; procedure gibMinMaxDichten(out wMi,wMa: extended; out pMi,pMa: tInt64Point; out mMi,mMa: boolean; xMin,xMax,tMin,tMax: longint); function zuPixelWerten(wHoehe,wBreite,xPMi,xMi,tMi: longint; xZ,yZ: extended; mo: boolean; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean; + procedure findeZweitdominantestenPunkt(xMi,xMa,tMi,tMa: longint; xFak,yFak: extended; out maxPos: tInt64Point); function findeSchwellwerte(xMi,xMa,tMi,tMa: longint; Schw: extended): tExtPointArray; procedure integriere(qu: pTLLWerteSingle; xMi,xMa,tMi,tMa,xOf,tOf: longint; richtung: tIntegrationsRichtung); overload; procedure integriere(qu: pTLLWerteDouble; xMi,xMa,tMi,tMa,xOf,tOf: longint; richtung: tIntegrationsRichtung); overload; @@ -1381,6 +1382,58 @@ begin result:=true; end; +procedure tLLWerte.findeZweitdominantestenPunkt(xMi,xMa,tMi,tMa: longint; xFak,yFak: extended; out maxPos: tInt64Point); +var + maxima: tInt64PointArray; + mCnt,i,iM,iP,j,jM,jP: int64; + wert,minWert,maxWert: extended; +begin + setLength(maxima,0); + mCnt:=0; + for j:=tMi to tMa do begin + jM:=j - 1 + params.tSiz*byte(j=0); + jP:=j + 1 - params.tSiz*byte(j=params.tSiz-1); + for i:=xMi to xMa do begin + iM:=i - 1 + params.xSteps*byte(i=0); + iP:=i + 1 - params.xSteps*byte(i=params.xSteps-1); + wert:=werte[i+j*params.xSteps]; + if + (wert > werte[iM+j*params.xSteps]) and + (wert > werte[i+jM*params.xSteps]) and + (wert > werte[iP+j*params.xSteps]) and + (wert > werte[i+jP*params.xSteps]) and + (2*i<>params.xSteps) and + (2*j<>params.tSiz) then begin + if length(maxima)<=mCnt then + setLength(maxima,length(maxima)+1024); + maxima[mCnt]['x']:=i; + maxima[mCnt]['y']:=j; + inc(mCnt); + end; + end; + end; + setLength(maxima,mCnt); + + sortiereNachWert(maxima,true); + maxPos:=maxima[0]; + maxWert:=0; + for i:=0 to length(maxima)-1 do begin + minWert:=abstandsQuadratFuerDominanz(symmetrischModulo(maxima[i],int64Point(params.xSteps,params.tSiz)),maxima[i],xFak,yFak); + for j:=0 to i-1 do begin + wert:=dominanzQuadrat(maxima[i],maxima[j],xFak,yFak); + if wert<minWert then begin + minWert:=wert; + if minWert<=maxWert then + break; + end; + end; + if (i=0) or (minWert>maxWert) then begin + maxWert:=minWert; + maxPos:=maxima[i]; + end; + end; +end; + function tLLWerte.findeSchwellwerte(xMi,xMa,tMi,tMa: longint; Schw: extended): tExtPointArray; var i,j,k,l,m: longint; @@ -1901,8 +1954,7 @@ end; procedure tLLWerte.kantenFilter(betraege: tLLWerte; xFak,yFak: extended; filterTyp: tKantenFilterTyp; einseitig: boolean; out maxPos: tInt64Point); var - maxima: tInt64PointArray; - i,iM,j,jM,jP,mCnt,di,dj: int64; + i,iM,j,jM,di,dj: int64; wert,minWert,maxWert,radius: extended; istVollKomplex: byte; // 1=nein, 2=ja begin @@ -1920,49 +1972,15 @@ begin fehler('Kann nur einen Hochpass als einseitigen Kantenfilter verwenden!'); end; - setLength(maxima,0); - mCnt:=0; - for j:=0 to betraege.params.tSiz-1 do begin - jM:=j - 1 + betraege.params.tSiz*byte(j=0); - jP:=j + 1 - betraege.params.tSiz*byte(j=betraege.params.tSiz-1); - for i:=0 to betraege.params.xSteps div 2 + 1 do begin - iM:=i - 1 + betraege.params.xSteps*byte(i=0); - wert:=betraege.werte[i+j*betraege.params.xSteps]; - if - (wert > betraege.werte[iM+j*betraege.params.xSteps]) and - (wert > betraege.werte[i+jM*betraege.params.xSteps]) and - (wert > betraege.werte[(i+1)+j*betraege.params.xSteps]) and - (wert > betraege.werte[i+jP*betraege.params.xSteps]) and - (2*i<>params.xSteps) and - (2*j*istVollKomplex<>params.tSiz) then begin - if length(maxima)<=mCnt then - setLength(maxima,length(maxima)+1024); - maxima[mCnt]['x']:=i; - maxima[mCnt]['y']:=j; - inc(mCnt); - end; - end; - end; - setLength(maxima,mCnt); - - betraege.sortiereNachWert(maxima,true); - maxPos:=maxima[0]; - maxWert:=0; - for i:=0 to length(maxima)-1 do begin - minWert:=betraege.abstandsQuadratFuerDominanz(symmetrischModulo(maxima[i],int64Point(betraege.params.xSteps,betraege.params.tSiz)),maxima[i],xFak,yFak); - for j:=0 to i-1 do begin - wert:=betraege.dominanzQuadrat(maxima[i],maxima[j],xFak,yFak); - if wert<minWert then begin - minWert:=wert; - if minWert<=maxWert then - break; - end; - end; - if (i=0) or (minWert>maxWert) then begin - maxWert:=minWert; - maxPos:=maxima[i]; - end; - end; + betraege.findeZweitdominantestenPunkt( + 0, + betraege.params.xSteps div 2 + 1, + 0, + betraege.params.tSiz div 2 + 1, + xFak, + yFak, + maxPos + ); if istVollKomplex=1 then begin iM:=params.xSteps div 2 + 1; |