Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2006
Mefistofeles Mefistofeles is offline
Registrado
 
Registrado: abr 2005
Posts: 9
Poder: 0
Mefistofeles Va por buen camino
Unhappy Sistemas de Informacion Geografico

Hola gente, alguien sabe de alguna funcion que verifique si un punto pertenece a un poligono? Estoy trabajando con SIG (Sistemas de Informacion Geografico), utilizo una tabla con un campo tipo POLYGON y quiero saber si un valor tipo POINT pertece a ese campo POLYGON. Espero que alguien este trabajando con estos tipos de datos. Desde ya, muchas gracias.
Responder Con Cita
  #2  
Antiguo 21-05-2006
JCarlosas JCarlosas is offline
Miembro
 
Registrado: abr 2006
Ubicación: Habana. Cuba
Posts: 103
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Analisis de sistemas Garnet Varios 3 23-10-2005 04:02:49
evitar pirateria de mis sistemas clanmilano Varios 7 22-05-2005 18:37:11
sistemas que corran en web pepe2000 Internet 1 19-03-2005 20:41:44
sistemas de Informacion koalasoft Lazarus, FreePascal, Kylix, etc. 1 20-01-2005 13:29:51
Ejemplos de Sistemas Expertos juanchi C++ Builder 1 22-04-2004 01:18:02


La franja horaria es GMT +2. Ahora son las 17:13:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi