Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Алгоритм заливки? (http://www.flasher.ru/forum/showthread.php?t=130164)

MoHaX 20.09.2009 01:55

2GFreemen
Чем тебя не устраивает работа метода beginFill?

Код AS3:

graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(10,10,10);
graphics.endFill();


Obi 20.09.2009 09:23

Угу, и чего будем заливать у пяти пересекающихся кругов и трех линий вашим drawCircle?

GFreemen 20.09.2009 11:23

Цитата:

Сообщение от Dimax4d (Сообщение 852122)
Можно рисовать векторно, отобразить это все в BitmapData, а потом залить на ней и сделать эту BitmapData как подложку

Cпасибо за совет. Продумаю эту тему...

Добавлено через 3 минуты
Цитата:

Сообщение от MoHaX (Сообщение 852129)
2GFreemen
Чем тебя не устраивает работа метода beginFill?

Код AS3:

graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(10,10,10);
graphics.endFill();


Собственно говоря заливать-то beginFill-ом и буду, но, как правильно сказал Obi, надо же знать, что заливать...

flash33 20.09.2009 12:22

Сама формулировка вопроса -= "заливка векторной фигуры" - неверна :) Залить можно растр по факту его существования, а в векторе это параметр рисования во время его рисования :) Что вы заливать то хотите? Не нарисованную фигуру? :D

dump13 20.09.2009 13:06

GFreemen, чтобы определить, находится ли точка внутри векторной фигуры, нужно саму фигуру разбить на треугольники и для каждого треугольника определить, находится ли точка внутри него. Последнее делается очень просто (с помощью векторного произведения), см. пример: http://www.blackpawn.com/texts/pointinpoly/default.html

MoHaX 20.09.2009 20:46

Вложений: 2
2Obi
Код AS3:

graphics.lineStyle(1,0x0);
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(100,100,100);
graphics.drawCircle(150,100,100);
graphics.drawCircle(100,150,100);
graphics.drawCircle(100,200,100);
graphics.drawCircle(120,150,100);
graphics.endFill();
 
graphics.lineStyle(1,0x0);
graphics.beginFill(0xFF0000,0.5);
graphics.moveTo(250,250);
graphics.lineTo(250,350);
graphics.lineTo(290,380);
graphics.lineTo(210,250);;
graphics.endFill();

получиться то что в картинке 1.

2dump13
Проще разбить фигуру на отрезки, построить вектор из точки. и посчитать сколько отрезков он пересек. если четное количество то мы снаружи фигуры, если нет то внутри.
Картинка 2

Felicast 21.09.2009 10:36

а так не пробовали?
Код AS3:

graphics.lineStyle(1,0x0);
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(100,100,100);
graphics.endFill();
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(150,100,100);
graphics.endFill();
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(100,150,100);
graphics.endFill();
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(100,200,100);
graphics.endFill();
graphics.beginFill(0xFF0000,0.5);
graphics.drawCircle(120,150,100);
graphics.endFill();


GFreemen 22.09.2009 23:46

Cпасибо всем за помощь.
отвечаю.
1. что такое "заливка векторной фигуры" - пользователь инструментом Линия нарисовал n линий, после этого взял инструмент Заливка и ткнул им в любой точке экрана. (если не верите что такое может быть проверьте в самом флеше - вполне реально)
2. Насчет векторной фигуры. Поьзователь все сделал по пункту 1. Как алгоритмом проверить замкнутую фигуру он нарисовал или нет?
3. Насчет четного/нечетного кол-ва пересечений. А если внутри этой фигуры будет еще одна фигура которую заливать не надо? как с ней поступать.

Вот так, чем больше читал тем больше вопросов появляется. В общем тут надо привлекать не програмиста а математика.
У меня же идея такая: реализовать инструмент заливка не кликом в одну точку, а чтобы пользователь ставил несколько узловых точек и по этому полигону заливать.
Скажем так: дешево и сердито. А главное быстро.

SamFR 23.09.2009 03:59

Метод BitmapData.floodFill как раз для этого подойдёт, как вам уже говорили. Рисуем линии векторно, отрисовываем всё это дело в BitmapData с помощью BitmapData.draw и далее floodFill в той точке, по которой пользователь кликнул.

wvxvw 23.09.2009 04:12

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

Т.е. пример, была у вас вертикальная линия: | и горизонтальная -- при пересечении получилось:
░░|░░
---.---
░░|░░
(4 отрезка)
В таком случае для того, чтобы обаружить замкнутый контур нужно будет:
1. найти близжайшую линию к месту, где кликнули и следуя начало линии -> конец линии -> начало следующей линии -> и так пока либо не будет следующего начала, либо линия уже 1 раз встречалась за время перебора.
В первом варианте - естественно, ничего не заливаем, во втором - у вас уже будут все нужные вам вершины для того, чтобы нарисовать многоугольник.


Часовой пояс GMT +4, время: 13:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.