TL; DR Você precisa implementar operações booleanas usando árvores BSP.
Bem, parece que estamos falando sobre geometria sólida construtiva aqui. Eu implementei o CSG em nível comercial, então eu sei uma coisa ou duas sobre isso.
O artigo clássico sobre CSG é chamado Mesclando árvores BSP produz operações de conjunto poliédrico , para ser honesto, é demais para explicar aqui, mas, brevemente, o algoritmo lida com polígonos que ficam no mesmo plano de um particionamento de espaço binário, basicamente construindo uma árvore BSP de cada malha poligonal. O segundo passo é mesclar essas árvores do BSP; você simplesmente pega uma árvore e a insere na outra. O algoritmo passa a explicar como lidar com cada nó folha para dividir e subtrair os nós; nós que não forem necessários na forma final serão removidos; outros receberão o pai apropriado.
Mas espere! Esse artigo está falando basicamente de malhas poligonais e planos 3D, NÃO?
O algoritmo pode ser generalizado em qualquer dimensão, portanto, no seu caso 2D, é fácil usar segmentos de linha em vez de plano como as partições binárias. Portanto, cada polígono será convertido em uma árvore BSP e os dois serão mesclados. Por fim, você percorre a árvore resultante para gerar o polígono final,
Observe que esse algoritmo e o CSG em geral não lidam com faces de renderização e malha diretamente e não estão realmente prontos para renderização; portanto, você precisa extrair as faces das árvores finais do BSP. Também acho o traçado de raios uma abordagem mais fácil para renderizar o resultado CSG; você só precisa que os raios atravessem a árvore em vez de extrair e realmente dividir as faces (lembre-se de que lidamos apenas com partições binárias).
Em relação à robustez numérica. É bom notar que existem dois tipos de cálculos geométricos,
- Aqueles que são baseados na construção, você constrói uma forma com base no resultado de uma operação anterior. Por exemplo,
y = sqrt(x)e depois use yem uma nova operação. Isso é chamado de construção; o problema é que erros numéricos se acumulam rapidamente.
- Como alternativa, existem operações que usam predicados , essencialmente, em vez de usar construção, você simplesmente pergunta se uma condição é verdadeira / falsa e usa o mesmo valor em operações diferentes. Os testes clássicos incluem o incircle e o teste de orientação; isso também é suspeito de erros numéricos, especialmente se você usar precisão simples ou dupla, mas geralmente fornecerá resultados muito melhores. existem outras soluções que variam em velocidade e precisão. Aqui está um dos trabalhos recentes que evitam a construção usando uma geometria baseada em plano para fornecer resultados precisos. Também cito o artigo:
O conceito de representação em plano de malhas poligonais foi descrito pela primeira vez por Sugihara e Iri [SI89]. Esse tipo de representação fornece uma vantagem importante quando se trata de tarefas que envolvem a alteração da topologia de sólidos representados por malhas, como a avaliação de expressões booleanas: nenhuma nova informação de geometria primária precisa ser construída para obter o poliedro resultante

E, finalmente, gostaria de acrescentar que, se você deseja iniciar a implementação do BSP CSG, recomendo iniciar nas perguntas frequentes do BSP .