Ich versuche, Jarvis Algorithmus zum Finden der konvexen Hülle einer Reihe von Punkten zu implementieren, aber aus irgendeinem Grund funktioniert es nicht. Dies ist meine Implementierung:Warum funktioniert diese Implementierung von Jarvis 'March ("Gift wrapping algorithm") nicht?
procedure TPointList.ConvexHull(aHull : TPointList); //Return the convex hull of a set of 2D points
var
vPointOnHull : TPoint2D;
vEndpoint : TPoint2D;
I : integer;
begin
aHull.Clear;
if Count < 3 then exit;
vPointOnHull := Self.LeftMostPoint;
repeat
aHull.Add(vPointOnHull);
vEndpoint := Self.Point[0];
for I := 1 to Self.Count-1 do
if Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide then
vEndpoint := Self.Point[I];
vPointOnHull := vEndpoint;
until vEndpoint = aHull.Point[0];
end;
- TPointList ist eine einfache Liste von Punkten.
- Orientierung ist eine Funktion von Arash Partow Bibliothek „FastGEO“
- Die Umsetzung mehr oder weniger direkt aus dem geschieht
Offensichtlich habe ich etwas falsch in meiner Umsetzung gemacht, aber für das Leben von mir kann ich nicht sehen was.
UPDATE:
Jonathan Dursi hat mich auf dem richtigen Weg.
aHull.Add(vPointOnHull);
vPointOnHull
ist: Diese Zeile
if Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide then
sollte mit diesem
if (vPointOnHull = vEndpoint) or (Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide) then
wirkt wie ein Zauber :-)
wie ein bisschen etwas, das ich einen Weg, es zu tun gefunden, aber sie hat mir geholfen, vor Ort es. Vielen Dank :-) –