Случайное возмущение конечных точек коллинеарного ребра
Алгоритм "расщепления ушей" страдает от поломки в случае многоугольников, у которых ребра коллинеарны.Как вы можете видеть в 5-точечной звезде, все ребра имеют эту проблему.
Простой «патч» может спасти алгоритм триангуляции «расщепления ушей»:
1) Перед началом триангуляции проверьте список ребер полигона (в виде LineSegs) на наличие любой пары ребер, которыеиспользовать одну и ту же 2D расширенную линию.Примените небольшое случайное возмущение к обоим конечным точкам любого такого ребра (например, в диапазоне -0,001 .. + 0,001.) Сохраните исходные местоположения этих вершин, чтобы они могли быть восстановлены после триангуляции.
2) Теперь вы можете запустить триангуляцию с разделением ушей, удалив плохо обусловленную ситуацию коллинеарных ребер.
3) Отменить возмущения, которые вы применили к вершинам.
Я проверял этоподход, и он работает отлично.Это может показаться чем-то вроде взлома, но это, безусловно, самый простой способ спасти триангуляцию с разделением ушей от ее наиболее заметного недостатка.Случайные возмущения хотят быть крошечными по сравнению с координатами местоположения в вашем приложении, но огромными по сравнению с конечной математикой EPSILON, которую вы используете для сравнения действительных чисел на равные.