summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-09-24 14:07:14 +0200
committerErich Eckner <git@eckner.net>2019-09-24 14:07:14 +0200
commitf4c04d5f4a1e9730fab17be2aec0ff620d36a375 (patch)
treed69e28e4a1ee63f96cce2afaa3fb80c5b859fc40
parent113e717bef143c649b3c51c865ad93df8d13467f (diff)
downloadepost-f4c04d5f4a1e9730fab17be2aec0ff620d36a375.tar.xz
werteunit.pas: tLLWerte.findeZweitdominantestenPunkt separiert
-rw-r--r--werteunit.pas108
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;