Сглаживание краев с сохранением таких особенностей, как углы - PullRequest
4 голосов
/ 25 ноября 2011

Я пытаюсь сгладить края многоугольника. Это для картографического приложения, которое позволяет пользователю увеличивать и уменьшать масштаб. При большом увеличении мне не нужны все детали, поэтому я сглаживаю многоугольник, чтобы уменьшить количество точек. Я просто перебираю все точки и удаляю любую точку, которая находится на расстоянии X от последней. Где X соответствует 1 пикселю на получающемся экране.

Кажется, что это прекрасно работает, за исключением нескольких случаев. Например, если пользователь увеличивает масштаб, я увеличиваю вектор, одновременно загружая детали асинхронно. Пока загружается дополнительная деталь, пользователь видит что-то похожее на изображение ниже:

Enlarged vector image showing the problem

У угловых векторных многоугольников их углы несколько случайно закруглены.

То, что я ищу, - это плавный алгоритм или алгоритм изменения размера, который уменьшит количество точек для рисования многоугольника, сохраняя при этом некоторые функции, такие как углы.

Ответы [ 2 ]

3 голосов
/ 26 ноября 2011

Может быть, вы могли бы использовать что-то вроде алгоритма Дугласа-Пекера .

Его можно использовать для упрощения ломаных линий, удаляя точки, которые не меняют общую форму "тожемного "(где значение допуска контролирует, что означает" слишком много ").

Я ожидал бы, что это удалит точки вдоль части прямой линии ломаной линии, оставляя при этом острые элементы(как углы) нетронутыми.

Надеюсь, это поможет.

1 голос
/ 26 ноября 2011

Вы можете проверить угол, образованный двумя линиями по обе стороны от точки, и удалить точку только в том случае, если угол меньше указанного порога.

...