Hallo,
ich habe endlich den casus cnactus gefunden.
Deine SortCompareX darf nur mit eps= 0 arbeiten.Ich habe wie blöd gesucht, warum größere x-Werte vor kleineren auftauchten....
Ich hab jetzt auf einem Kreis mit Radius cEps um Punkt A verglichen.
RemoveDoublesII behält die Daten in der Ausgangsliste, also muss kein extra Feld angelegt werden.
Delphi-Quellcode:
procedure TFloatPoints.RemoveDoublesII;
var
I, j: integer;
ll, ul: integer;// lower, upper limit
tmpf : tFloatPoint;
begin
SortByX;
ll := Low(FItems);
ul := ll;
for i := ll + 1 to FCOunt-1 do
begin
tmpf := FItems[i];
while (ll < ul) and (tmpf.X >= FItems[ll].X + cEps) do
Inc(ll);
IF ll>ul then
begin
Inc(ul);
FItems[ul] := tmpF;
end
else
Begin
j := ll;
while j <= ul do
begin
if SameFloatPoint(tmpF, FItems[j]) then
Break;
Inc(j);
end;
if j > ul then
begin
Inc(ul);
FItems[ul] := tmpF;
end
end;
end;
FCount := ul+1;
end;
Einen Test mit N= 100000 empfehle ich nicht, denn der anschliessende Check auf Doppelte dauert ewig...
Gruß Horst