Алгоритм 2D уровня детализации (LOD)
Я искал в сети алгоритм, который позволяет вам создавать представления уровня детализации (LOD) 2D-полигонов, но не может найти ЛЮБУЮ достойную ссылку. Возможно, я использую неправильные условия поиска, но все результаты поиска относятся к алгоритмам 3D LOD, которые, я думаю, не могут (?) Действительно применяться в 2D.
Я уверен, что до наступления трехмерной графики многие люди работали бы над алгоритмами 2D LOD. Любые подсказки или указатели, где я могу получить больше информации? Спасибо!
2 ответа
Помимо очевидного глупого алгоритма, который должен был бы брать каждую N-ую вершину из многоугольника (уменьшая число вершин на N), здесь есть идея, вдохновленная некоторыми 3D-алгоритмами.
Обычно в 3D требуется удалить грани, которые вносят меньший вклад в общий объем. Для этого мы постараемся упростить "самые плоские" участки модели.
Теперь в 2D вы можете перевести это, чтобы "упростить сегменты, которые имеют наименьший угол между ними. Первой наивной реализацией может быть:
- Вычислить все углы между отрезками Si и Si+1 многоугольника
- Возьмите все углы ниже заданного порога (или возьмите М наименьших углов)
- Упростим сегменты, которые мы определили в 2. (замените [Pi, Pi+1] и [Pi+1, Pi+2] на [Pi, Pi+2])
- Повторяйте от 1. до тех пор, пока мы не уменьшим наш полигон
Конечно, это не оптимально, но это должна быть хорошая сделка между качеством и скоростью. Вместо угла можно взять минимальное расстояние между средней точкой двух сегментов (Pi+1) и потенциально упрощенным сегментом ([Pi, Pi+2])
Редактировать:
Я бы попробовал другой алгоритм, если бы мне не нужно было слишком много производительности:
- Рассмотрим исходные вершины многоугольника как контрольные точки сплайна Кэтмалла-Рома.
- Тесселяйте этот сплайн в нужном количестве точек
Наконец, я нашел для вас исходный код по этой ссылке: http://motiondraw.com/md/as_samples/t/LineGeneralization/demo.html, а также соответствующие алгоритмы: http://www.geom.unimelb.edu.au/gisweb/LGmodule/LGSimplification.htm
Найдите алгоритм Дугласа-Пекера, который используется для упрощения полилиний, но может быть расширен для поддержки многоугольников. Это то, что я использовал. Существуют также топологически стабильные расширения, если вам это нужно.