Forum: Object-Pascal / Delphi-Language
by Horst_,
11. Dez 2014
Hallo,
wie kannst Du Dir so sicher sein?
Ich weiß nicht, wie bei Dir uFloatPoint.pas aussieht.
Wahrscheinlich habe ich jetzt eine falsche Version.
program FloatPointsTest;
{$IFDEF FPC}
{$MODE Delphi}
Forum: Object-Pascal / Delphi-Language
by Horst_,
10. Dez 2014
Hallo,
dann nimm doch 10 Punkte die schon nach x sortiert sind, Aber die Y-Werte gegeneinanderlaufen.
N := 5;
for I := 1 to N do
begin
FLoatPoints.AddXY(i*cEps/N,i);
FLoatPoints.AddXY(i*cEps/N,(N-I+1)+0.5*cEps);
end;
Forum: Object-Pascal / Delphi-Language
by Horst_,
10. Dez 2014
Hallo,
das ist ja gut.
Man braucht ein paar wiederholbare Testfälle.Dazu sollte man random eigentlich weglassen.Damit man sieht, dass aus 1000 + 1000 verschobenene eben auch am Ende wieder 1000 werden.
Sonst wird ein Punkt öfter verschoben, und es belieben dann eben 1100 über.
Gruß Horst
Forum: Object-Pascal / Delphi-Language
by Horst_,
10. Dez 2014
Hallo,
der gepostete Schnipsel soll nur das Vorgehen zeigen.
cEps ist global definiert in uFloatPoint.pas
In den angehängten Dateien ist es dann funktionstüchtig. ( Man kann sich das auch tatsächlich mal anschauen )
Es ging doch darum, das Deine Sortierung nicht wirklich aufsteigend sortiert, weil dort
Result := CompareValue(A.X, B.X, cEps);
immer eine Umgebung betrachtet wird.
Ich...
Forum: Object-Pascal / Delphi-Language
by Horst_,
10. Dez 2014
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.
procedure TFloatPoints.RemoveDoublesII;
var...
Forum: Object-Pascal / Delphi-Language
by Horst_,
9. Dez 2014
Hallo,
da bin ich missverstanden worden...
Beim Versuch mit kleinem eps
procedure TFloatPointsTestForm.RemoveDoublesButtonClick(Sender: TObject);
const
Eps = 1E-3;
steigt das Programm sofort aus.
Forum: Object-Pascal / Delphi-Language
by Horst_,
9. Dez 2014
Hallo,
also wäre es geschickter alle Punkte nach x zu sortieren und anschliessend nur einen Bereich von x_center+-eps zu betrachten und diesen nach y zu sortieren und zu untersuchen.( Sweep-line )
Anschliessend wandert man um ein eps weiter.
Das ist viel Sortiererei, aber man kann sich merken, wie x_center+eps nach y sortiert war. Das wird im nächsten Schritt ja x_center-eps.Da bietet sich...
Forum: Object-Pascal / Delphi-Language
by Horst_,
8. Dez 2014
Hallo,
da wäre eine .Copy Funktion wohl besser.
j := 0;
Für i von 1 bis Fcount
falls Liste <> Liste dann
kopiere Liste -> Liste
erhöhe j
Setze Fcount auf j
Forum: Object-Pascal / Delphi-Language
by Horst_,
8. Dez 2014
Hallo,
Du sortierst doch zweidimensional.
Da musst Du doch zuerst x und nur bei gleichem x auf y testen
Statt
while (FItems.X <= Pivot.X) and (FItems.Y < Pivot.Y) do
Inc(I);
Nun
while true do