Помимо очевидного глупого алгоритма, который должен был бы брать каждую 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