TL; DR È necessario implementare operazioni booleane utilizzando alberi BSP.
Bene, sembra che stiamo parlando della geometria solida costruttiva qui. Ho implementato CSG a livello commerciale, quindi ne so una cosa o due.
Il classico documento su CSG si chiama Merging BSP Trees Yields Polyhedral Set Operations , ad essere sinceri, è troppo da spiegare qui, ma brevemente l'algoritmo si occupa dei poligoni che si trovano sullo stesso piano di un partizionamento dello spazio binario, fondamentalmente costruendo un albero BSP da ogni mesh poligonale. Il secondo passo è unire quegli alberi BSP; prendi semplicemente un albero e lo inserisci nell'altro. L'algoritmo procede quindi a spiegare come gestire ciascun nodo foglia per dividere e sottrarre i nodi, i nodi che non sono necessari nella forma finale verranno rimossi, ad altri verrà dato il genitore appropriato.
Ma aspetta! Quel documento parla fondamentalmente di mesh poligonali e piani 3D, NO?
L'algoritmo può essere generalizzato in qualsiasi dimensione, quindi nel tuo caso 2D è facile usare segmenti di linea anziché piano come partizioni binarie. Quindi ogni poligono verrà convertito in un albero BSP di quanto i due verranno uniti. Infine attraversi l'albero risultante per generare il poligono finale,
Si noti che questo algoritmo e CSG in generale non si occupano direttamente di rendering e mesh delle facce e non sono realmente pronti per il rendering, quindi è necessario estrarre le facce degli alberi BSP finali. Trovo anche il ray tracing un approccio più semplice per il rendering del risultato CSG, hai solo bisogno dei raggi per attraversare l'albero invece di estrarre e effettivamente dividere le facce (ricorda che ci occupiamo solo di partizioni binarie).
Per quanto riguarda la robustezza numerica. È bene notare che esistono due tipi di calcoli geometrici,
- Quelli che si basano sulla costruzione, costruisci una forma in base al risultato di un'operazione precedente. Ad esempio,
y = sqrt(x)
quindi utilizzare y
in una nuova operazione. Questo si chiama costruzione; il problema è che gli errori numerici si accumuleranno rapidamente.
- In alternativa, ci sono operazioni che usano invece predicati , essenzialmente invece di usare la costruzione semplicemente chiedi se una condizione è vera / falsa e usi lo stesso valore in un'operazione diversa. I test classici includono l'incircle e il test di orientamento; questo è anche sospetto di errori numerici, soprattutto se si utilizza la precisione singola o doppia, ma di solito darà risultati molto migliori. esistono altre soluzioni che variano in termini di velocità e precisione. Ecco uno dei documenti recenti che evitano la costruzione utilizzando una geometria basata su un piano per fornire risultati accurati. Citerò anche dal documento:
Il concetto di rappresentazione basata su piano di maglie poligonali è stato descritto per la prima volta da Sugihara e Iri [SI89]. Questo tipo di rappresentazione offre un vantaggio importante quando si tratta di attività che comportano la modifica della topologia dei solidi rappresentata da mesh come la valutazione delle espressioni booleane: non è necessario costruire nuove informazioni sulla geometria primaria per ottenere il poliedro risultante
E infine vorrei aggiungere, se desideri iniziare l'implementazione di CSG BSP, ti consiglio di iniziare con le domande frequenti su BSP .