Алгоритм: эффект буфера на линии / другие геометрические фигуры - PullRequest
2 голосов
/ 03 февраля 2012

Как создать буфер вокруг линий или любого типа геометрических фигур ?
Не заинтересован в доступных пакетах, таких как Shapely и т. Д., Но желает реализовать . enter image description here

Ответы [ 3 ]

4 голосов
/ 04 февраля 2012

Математически эта операция представляет собой сумму Минковского .Вы должны найти ссылку и некоторый псевдокод в хорошей книге по вычислительной геометрии.Попробуйте Вычислительная геометрия в C по O'Rourke или Вычислительная геометрия: алгоритмы и приложения по Berg et al.

3 голосов
/ 03 февраля 2012

Отредактировано: Это можно увидеть косвенным решением.Если вы можете иметь свои геометрические фигуры в виде изображения, то есть 2D-матрицы, то вы можете реализовать (см. Ниже) простые функции, такие как расширение / эрозия (довольно простые задания ядра) и т. Д., Чтобы окружающие области вокруг всех фигур (теперь пикселей) на вашем изображении,

Это так просто, как заниматься тяжелой математикой.Ниже показан эксперимент.Алгоритм прост:

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

Вот и все.

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

enter image description here

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

Углы видны как округленная форма круга.

enter image description here

0 голосов
/ 03 февраля 2012

здесь есть одно решение для расширения.

Используйте алгоритм рисования линий Брезенхема.

for each pixel <p> along the line.
check surrounding pixels and fill all pixels <p'> that have that have distance(p,p') < radius <r>.

radius r - это заранее определенный радиус круга, который вы хотите использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...