У меня были проблемы с триангуляцией определенных полигонов с отверстиями с помощью 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)
. Так что теперь я думаю точка на краю не проблема.
Я немного потерялся сейчас. Я действительно не знаю, что я делаю неправильно или где искать. Мы ценим любые предложения. Спасибо.