Esta es una muy buena pregunta. Implementé el mismo algoritmo en c # hace algún tiempo. El algoritmo construye un contorno común de dos polígonos (es decir, construye una unión sin agujeros). Aquí está.
Paso 1. Crea una gráfica que describa los polígonos.
Entrada: primer polígono (n puntos), segundo polígono (m puntos). Salida: gráfico. Vértice: punto poligonal del punto de intersección.
Deberíamos encontrar intersecciones. Itera a través de todos los lados del polígono en ambos polígonos [O (n * m)] y encuentra las intersecciones.
Si no se encuentra una intersección, simplemente agregue vértices y conéctelos al borde.
Si se encuentran intersecciones, ordénelas por longitud hasta su punto de inicio, agregue todos los vértices (inicio, final e intersecciones) y conéctelos (ya en orden ordenado) al borde.
Paso 2. Verifique el gráfico construido
Si no encontramos ningún punto de intersección cuando se construyó el gráfico, tenemos una de las siguientes condiciones:
- Polygon1 contiene polygon2 - devuelve polygon1
- Polygon2 contiene polygon1 - devuelve polygon2
- Polygon1 y polygon2 no se cruzan. Devuelve polygon1 AND polygon2.
Paso 3. Encuentra el vértice inferior izquierdo.
Encuentre las coordenadas xey mínimas (minx, miny). Luego, encuentre la distancia mínima entre (minx, miny) y los puntos del polígono. Este punto será el punto inferior izquierdo.
Paso 4. Construya un contorno común.
Comenzamos a recorrer el gráfico desde el punto inferior izquierdo y continuamos hasta que volvamos a él. Al principio marcamos todos los bordes como no visitados. En cada iteración, debe seleccionar el siguiente punto y marcarlo como visitado.
Para elegir el siguiente punto, elija una arista con un ángulo interno máximo en dirección contraria a las agujas del reloj.
Calculo dos vectores: vector1 para el borde actual y vector2 para cada siguiente borde no visitado (como se muestra en la imagen).
Para los vectores calculo:
- Producto escalar (producto escalar). Devuelve un valor relacionado con un ángulo entre vectores.
- Producto vectorial (producto cruzado). Devuelve un nuevo vector. Si la coordenada z de este vector es positiva, el producto escalar me da un ángulo recto en dirección contraria a las agujas del reloj. De lo contrario (la coordenada z es negativa), calculo obtener el ángulo entre vectores como 360 - ángulo del producto escalar.
Como resultado, obtengo una arista (y el siguiente vértice correspondiente) con el ángulo máximo.
Agrego a la lista de resultados cada vértice pasado. La lista de resultados es el polígono de unión.
Observaciones
- Este algoritmo nos permite fusionar múltiples polígonos, para aplicar iterativamente con pares de polígonos.
- Si tiene una ruta que consta de muchas curvas y líneas Bézier, primero debe aplanar esta ruta.