Как я могу выполнить треугольник внутри теста в многоугольных сетках?

10

введите описание изображения здесь У меня есть 3 вершины, (V1, V2, V3)случайно выбранные на сетке правильного треугольника. Для этих 3 вершин я вычислил геодезическое расстояние и путь (используя Дейкстру) между ними и сформировал треугольную поверхность, как на рисунке выше.

Теперь у меня есть вершины, которые лежат в каждом пути и могут вычислять геодезические расстояния от данной вершины.

То, что я хочу сделать, это получить вершины или треугольники, которые лежат в треугольной области. Как я могу это сделать?

mkocabas
источник
2
Предполагая, что барицентрический подход делает то, что я думаю, он будет довольно медленным с большими наборами. Представьте себе набор из 9 миллионов вершин с только 9 вершинами в нужном наборе. Зачем повторять весь набор, когда v1, v2 и v3 дают вам всю необходимую информацию. Ответ о заливке будет самым быстрым гибким решением. Хотя это и негибко, но вы можете предположить, что у вас есть линии, как у вас сейчас в геометрии, тогда сканирование будет самым быстрым подходом.
Эндрю Уилсон
Вы абсолютно правы в вопросах производительности. Я хотел бы использовать этот подход в больших сетках, поэтому я ищу эффективный метод. На самом деле я не знаком ни с алгоритмами заливки, ни с сканированиями сканирования, я на них посмотрю. Спасибо.
mkocabas
3
Заполнение графиком будет начинаться с узла, посещать каждый соседний узел, если граничное условие выполнено и не посещено, помечать его как посещенное и повторять (рекурсия). Изменение: пометить каждый узел на пути как посещенный и начать с узла внутри набора. Затем просто используйте проверку посещения как граничное условие.
Эндрю Уилсон
Спасибо за подробное объяснение. Я считаю, что алгоритм заливки более разумен, но я хочу реализовать как заливку, так и линию сканирования, а затем сравнить характеристики.
mkocabas

Ответы:

4

Существует альтернативный метод, основанный на заливке. Сначала разместите данные ребер в петле, где ребра образуют петлю против часовой стрелки. Затем начните с произвольной точки цикла и выберите ребра, соединяющие эту точку. Используйте край исходящей границы и пересекайте его с другим исходящим краем, если он указывает в направлении нормали грани, то этот край должен быть включен, если не отменен. От этого края продолжайте, пока не дойдете до граничного края, и в этот момент вы заканчиваете заливку. Продолжить в еще не посещенной граничной вершине.

joojaa
источник
Я не знаком с алгоритмом заливки. Ваше объяснение кажется мне немного сложным. Не могли бы вы предоставить достойную ссылку, чтобы посмотреть? Спасибо.
mkocabas
Я получил решение, прочитав некоторые из них. Спасибо.
mkocabas
3

Я уже прокомментировал использование заливки и как она будет лучше, поскольку она более гибкая, но еще одно возможное решение - сканлайн. (Я говорю «возможно», потому что он делает много предположений о вашей геометрии, но для конкретного показанного набора и многих похожих будет работать.)

Для вашего примера с 3 точками: найдите вершину пересечения отрезка v1, v2 и линии, на которой лежит v3. (Вершина в верхнем левом углу v2) Мы назовем эту вершину v4.

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

введите описание изображения здесь

Это называется scanline, потому что (на изображении выше) вы идете вниз по красной и зеленой линиям одновременно, а затем по красной и синей линиям одновременно сканируете линии.

Это решение будет очень быстрым, если есть шаблон индекса, что часто имеет место. В противном случае потребуется вычисление, чтобы определить, какая соседняя вершина лежит на прямой.

Забавно, что отсканирование, барицентрическое тестирование (в ограничивающей рамке треугольника) и заливка заливкой - все это способы рисования треугольников в 3D-рендеринге.

Эндрю Уилсон
источник
2

Я думаю, что вы можете вычислить некоторые связанные с поверхностью барицентрические координаты для каждой точки на поверхности, а затем использовать их для проверки внутри или снаружи треугольника.

У меня нет точного алгоритма под рукой, но я нашел следующую статью, которая, кажется, обрабатывает именно такие координаты.

Барицентрические координаты на поверхностях

Dragonseel
источник
Спасибо за ответ и справочный документ. Я постараюсь реализовать предложенный метод.
mkocabas