Почему Triangle.Net не выполняет триангуляцию этих полигонов, как ожидалось?

У меня были проблемы с триангуляцией определенных полигонов с отверстиями с помощью Triangle.Net.

Проблема, по-видимому, заключается в определенных обстоятельствах, когда я определяю отверстие, используя контур и устанавливая для отверстия значение «истина» (после первого добавления внешнего контура для отверстия установлено значение «ложь»). Polygon.Add(contour, true);

Затем Triangle.Net находит точку внутри этой дыры через Point.FindInteriorPoint и по непонятным мне причинам иногда находит точку, которая находится на самом краю этой дыры, и в результате триангулируется только дыра, остальное полигона игнорируется.

Так например. Два многоугольника с одинаковыми внешними контурами:

(3.5, 3.5), (-2.5, 3.5), (-2.5 -0.5), (-4.5, -0.5), (-4.5, -2.5), (3.5, -2.5) Изображение1

Но у одного есть отверстие, определенное как этот контур:

(2.5, 2.5), (2.5, 0.5), (0.5, 2.5)

и отверстие установлено в true. Внутренняя точка этой дыры оказывается (1.5, 2.5), которая находится прямо на границе. В результате внешний многоугольник не триангулирован, а отверстие триангулировано. Результат

Другой имеет отверстие определяется как этот контур:

(0.5, 2.5), (2.5, 2.5), (2.5, 0.5)

и отверстие установлено в true. Внутренняя точка этой дыры оказывается (2, 2), которая точно находится посередине. В результате внешний многоугольник правильно триангулирован с правильно вырезанным отверстием. Результат

Они оба имеют одинаковое направление контура, поэтому я не знаю, почему один работает нормально, а другой нет. Если я укажу первый многоугольник с точкой внутри многоугольника как (2, 2) вместо того, чтобы просто установить для отверстия значение «true», тогда весь многоугольник будет правильно триангулирован. Так что я был совершенно уверен, что проблема, похоже, кроется в том, чтобы найти собственную точку внутри контура отверстия.

Но чтобы сделать ситуацию еще более запутанной, я использовал более простой внешний многоугольник, такой как этот:

(3.5, 3.5), (-2.5, 3.5), (-2.5, -2.5), (3.5, -2.5) Изображение2

Затем я могу определить отверстие точно так же, как в первой версии, и все работает нормально, хотя внутренняя точка оказывается равной (1.5, 2.5). Так что теперь я думаю точка на краю не проблема.

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


person Mark C    schedule 15.05.2020    source источник


Ответы (1)


Здесь происходят две разные вещи, и вместе это делает поведение запутанным.

Первая проблема связана с поведением FindInteriorPoint. Этот метод имеет некоторые проблемы с надежностью и может находить точки, которые находятся на границе контура. Я подозреваю, что вы не используете это ответвление Triangle.NET, которое содержит некоторые улучшения надежности, которые должны дать хорошие результаты, особенно в этих простых случаях.

Теперь, если вы укажете дыру, используя точку, которая находится на границе дыры, что, как мы ожидаем, произойдет? Ответ в том, что результаты случайны/непредсказуемы. Треугольник находит треугольник в окончательной сетке, содержащей точку, идентифицированную как отверстие, и удаляет все треугольники, с которыми он соединен, не пересекая какие-либо ограниченные сегменты. Какая сторона (с использованием точной арифметики) зависит от точных координат конечных точек подсегмента в сетке, которые для уточненной сетки будут зависеть от округления, которое происходит при вычислении вставленных дополнительных вершин. В вашем случае нет уточнения, поэтому местоположение действительно находится точно на сегменте. Треугольник идет от начальной точки к месту расположения отверстия, пока не найдет треугольник, содержащий точку отверстия: произвольное расположение начальной точки определяет, какую сторону он достигнет первой и в конечном итоге выберет. Таким образом, если у вас есть другой окружающий домен, вы получаете другую (произвольную) начальную точку и можете получить другой результат.

person Alex    schedule 17.05.2020