Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: nafanya от Ноябрь 18, 2009, 00:55



Название: Заливка
Отправлено: nafanya от Ноябрь 18, 2009, 00:55
Пишу графические редактор, рисую с помощью КуПейнтера.
Имеется изображение QImage, необходимо сделать заливку (ну как в  пейнте и других редакторах).

//Поясняю: нарисуем несколько линий, пусть из них получится некая замкнутая фигура(или неочень замкнутая)), потом тыкаем внутрь него мышкой и хотим чтоб этот контур залился цветом))
Как это лучше организовать?
Может быть у кого сохранилась функция?

ЗЫ:Кажется должен быть какойнить рекурсивный алгоритм.. Ничего готового (у QPainter и пр.)) не нашел)..


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 18, 2009, 15:05
Думаю алгоритмы ты должен продумывать сам.
ПС. А вообще задачка хорошая..


Название: Re: Заливка
Отправлено: Igors от Ноябрь 18, 2009, 15:11
//Поясняю: нарисуем несколько линий, пусть из них получится некая замкнутая фигура(или неочень замкнутая)), потом тыкаем внутрь него мышкой и хотим чтоб этот контур залился цветом))
Как это лучше организовать?
Может быть у кого сохранилась функция?

ЗЫ:Кажется должен быть какойнить рекурсивный алгоритм.. Ничего готового (у QPainter и пр.)) не нашел)..
QGraphicsPolygonItem


Название: Re: Заливка
Отправлено: nafanya от Ноябрь 19, 2009, 13:38
QGraphicsPolygonItem ваще не то. ты что не читал вопрос?


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 14:05
Странно что непонятно, в букваре даже картинка есть

//Поясняю: нарисуем несколько линий, пусть из них получится некая замкнутая фигура(или неочень замкнутая)),
Эта "некая фигура" называется "полигон"

потом тыкаем внутрь него мышкой и хотим чтоб этот контур залился цветом))
Выбор/заливка примитива - задача QGraphicsItem (в данном случае QGraphicsPolygonItem)


Название: Re: Заливка
Отправлено: lit-uriy от Ноябрь 19, 2009, 14:09
QGraphicsItem используется в графическом представлении, а он использует QPainter.


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 14:28
QGraphicsItem используется в графическом представлении, а он использует QPainter.
Так пусть посмотрит исходник QGraphicsPolygonItem и скопирует 2 строчки

painter->drawPolygon
clipPath().contains


Название: Re: Заливка
Отправлено: ufna от Ноябрь 19, 2009, 14:37
для этого нужно этот полигон вначале найти, а это тоже еще та задачка. Ведь мы же берем картинку, на которой чего угодное есть, и нужно закрасить область, имеющую границы, которые есть "тупо не цвет клика". Вообще, в самом простом варианте - это попиксельный перебор ))


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 15:17
для этого нужно этот полигон вначале найти, а это тоже еще та задачка. Ведь мы же берем картинку, на которой чего угодное есть, и нужно закрасить область, имеющую границы, которые есть "тупо не цвет клика". Вообще, в самом простом варианте - это попиксельный перебор ))
Человек пояснил:
нарисуем несколько линий, пусть из них получится некая замкнутая фигура(или неочень замкнутая))
Из этого следует что полигон он имеет, каким образом - его проблемы

По поводу заливок и.т.п. (то есть если нет полигона). OS (а значит и Qt) поддерживает эти операции с помощью region (регионов). Вот примерно как звучит определение региона в библии Mac (перевод мой  :))

Регион - это то что делит все пиксели экрана на 2 подмножества: те, которые входят в регион и те которые в него не входят. Существуют ограничения на сложность региона и.т.д.

