TL; DR Vous devez implémenter des opérations booléennes à l'aide d'arbres BSP.
Eh bien, il semble que nous parlions ici de géométrie solide constructive . J'ai implémenté CSG à un niveau commercial, donc je sais une chose ou deux à ce sujet.
L'article classique sur CSG s'appelle Merging BSP Trees Yields Polyhedral Set Operations , pour être honnête, c'est trop à expliquer ici, mais en bref, l'algorithme traite des polygones qui se trouvent sur le même plan qu'un partitionnement d'espace binaire, construisant essentiellement un arbre BSP de chaque maillage polygonal. La deuxième étape consiste à fusionner ces arbres BSP; vous prenez simplement un arbre et l'insérez dans l'autre. L'algorithme continue ensuite d'expliquer comment traiter chaque nœud feuille pour diviser et soustraire les nœuds, les nœuds qui ne sont pas nécessaires dans la forme finale seront supprimés, d'autres recevront le parent approprié.
Mais attendez! Ce document parle essentiellement des maillages polygonaux et des plans 3D, NON?
L'algorithme peut être généralisé dans n'importe quelle dimension, donc dans votre cas 2D, il est facile d'utiliser des segments de ligne au lieu de plan comme partitions binaires. Ainsi, chaque polygone sera converti en un arbre BSP que les deux seront fusionnés. Enfin, vous traversez l'arbre résultant pour générer le polygone final,
Notez que cet algorithme et le CSG en général ne traitent pas directement le rendu et les faces de maillage et ne sont pas vraiment prêts, vous devez donc extraire les faces des arborescences BSP finales. Je trouve également que le lancer de rayons est une approche plus facile pour rendre le résultat CSG, vous n'avez besoin que des rayons pour traverser l'arbre au lieu d'extraire et de diviser les faces (rappelez-vous que nous ne traitons que des partitions binaires).
Concernant la robustesse numérique. Il est bon de noter qu'il existe deux types de calculs géométriques,
- Ceux qui sont basés sur la construction, vous construisez une forme basée sur le résultat d'une opération précédente. Par exemple
y = sqrt(x)
, puis utiliser y
dans une nouvelle opération. C'est ce qu'on appelle la construction; le problème est que les erreurs numériques s'accumulent rapidement.
- Alternativement, il existe des opérations qui utilisent des prédicats à la place, essentiellement au lieu d'utiliser la construction, vous demandez simplement si une condition est vraie / fausse et utilisez la même valeur dans une opération différente. Les tests classiques incluent incircle et le test d'orientation; cela est également suspect d'erreurs numériques, surtout si vous utilisez une précision simple ou double, mais donne généralement de bien meilleurs résultats. il existe d'autres solutions qui varient selon la vitesse et la précision. Voici l'un des articles récents qui évitent la construction en utilisant une géométrie plane pour donner des résultats précis. Je citerai également le document:
Le concept de représentation plane des maillages polygonaux a été décrit pour la première fois par Sugihara et Iri [SI89]. Ce type de représentation fournit un avantage important en ce qui concerne les tâches qui impliquent de changer la topologie des solides représentés par des maillages comme l'évaluation des expressions booléennes: aucune nouvelle information de géométrie primaire ne doit être construite pour obtenir le polyèdre résultant
Et enfin, je voudrais ajouter, si vous souhaitez démarrer votre implémentation CSG BSP, je recommanderais de commencer sur les FAQ BSP .