Алгоритмы заливки векторной графики?
Я работаю над простым приложением для рисования, и мне нужен алгоритм для заполнения заливки.
Рабочий процесс пользователя будет выглядеть так (подобно Flash CS, просто проще):
- пользователь рисует прямой строки в рабочей области. Они рассматриваются как векторы и могут быть выбраны и перемещены после их рисования.
- пользователь выбирает инструмент заливки и нажимает на область рисования. Если область окружена линиями во всех направлениях a заливка применяется к области.
Если строки перемещаются после применения заливки, область заливки изменяется соответствующим образом.
У кого есть хорошая идея, как реализовать такой алгоритм? Основная задача состоит в том, чтобы определить сегменты линии, окружающие точку. (и сохраняя эту информацию каким-то образом, если строки перемещаются)
EDIT: изображение объяснения: (конечно, на холсте могут быть другие линии, которые не имеют значения для заполнения алгоритм)
EDIT2: более сложная ситуация:
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
Если вы хотите сойти с ума и кодировать свой собственный заливки, то Википедия имеет приличная грунтовка, но я думаю это было бы изобретением атома для этих целей.