Ну а с перебором по пикселю здесь не прорваться, это точно  :)


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 19, 2009, 20:18
Ну а с перебором по пикселю здесь не прорваться, это точно  :)
Да легко.


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 20:42
Ну а с перебором по пикселю здесь не прорваться, это точно  :)
Да легко.
Ну если море по колено - это всегда радует :) Хорошо, есть 3 точки заданные в пикселях (x, y). Залейте этот треугольник прямым перебором. За неделю справитесь? Или это была просто "соленая шутка"?  :) 


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 19, 2009, 20:51
Ну а с перебором по пикселю здесь не прорваться, это точно  :)
Да легко.
Ну если море по колено - это всегда радует :) Хорошо, есть 3 точки заданные в пикселях (x, y). Залейте этот треугольник прямым перебором. За неделю справитесь? Или это была просто "соленая шутка"?  :) 
Так "этот треугольник" или "три точки" заливать?
"три точки" я те залью и на коленке :)))
Все кроме "три точки" я тебе тоже залью "на коленке"
Треугольник - тоже легко, если замкнутый.
А вот все остальное, это уже рекурсивный обход...


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 21:12
Так "этот треугольник" или "три точки" заливать?
"три точки" я те залью и на коленке :)))
Все кроме "три точки" я тебе тоже залью "на коленке"
Треугольник - тоже легко, если замкнутый.
А вот все остальное, это уже рекурсивный обход...
Это треугольник который задан 3-мя точками. Еще упростим задачу - все точки видимы (отсечек по экрану нет) и не лежат на одной прямой (треугольник имеет площадь). Где будете заливать (на коленке или еще где) - не имеет значения. Можете использовать исходники Qt или любые другие. Сможете? Или "хвалилася кобила як вiз з горшками побила"  :)


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 19, 2009, 21:24
Так "этот треугольник" или "три точки" заливать?
"три точки" я те залью и на коленке :)))
Все кроме "три точки" я тебе тоже залью "на коленке"
Треугольник - тоже легко, если замкнутый.
А вот все остальное, это уже рекурсивный обход...
Это треугольник который задан 3-мя точками. Еще упростим задачу - все точки видимы (отсечек по экрану нет) и не лежат на одной прямой (треугольник имеет площадь). Где будете заливать (на коленке или еще где) - не имеет значения. Можете использовать исходники Qt или любые другие. Сможете? Или "хвалилася кобила як вiз з горшками побила"  :)
Нет проблем, но баш на баш.
Поможешь разобраться как вот эту хрень (http://gmplib.org/) скомпилировать и подключить к проекту на Qt под мингву, займусь алгоритмом. А нет так нет.


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 21:46
Нет проблем, но баш на баш.
Поможешь разобраться как вот эту хрень (http://gmplib.org/) скомпилировать и подключить к проекту на Qt под мингву, займусь алгоритмом. А нет так нет.
Алексей, в мои планы не входит "что-то с Вас поиметь" - просто все те "заливки" входят в мою специальность/работу. Поэтому я знаю - если человек сможет это сделать с нуля за неделю - он хороший программист. Вы сказали "легко" - отвечайте за свои слова или воэьмите их взад :) Я не заявлял что могу откомпилить все что хошь под MinGW - "я умею делать только то что я умею делать" :)


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 19, 2009, 22:08
Нет проблем, но баш на баш.
Поможешь разобраться как вот эту хрень (http://gmplib.org/) скомпилировать и подключить к проекту на Qt под мингву, займусь алгоритмом. А нет так нет.
Алексей, в мои планы не входит "что-то с Вас поиметь" - просто все те "заливки" входят в мою специальность/работу. Поэтому я знаю - если человек сможет это сделать с нуля за неделю - он хороший программист. Вы сказали "легко" - отвечайте за свои слова или воэьмите их взад :) Я не заявлял что могу откомпилить все что хошь под MinGW - "я умею делать только то что я умею делать" :)
если не можешь решить мою проблему, то мне нет резона тратить свое время. Халява тут не катит. Если уж жилишь, так от других не требуй.


Название: Re: Заливка
Отправлено: Igors от Ноябрь 19, 2009, 22:23
если не можешь решить мою проблему, то мне нет резона тратить свое время. Халява тут не катит. Если уж жилишь, так от других не требуй.
Позвольте, батенька, но ведь Вы только что говорили "легко", "на коленке" - а теперь вспоминаете про резоны и свое время :)  Никакого корыстного интереса/халявы здесь не имею - просто покажите всем как оно "легко" - или нечего трепаться  :)


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 19, 2009, 22:46
если не можешь решить мою проблему, то мне нет резона тратить свое время. Халява тут не катит. Если уж жилишь, так от других не требуй.
Позвольте, батенька, но ведь Вы только что говорили "легко", "на коленке" - а теперь вспоминаете про резоны и свое время :)  Никакого корыстного интереса/халявы здесь не имею - просто покажите всем как оно "легко" - или нечего трепаться  :)
Не позволю :) Кто чего там ошибочно думает насчет моего "легко", что типа это было сказано как синоним "пару десятков строк кода и сейчас выложу" он конкретно ошибается.
Мое легко в данном случае надо расшифровывать так: "Я представляю себе алгоритм заливки при работе с матрицей пикселов и написать его не представляется проблемой".  Тяжело для меня, это когда я не врубаюсь как это делать. Если мои трудозатраты окупятся, готов выложить алгоритм. Если никто не готов, то нефиг.


