Ver Mensaje Individual
  #2  
Antiguo 21-05-2006
JCarlosas JCarlosas is offline
Miembro
 
Registrado: abr 2006
Ubicación: Habana. Cuba
Posts: 103
Reputación: 19
JCarlosas Va por buen camino
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, //Número de cortes
 I : Integer;
 Alfa,
 XQ : Double;      //Era antes Real
 Db, Da: TCoordenada;   //Eran antes entero
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;  //dA = yA - yP y dB = yB - yP.
          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); //xQ = xA + alfa(xB-xA).
              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, //Número de cortes
 I, LongPol : Integer;
 Alfa,
 XQ : Double;      //Era antes Real
 Db, Da: TCoordenada;   //Eran antes entero
Begin
  Result := False;
  Nc := -1;
  for I := 0 to length(Pol)-2 do
        Begin
          Da := Pol[i].Y - P.Y;  //dA = yA - yP y dB = yB - yP.
          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); //xQ = xA + alfa(xB-xA).
              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, //Número de cortes
 I : Integer;
 Alfa,
 XQ : Double;      //Era antes Real
 Db, Da: TCoordenada;   //Eran antes entero
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;  //dA = yA - yP y dB = yB - yP.
          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); //xQ = xA + alfa(xB-xA).
              If XQ > P.X Then Inc(Nc);
            End;
        End;
    end;
  If Not (Odd(Nc)) or (Nc < 0) Then Result := true;
End;
Responder Con Cita