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

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

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

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

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

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

enter image description here

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

enter image description here

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

Ответ 1

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

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

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

Ответ 2

Попробуйте следующее:

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

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

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

Ответ 3

С помощью 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

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