TL; DR Debe implementar operaciones booleanas utilizando árboles BSP.
Bueno, parece que estamos hablando de geometría sólida constructiva aquí. He implementado CSG a nivel comercial, así que sé una o dos cosas al respecto.
El artículo clásico sobre CSG se llama Combinar operaciones de conjuntos poliédricos de rendimientos de árboles BSP , para ser sincero, es demasiado para explicar aquí, pero hablando brevemente, el algoritmo trata con polígonos que se encuentran en el mismo plano que una partición de espacio binario, básicamente construyendo un árbol BSP de cada malla poligonal. El segundo paso es fusionar esos árboles BSP; simplemente toma un árbol e insértalo en el otro. Luego, el algoritmo procede a explicar cómo lidiar con cada nodo de hoja para dividir y restar los nodos, los nodos que no se necesitan en la forma final se eliminarán, otros recibirán el padre apropiado.
¡Pero espera! Ese documento básicamente habla de mallas poligonales y planos 3D, ¿NO?
El algoritmo puede generalizarse en cualquier dimensión, por lo que en su caso 2D es fácil usar segmentos de línea en lugar de planos como particiones binarias. Por lo tanto, cada polígono se convertirá en un árbol BSP que los dos se fusionarán. Finalmente atraviesas el árbol resultante para generar el polígono final,
Tenga en cuenta que este algoritmo y CSG en general no se ocupan de la representación y las caras de malla directamente y realmente no están listas para la representación, por lo que debe extraer las caras de los árboles BSP finales. También encuentro que el trazado de rayos es un enfoque más fácil para representar el resultado CSG, solo necesita los rayos para atravesar el árbol en lugar de extraer y dividir las caras (recuerde que solo tratamos con particiones binarias).
Respecto a la robustez numérica. Es bueno tener en cuenta que hay dos tipos de cálculos geométricos,
- Los que se basan en la construcción, construye una forma basada en el resultado de una operación anterior. Por ejemplo
y = sqrt(x)
y luego usar y
en una nueva operación. Esto se llama construcción; El problema es que los errores numéricos se acumularán rápidamente.
- Alternativamente, hay operaciones que usan predicados en su lugar, esencialmente en lugar de usar construcción, simplemente pregunta si una condición es verdadera / falsa y usa el mismo valor en una operación diferente. Las pruebas clásicas incluyen incircle y la prueba de orientación; Esto también es sospechoso de errores numéricos, especialmente si usa precisión simple o doble, pero generalmente dará resultados mucho mejores. existen otras soluciones que varían en velocidad y precisión. Este es uno de los documentos recientes que evitan la construcción mediante el uso de una geometría basada en el plano para obtener resultados precisos. También citaré del artículo:
Sugihara e Iri [SI89] describieron por primera vez el concepto de representación basada en planos de mallas poligonales. Este tipo de representación proporciona una ventaja importante cuando se trata de tareas que implican cambiar la topología de sólidos representados por mallas como la evaluación de expresiones booleanas: no se debe construir nueva información de geometría primaria para obtener el poliedro resultante

Y finalmente me gustaría agregar, si desea comenzar su implementación de BSP CSG, recomendaría comenzar con las preguntas frecuentes de BSP .