2011-01-28 33 views
12

Ayer yo estaba buscando para comprobar si un punto estaba dentro de un polígono y encontramos este gran guión: https://github.com/tparkin/Google-Maps-Point-in-PolygonComprobar si polígono se encuentra dentro de un polígono

Pero hoy en día en el trabajo me dijeron que nuestro cliente necesita para comprobar si un polígono está dentro de otro polígono Me pregunto si existe una fórmula en la que pueda tomar, digamos, dos coordenadas (en lugar de una para verificar un punto), y de esas dos coordenadas se genera un rectángulo y se comprueba si ese rectángulo está dentro de un polígono.

No sé si estoy haciendo una pregunta estúpida (un profesor en la escuela secundaria solía decir "no hay preguntas estúpidas, solo hay tontos que no preguntan"), pero si no lo hacen entiéndeme totalmente pero solo un poco, te agradecería si me dijeras por dónde empezar.

+3

Comprobar si todos los puntos de polígono A están en el interior del polígono B –

+0

primero habría que ver si esquinas de la caja de contorno de una polígono están dentro del otro; esa será una prueba rápida. Después de eso, sin embargo, siga el consejo de @ M28 y compruebe cada punto de un polígono dentro del otro. – Phrogz

+1

@ M28 Verificar solo los puntos de vértice no funciona. Si B no es convexo, entonces tienes (muchos) casos donde todos los vértices A están en B, pero una parte de A todavía cruza fuera de B. – payne

Respuesta

24

Realice line intersection pruebas para cada par de líneas, una de cada polígono. Si no se cruzan pares de líneas y uno de los extremos de la línea del polígono A está dentro del polígono B, entonces A está completamente dentro de B.

Lo anterior funciona para cualquier tipo de polígono. Si los polígonos son convexos, puede omitir las pruebas de intersección de líneas y sólo prueba que todas las líneas de puntos finales de A son B. interior

si realmente es necesario, se puede acelerar las pruebas de intersección de línea utilizando el sweep line algorithm.

+1

Si no hay intersecciones de línea, ¿entonces no debería solo verificar un punto? – sdleihssirhc

+0

@sdleihssirhc Eso es correcto. He editado esto en. – marcog

+0

Eso lo haría. Algoritmo muy lento, ¿no? O (n!) Creo. –

0

¿El polígono es convexo? Porque, si es así, podrías ejecutar el script "punto en el polígono" para las dos "esquinas" de tu "rectángulo". Si ambas esquinas están dentro, y el polígono no tiene "curvas" hacia adentro, ¿no estaría todo el rectángulo dentro?

+7

"Citas" "son" "divertidas". – sdleihssirhc

+0

"I" "de acuerdo" "/ 15chars" –

1

Primero compruebe que uno de los puntos de esquina en el polígono está dentro del otro polígono utilizando la secuencia de comandos. Luego, compruebe si alguna de las líneas del polígono cruza cualquiera de las líneas del otro polígono. Si no lo hacen, el polígono está dentro del otro polígono.

1

Quizás esta parte del código puede ayudarle a:

package com.polygons; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import org.apache.commons.collections.CollectionUtils; 

/** 
* Utility to Manipulate Polygons 
* 
* @author fernando.hernandez 
* 
*/ 

public class PolygonUtils { 

    /** 
    * Check if polygon2 is inside polygon to polygon1 
    * @param polygon1 polygon that contains other 
    * @param polygon2 polygon that is inner to other 
    * @return true if polygon2 is inner to polygon1 
    */ 
    public boolean isInsidePolygon(Polygon polygon1, Polygon polygon2){ 
     //all points in inner Polygon should be contained in polygon 
     int[] xpoints = polygon2.xpoints; 
     int[] ypoints = polygon2.ypoints; 
     boolean result = true; 
     for (int i = 0, j = 0; i < polygon2.npoints ; i++,j++) { 
      result = polygon1.contains(new Point(xpoints[i], ypoints[j])); 
      if(!result) break; 
     } 
     return result; 
    } 
} 
+0

Esto solo funciona para formas externas convexas. Las formas externas cóncavas pueden contener todos los puntos de la forma interna, pero tienen bordes superpuestos. – thelastshadow

0

Por qué no usar JTS? Tiene un montón de puertos para otros idiomas, incluyendo C++, JavaScript y .NET.

0

Tenía que encontrar una solución similar. Aquí es lo que tengo hasta ahora:

  1. En primer lugar me fue a buscar todo el nivel coordina 1 polígono en un array[pol1cords[cord1,cord2...],pol2cords[cord1,cord2...],..]
  2. Entonces fue a buscar todos los de nivel 3 polígonos y les trazó
  3. Luego, para cada nivel de 1 polígono, i comprueba si cada una de las coordenadas del polígono estaba dentro del nivel de trazado 3 de coordenadas con google.maps.geometry.poly.containsLocation(latLng, pol)
  4. Si volvió true contador subiría
  5. por último, si el contador es igual a la longitud de esa matriz, el resultado sería cierto (el polígono de nivel 1 está dentro del polígono de level3).

Mi algoritmo es como la siguiente:

"" Zona (nivel 3) -> Distrito (nivel 2) -> VCC (nivel 1) "" CDA = getVDCs(); -> da vdcs en una matriz que tiene nombre, id y coordenadas de polígono zones = getZones(); -> da zonas en una matriz que tiene nombre, identificación y polígono coordina

foreach(zones as zone){ 
    drawPolygon(zone[coordinates]); 
    foreach(vdcs as vdc){ 
     foreach(vdc[coordinates] as coordinate){ 
      result = checkLocation(zone, coordinate); 
      if(result) counter++; 
     } 
     if(counter = vdc[coordinates].length){writeConsole(vdc_id+"true in"+zone_id)} 
    } 
} 
Cuestiones relacionadas