TL; DR Вам потрібно реалізувати булові операції за допомогою дерев BSP.
Ну, мабуть, тут йдеться про конструктивну геометрію суцільного тіла . Я реалізував CSG на комерційному рівні, тому я знаю щось про нього.
Класичний документ про CSG називається об'єднанням поліедральних наборів BSP Trees Yields , якщо чесно, тут пояснюється занадто багато, але коротко кажучи, алгоритм стосується багатокутників, які лежать на одній площині, як бінарний розділ простору, в основному будуючи дерево BSP з кожної багатокутної сітки. Другий крок - об'єднання цих дерев BSP; ви просто берете одне дерево і вставляєте його в інше. Потім алгоритм пояснює, як поводитися з кожним вузлом аркуша для поділу та підстрахування вузлів, вузли, які не потрібні в остаточній формі, будуть видалені, а іншим буде надано відповідний батьківський елемент.
Але зачекайте! Цей документ в основному говорить про полігональні сітки та тривимірні площини, НЕ?
Алгоритм можна узагальнити в будь-який вимір, тому у вашому двовимірному випадку легко використовувати сегменти рядків замість площини як бінарні розділи. Таким чином, кожен багатокутник буде перетворений у дерево BSP, ніж два будуть об’єднані. Нарешті ви перетинаєте отримане дерево, щоб генерувати остаточний багатокутник,
Зауважте, що цей алгоритм і CSG взагалі не стосується візуалізації та сітчастої грані безпосередньо та не є насправді готовою, тому вам потрібно витягнути обличчя кінцевих дерев BSP. Я також вважаю, що відстеження променів є більш простим підходом для відображення результату CSG. Вам потрібні лише промені, щоб обрізати дерево, а не витягувати та розбивати обличчя (пам'ятайте, що ми маємо справу лише з двійковими розділами).
Щодо чисельної стійкості. Добре зазначити, що існує два типи геометричних обчислень,
- Ті, що базуються на побудові, ви будуєте форму на основі результату попередньої операції. Наприклад,
y = sqrt(x)
а потім використовувати y
в новій операції. Це називається будівництвом; проблема полягає в тому, що числові помилки накопичуються швидко.
- Крім того, є операції, які використовують предикати замість цього, по суті, замість того, щоб використовувати конструкцію, ви просто запитуєте, чи умова є істинним / хибним, і ви використовуєте те саме значення в різних операціях. Класичні тести включають incircle та орієнтаційний тест; це також підозрює чисельні помилки, особливо якщо ви використовуєте одинарну або подвійну точність, але зазвичай дають набагато кращі результати. існують інші рішення, що залежать від швидкості та точності. Ось один із останніх робіт, які уникають побудови, використовуючи геометрию на площині, щоб дати точні результати. Я також цитую з статті:
Концепцію представлення багатокутних сіток на площині вперше описали Сугіхара та Ірі [SI89]. Цей вид подання надає одну важливу перевагу, коли мова йде про завдання, що передбачають зміну топології твердих тіл, представлених сітками, як-от оцінка булевих виразів: жодна нова інформація про первинну геометрію не повинна бути побудована для отримання отриманого багатогранника
І нарешті, я хотів би додати, якщо ви хочете розпочати реалізацію CSG BSP, я б рекомендував починати з Faqs BSP .