Próbuję zaimplementować algorytm Jarvisa do znajdowania wypukłego kadłuba zestawu punktów, ale z jakiegoś powodu to nie działa. To jest moje wykonanie:Dlaczego ta implementacja Marca Jarvisa ("Algorytm pakowania prezentów") nie działa?
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 jest prosta lista punktów.
- Orientacja jest funkcja z biblioteki Arash Partow za „FastGEO”
- Realizacja jest podnoszony bardziej lub mniej bezpośrednio z Wikipedia article on the algorithm
Co się dzieje, jest to, że metoda rozpoczyna się dodając ten sam punkt na aHull kółko . W jednym przypadku testowym wysyłam punkty (200; 200) (300; 100) (200; 50) i (100; 100), a algorytm rozpoczyna się od dodania (100; 100) do wartości, która jest poprawna, ale potem zaczyna dodawać (200; 200) w kółko.
Oczywiście zrobiłem coś złego w mojej realizacji, ale dla mojego życia nie widzę co.
UPDATE:
Jonathan Dursi umieścić mnie na właściwe tory. Ta linia
if Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide then
należy zastąpić tego
if (vPointOnHull = vEndpoint) or (Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide) then
działa jak czar :-)
znalazłem sposób, aby to zrobić, ale pomógł mi miejsce to. Dzięki :-) –