TL; DR Вам необходимо реализовать логические операции с использованием BSP-деревьев.
Ну, кажется, мы говорим о Конструктивной Твердой Геометрии здесь. Я внедрил CSG на коммерческом уровне, поэтому знаю кое-что об этом.
Классическая статья о CSG называется « Объединение деревьев BSP и приводит к многогранным операциям над множествами» , если честно, здесь слишком много объяснений, но вкратце говоря, алгоритм имеет дело с многоугольниками, которые лежат в одной плоскости с разбиением двоичного пространства, в основном конструируя дерево BSP из каждой многоугольной сетки. Второй шаг - объединить эти деревья BSP; Вы просто берете одно дерево и вставляете его в другое. Затем алгоритм переходит к объяснению того, как обращаться с каждым конечным узлом для разделения и вычитания узлов, узлы, которые не нужны в окончательной форме, будут удалены, другим будут назначены соответствующие родительские узлы.
Но ждать! Эта статья в основном говорит о полигональных сетках и трехмерных плоскостях, НЕТ?
Алгоритм может быть обобщен на любое измерение, поэтому в вашем двумерном случае легко использовать линейные сегменты вместо плоскости в качестве бинарных разбиений. Таким образом, каждый многоугольник будет преобразован в дерево BSP, после чего оба будут объединены. Наконец, вы проходите результирующее дерево, чтобы сгенерировать конечный многоугольник
Обратите внимание, что этот алгоритм и CSG в целом не имеют дело с рендерингом и сеткой граней напрямую, и на самом деле они не готовы, поэтому вам нужно извлечь грани конечных деревьев BSP. Я также считаю , трассировка лучей проще подхода к визуализации результата CSG, вам нужно только лучи , чтобы перемещаться по дереву вместо извлечения и фактически разделив лицо (помните , мы имеем дело только с бинарными перегородками).
Относительно числовой надежности. Хорошо отметить, что есть два типа геометрических вычислений,
- Те, которые основаны на построении, вы строите фигуру на основе результата предыдущей операции. Например,
y = sqrt(x)
а затем использовать y
в новой операции. Это называется конструкцией; проблема в том, что числовые ошибки будут быстро накапливаться.
- В качестве альтернативы есть операции, в которых вместо этого используются предикаты. По сути, вместо использования конструкции вы просто спрашиваете, является ли условие истинным / ложным, и используете одно и то же значение в другой операции. Классические тесты включают в себя круг и тест на ориентацию; это также может привести к ошибкам числового типа, особенно если вы используете одинарную или двойную точность, но обычно дает гораздо лучшие результаты. Существуют другие решения, которые различаются по скорости и точности. Вот одна из недавних работ, которые избегают конструирования, используя плоскую геометрию для получения точных результатов. Я также процитирую из бумаги:
Концепция плоского представления многоугольных сеток была впервые описана Сугихарой и Ири [SI89]. Этот вид представления обеспечивает одно важное преимущество, когда речь идет о задачах, которые включают изменение топологии твердых тел, представленных сетками, таких как вычисление булевых выражений: для получения результирующего многогранника не требуется создавать новую информацию о первичной геометрии.
И, наконец, я хотел бы добавить, что если вы хотите начать реализацию BSP CSG, я бы рекомендовал начать с BSP Faqs .