Estoy tratando de implementar el algoritmo de Jarvis para encontrar el casco convexo de un conjunto de puntos, pero por alguna razón no funciona. Este es mi aplicación:¿Por qué no funciona esta implementación de Jarvis 'March ("Algoritmo de envoltura de regalos")?
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 es una simple lista de puntos.
- La orientación es una función de la biblioteca de Arash Partow "FastGEO"
- La aplicación se levanta más o menos directamente de la Wikipedia article on the algorithm
Lo que sucede es que el método se inicia añadiendo el mismo punto a ahull una y otra . En un caso de prueba, envío los puntos (200; 200) (300; 100) (200; 50) y (100; 100), y el algoritmo comienza por agregar (100; 100) a una Casilla que es correcta, pero luego comienza a agregar (200; 200) una y otra vez.
Obviamente he hecho algo mal en mi implementación, pero por mi vida no puedo ver qué.
ACTUALIZACIÓN:
Jonathan Dursi me puso en el camino correcto. Esta línea
if Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide then
debe ser reemplazado con esta
if (vPointOnHull = vEndpoint) or (Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide) then
funciona como un encanto :-)
he encontrado una manera de hacerlo, pero me ayudó a punto eso. Gracias :-) –