Hola, de la gaveta empolvado saque esto algoritmos que alguna vez use.
Ahora no recuerdo la diferencia entre ellos, pero creo que radica en que si el ulitmo punto tiene o no que ser igual al primero.
En su epoca me funcionaron bien.
Espero que resuelvas.
Saludos
Juan Carlos
Código Delphi
[-]
Function EstaElPuntoDentroDelPoligono(P:TPointDouble;Pol:Array of TPointDouble):Boolean;
Var
Nc, I : Integer;
Alfa,
XQ : Double; Db, Da: TCoordenada; Begin
Result := False;
Nc := -1;
for I := 0 to length(Pol)-1 do
begin
If I = Length(Pol)-1 then
Begin
Da := Pol[i].Y - P.Y;
Db := Pol[0].Y - P.Y;
If ((Da >= 0) And (Db < 0)) Or ((Db >= 0) And (Da < 0)) then
Begin
Alfa := Da/(Da-Db);
XQ := Pol[i].X + Alfa * (Pol[0].X-Pol[i].X);
If XQ > P.X Then Inc(Nc);
End;
End
Else
Begin
Da := Pol[i].Y - P.Y; Db := Pol[I+1].Y - P.Y;
If ((Da >= 0) And (Db < 0)) Or ((Db >= 0) And (Da < 0)) then
Begin
Alfa := Da/(Da-Db);
XQ := Pol[i].X + Alfa * (Pol[I+1].X-Pol[i].X); If XQ > P.X Then Inc(Nc);
End;
End;
end;
If (Not Odd(Nc)) And (Nc >= 0) Then Result := true;
End;
Function EstaElPuntoDentroDelPoligono2(P:TPointDouble;Pol:Array of TPointDouble):Boolean;
Var
Nc, I, LongPol : Integer;
Alfa,
XQ : Double; Db, Da: TCoordenada; Begin
Result := False;
Nc := -1;
for I := 0 to length(Pol)-2 do
Begin
Da := Pol[i].Y - P.Y; Db := Pol[I+1].Y - P.Y;
If ((Da >= 0) And (Db < 0)) Or ((Db >= 0) And (Da < 0)) then
Begin
Alfa := Da/(Da-Db);
XQ := Pol[i].X + Alfa * (Pol[I+1].X-Pol[i].X); If XQ > P.X Then Inc(Nc);
End;
End;
If (Not Odd(Nc)) And (Nc >= 0) Then Result := true;
End;
Function EstaElPuntoDentroDelPoligono3(P:TPointDouble;Pol:Array of TPointDouble):Boolean;
Var
Nc, I : Integer;
Alfa,
XQ : Double; Db, Da: TCoordenada; Begin
Result := False;
Nc := -1;
for I := 0 to length(Pol)-1 do
begin
If I = Length(Pol)-1 then
Begin
Da := Pol[i].Y - P.Y;
Db := Pol[0].Y - P.Y;
If ((Da >= 0) And (Db < 0)) Or ((Db >= 0) And (Da < 0)) then
Begin
Alfa := Da/(Da-Db);
XQ := Pol[i].X + Alfa * (Pol[0].X-Pol[i].X);
If XQ > P.X Then Inc(Nc);
End;
End
Else
Begin
Da := Pol[i].Y - P.Y; Db := Pol[I+1].Y - P.Y;
If ((Da >= 0) And (Db < 0)) Or ((Db >= 0) And (Da < 0)) then
Begin
Alfa := Da/(Da-Db);
XQ := Pol[i].X + Alfa * (Pol[I+1].X-Pol[i].X); If XQ > P.X Then Inc(Nc);
End;
End;
end;
If Not (Odd(Nc)) or (Nc < 0) Then Result := true;
End;