Алгоритмы заливки векторной графики?

Я работаю над простым приложением для рисования, и мне нужен алгоритм для заполнения заливки.
Рабочий процесс пользователя будет выглядеть так (подобно Flash CS, просто проще):

  1. пользователь рисует прямой строки в рабочей области. Они рассматриваются как векторы и могут быть выбраны и перемещены после их рисования.
  2. пользователь выбирает инструмент заливки и нажимает на область рисования. Если область окружена линиями во всех направлениях a заливка применяется к области.

Если строки перемещаются после применения заливки, область заливки изменяется соответствующим образом.

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

EDIT: изображение объяснения: (конечно, на холсте могут быть другие линии, которые не имеют значения для заполнения алгоритм)

enter image description here

EDIT2: более сложная ситуация:

enter image description here

EDIT3: я нашел способ заполнить полигоны отверстиями http://alienryderflex.com/polygon_fill/, теперь главный вопрос: как найти мои полигоны?

3 ответов


вы ищете алгоритм точки. Это не слишком сложно, но это не достаточно просто объяснить здесь. Там неплохо описаны в этой книге: http://www.cs.uu.nl/geobook/

когда я вернусь домой, я возьму свою копию книги и посмотрю, смогу ли я попробовать. Просто тебе нужно знать много деталей. Все это сводится к созданию DCEL ввода и поддержанию структуры данных по мере добавления или удаления строк. Любой запрос с помощью мыши coord просто вернет внутреннюю половину компонента, и те, в частности, содержат указатели на все внутренние компоненты, что именно то, что вы просите.

одна вещь, однако, заключается в том , что вам нужно знать пересечения на входе (потому что вы не можете построить трапециевидную карту, если у вас есть пересекающиеся линии), и если вам это сойдет с рук (т. е. вход достаточно мало сегментов), я настоятельно рекомендую вам просто использовать наивный алгоритм O(n2) (простой, кодируемый и тестируемые менее чем за 1 час). Алгоритм O (N log n) занимает несколько дней, чтобы кодировать и использовать умную и очень нетривиальную структуру данных для статуса. Однако это также упоминается в книге, поэтому, если вы чувствуете, что справитесь с задачей, у вас есть 2 причины ее купить. Это действительно хорошая книга по геометрическим проблемам в целом, поэтому только по этой причине любой программист, интересующийся алгоритмами и структурами данных, должен иметь копию.


попробуйте это:

http://keith-hair.net/blog/2008/08/04/find-intersection-point-of-two-lines-in-as3/

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

конечно, порядок точек будет значительным, если вы планируете их заполнять - это может быть сложнее!


С ActionScript вы можете использовать beginFill и endFill, например,

pen_mc.beginFill(0x000000,100);
pen_mc.lineTo(400,100);
pen_mc.lineTo(400,200);
pen_mc.lineTo(300,200);
pen_mc.lineTo(300,100);
pen_mc.endFill();

http://www.actionscript.org/resources/articles/212/1/Dynamic-Drawing-Using-ActionScript/Page1.html

Flash CS4 также вводит поддержку путей:

http://www.flashandmath.com/basic/drawpathCS4/index.html

Если вы хотите сойти с ума и кодировать свой собственный заливки, то Википедия имеет приличная грунтовка, но я думаю это было бы изобретением атома для этих целей.