Название: Re: Заливка
Отправлено: Shilo от Ноябрь 20, 2009, 10:42
Не стоит изобретать вылосипед.

http://www.antigrain.com/


Название: Re: Заливка
Отправлено: Igors от Ноябрь 20, 2009, 11:15
Мое легко в данном случае надо расшифровывать так: "Я представляю себе алгоритм заливки при работе с матрицей пикселов и написать его не представляется проблемой".  Тяжело для меня, это когда я не врубаюсь как это делать. Если мои трудозатраты окупятся, готов выложить алгоритм. Если никто не готов, то нефиг.
Это другой разговор. Конечно, можно сделать но приложить усилия придется. Так что не надо дезориентировать общественность небрежно кидая "да легко" :)

Не стоит изобретать вылосипед.
Ну это перебор в другую сторону. По-моему если такая задача возникла (это бывает редко) надо посидеть и написать а не изыскивать/прикручивать нечто. Время то же а пользы больше


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 25, 2009, 00:18
вот тут есть уже готовый паинт
http://www.kolourpaint.org/download.html


Название: Re: Заливка
Отправлено: mal от Ноябрь 25, 2009, 21:18
Странно, что  никто не  подсказал автору темы про алгоритм заполнения с затравкой.
Есть замкнутая область, есть затравочный пиксел...По-моему тот самый случай.
Д.Роджерс "Алгоритмические основы машинной графики" п.2.22, 2.23, 2.24 тебе в помощь автор.
Ну или любую другую литературу покури на этот счет.
Как сказал Igors - за неделю такой код вполне можно реализовать с нуля.
удачи  ;)


Название: Re: Заливка
Отправлено: Igors от Ноябрь 25, 2009, 21:55
(За)травка тут ни при чем :) Заполнение треугольника ничем не отличается от заполнения N-угольника. Алгоритм такой

- (самое трудное) чистим полигон, если есть пересечения или внутренние углы > 180 - разбиваем на несколько "нормальных" (конвексных) полигонов и заливаем каждый

- находим точки с min_Y и max_Y. Идем сверху вниз. Начинаем с 1 (или 2) верхних точек и заканчиваем в 1 (или 2) нижних точках. На каждом шаге вычисляем x_left и x_right "спускаясь" по левому и правому краям и заливаем от (x_left, y) до (x_right, y)

Разумеется, нет нужды всем этим заниматься если можно использовать drawPolygon или базовую графику OC. 


Название: Re: Заливка
Отправлено: mal от Ноябрь 25, 2009, 22:19
область может быть любой формы - возьмем контур берега озера к примеру. Я не парюсь в этом случае с полигонами, а использую затравку для заливки.  :)


Название: Re: Заливка
Отправлено: Igors от Ноябрь 25, 2009, 22:33
область может быть любой формы - возьмем контур берега озера к примеру. Я не парюсь в этом случае с полигонами, а использую затравку для заливки.  :)
Ну если есть маска/цвет - то жить намного проще :)


Название: Re: Заливка
Отправлено: panAlexey от Ноябрь 26, 2009, 01:09
область может быть любой формы - возьмем контур берега озера к примеру. Я не парюсь в этом случае с полигонами, а использую затравку для заливки.  :)
Ну если есть маска/цвет - то жить намного проще :)
конечно проще, это же не векторный редактор.


Название: Re: Заливка
Отправлено: BigZ от Ноябрь 26, 2009, 09:47
http://www.ad.cctpu.edu.ru/Personal/Anton/ZHtml/CompGraph/idz%5CFill%5CFill.htm
http://skyfamily.ru/sprav/string/algoritm/
http://ermak.cs.nstu.ru/kg_rivs/graf05.htm

Google + алгоритм заливки области