Растровый алгоритм закраски замкнутой области
От: debjet Россия  
Дата: 12.08.03 06:55
Оценка:
Подскажите как залить произвольную замкнутую область, если не известна ни одна точка внутри этой области и область состои не из отрезков, а просто набор точек? Точнее мне хочется узнать можно ли, как-нибудь залить эту область, не находя точки внутри этой области и не разбивая границу области на отрезки?
Желаю удачи!!!
Re: Растровый алгоритм закраски замкнутой области
От: maloyDS Россия  
Дата: 12.08.03 07:57
Оценка:
Здравствуйте, debjet, Вы писали:

D>Подскажите как залить произвольную замкнутую область, если не известна ни одна точка внутри этой области и область состои не из отрезков, а просто набор точек? Точнее мне хочется узнать можно ли, как-нибудь залить эту область, не находя точки внутри этой области и не разбивая границу области на отрезки?


Не совсем понял, как может область замкнутой, но при этом состоять из точек?
1. Либо из этих точек формируется отрезки.
2. Либо эти точки соединяются последовательно и получается замкнутая область.
Точку ИМХО можно и не находить, достаточно знать одну из пограничных точек.
Насчёт алгоритма посмотри статью на www.codenet.ru, по-моему, раздел Алгоритмы. Статья называется, что-то про волновой метод нахождения кратчайшего пути, там алгоритм для нахождения пути в стратегиях, но (кстати, об этом говорит и автор) немного его модифицировав можно использовать для закраски замкнутой области.
Если сам не разберёшься, пиши постараюсь помочь.
... << RSDN@Home 1.1 beta 1 >>
Re: Растровый алгоритм закраски замкнутой области
От: retalik www.airbandits.com/
Дата: 12.08.03 08:15
Оценка:
Здравствуйте, debjet, Вы писали:

D>Подскажите как залить произвольную замкнутую область, если не известна ни одна точка внутри этой области и область состои не из отрезков, а просто набор точек? Точнее мне хочется узнать можно ли, как-нибудь залить эту область, не находя точки внутри этой области и не разбивая границу области на отрезки?


Формулировка довольно туманна. Что значит "область состои не из отрезков, а просто набор точек"? Если граница области состоит из точек одного цвета (вариант: состоит из точек цвета, отличного от цвета закрашиваемой области), то есть довольно простой алгоритм. Но для него необходимо знать хотя бы одну точку внутри закрашиваемой области. Это примерно как в графическом редакторе: для заливки нужно кликнуть куда-нибудь инструментом "заливка". Если неизвестно ни одной точки, то вообще неясно, что заливать.
псевдокод:


void fill(int x, int y, int color)
{
  // если точка внутри области
  if(get_color(x,y)!= color)
  {
    // закрашиваем точку
    set_color(x, y, color);
    // находим соседей (рекурсивно)
    fill(x-1, y, color);
    fill(x, y+1, color);
    fill(x+1, y, color);
    fill(x, y-1, color);
  }
}


Получается рекурсия, и точки проверяются по несколько раз. Это можно устранить, организуя заливку по скан-линиям. То есть можно на каждой подходящей точке сразу заливать влево и вправо "до упора". А когда встретилась граница, добавлять ее координаты в список для последующей обработки.

Если не ошибаюсь, метод описан в книге Роджерса, "Алгоритмические основы машинной графики".
Примерно так работает FloodFill.
Успехов,
Виталий.
Re: Растровый алгоритм закраски замкнутой области
От: debjet Россия  
Дата: 12.08.03 08:51
Оценка:
Ситуация такая:

Мне значит дают матрицу допустим например такую:



0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 1 0 0 0 1 0 0 0
0 1 0 0 1 1 0 0 0 0
0 1 0 0 1 0 0 0 0 0
0 1 0 0 1 1 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 0 0 0 1 0 0
0 0 1 0 1 1 1 0 0 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0


в этой матрице значение [0, 1]. 1 — соответственно граница области которую нужно закрасить(область замкнута — это известно). Задача состоит в том чтобы закрасить область ограниченную 1-цами. Как вы понимаете точку внутри этой области мне не дают и отрезков у меня никаких нету. единственное только мне известны две точки на границе области.
Желаю удачи!!!
Re[2]: Растровый алгоритм закраски замкнутой области
От: maloyDS Россия  
Дата: 13.08.03 15:46
Оценка:
Здравствуйте, debjet, Вы писали:

D>Ситуация такая:


D>Мне значит дают матрицу допустим например такую:



D>

D>0 0 0 0 0 0 0 0 0 0
D>0 0 0 0 0 0 0 0 0 0
D>0 0 0 1 1 1 1 0 0 0
D>0 0 1 0 0 0 1 0 0 0
D>0 1 0 0 1 1 0 0 0 0
D>0 1 0 0 1 0 0 0 0 0
D>0 1 0 0 1 1 1 1 0 0
D>0 0 1 0 0 0 0 1 0 0
D>0 0 0 1 0 0 0 1 0 0
D>0 0 1!0!1 1 1 0 0 0
D>0 1 1 1 0 0 0 0 0 0
D>0 0 0 0 0 0 0 0 0 0

D>


А ты уверен, что по диагонали ограничивать можно, например, в твоём рисунке не понятно считать ли 0 отмеченный ! в области, т.к. он находится за непрерывной диагональю из 1.
... << RSDN@Home 1.1 beta 1 >>
Re: Растровый алгоритм закраски замкнутой области
От: m.a.g. Мальта http://dottedmag.net/
Дата: 14.08.03 00:58
Оценка:
Здравствуйте, debjet, Вы писали:

D>Подскажите как залить произвольную замкнутую область, если не известна ни одна точка внутри этой области и область состои не из отрезков, а просто набор точек? Точнее мне хочется узнать можно ли, как-нибудь залить эту область, не находя точки внутри этой области и не разбивая границу области на отрезки?


Если гарантируется, что область замкнута, то можно попробовать следующую схему: взять рядом с произвольной точкой границы два пикселя и проверить, какой из них лежит внутри. Алгоритм проверки смотри в этом форуме. После этого залить область, пользуя найденный внутренний пиксел, как затравку.
... << RSDN@Home 1.1 beta 1 >>
Re[2]: Растровый алгоритм закраски замкнутой области
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 14.08.03 17:21
Оценка:
Здравствуйте, debjet, Вы писали:

D>Ситуация такая:


D>

D>0 0 0 0 0 0 0 0 0 0
D>0 0 0 0 0 0 0 0 0 0
D>0 0 0 1 1 1 1 0 0 0
D>0 0 1 0 0 0 1 0 0 0
D>0 1 0 0 1 1 0 0 0 0
D>0 1 0 0 1 0 0 0 0 0
D>0 1 0 0 1 1 1 1 0 0
D>0 0 1 0 0 0 0 1 0 0
D>0 0 0 1 0 0 0 1 0 0
D>0 0 1 0 1 1 1 0 0 0
D>0 1 1 1 0 0 0 0 0 0
D>0 0 0 0 0 0 0 0 0 0

D>


Идешь по каждой строке матрицы (слева на право, например) и анализируешь изменение текущего символа, по сравнению с предыдущим (для самого левого — предыдущий символ =0 ). После смены '1' -> '0' меняешь все 0 на 1, пока не встретишь смену '0'->'1'. После этого снова ждешь 1->0, и так до конца строки. То же для остальных строк.

Можно идти и по столбцам, не мне как-то непривычно...
Re[3]: Нехорошо я написал...
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 14.08.03 17:32
Оценка:
DS>... После этого снова ждешь 1->0, и так до конца строки. ...
На самом деле первая смена 1->0 бедет означать незаполненную область. Ждать надо вторую.
Re[3]: Растровый алгоритм закраски замкнутой области
От: maloyDS Россия  
Дата: 14.08.03 17:55
Оценка:
Я тоже так думал, а как же быть со следующим моментом?
0 0 0 0 0 0 0 0 0 0
0 0
0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0
1 0 0 0 1 0 0 0
0 1 0 0 1 1 0 0 0 0 <- с вот этой строкой
0 1 0 0 1 0 0 0 0 0
0 1
0 0 1 1 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 0
0 1 0 0 0 1 0 0
0 0 1 0 1 1 1 0 0 0
0 1
1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
... << RSDN@Home 1.1 beta 1 >>
Re[4]: Растровый алгоритм закраски замкнутой области
От: debjet Россия  
Дата: 15.08.03 09:20
Оценка:
Здравствуйте, maloyDS, Вы писали:

DS>Я тоже так думал, а как же быть со следующим моментом?

DS>0 0 0 0 0 0 0 0 0 0
DS>0 0 0 0 0 0 0 0 0 0
DS>0 0 0 1 1 1 1 0 0 0
DS>0 0 1 0 0 0 1 0 0 0
DS>0 1 0 0 1 1 0 0 0 0 <- с вот этой строкой
DS>0 1 0 0 1 0 0 0 0 0
DS>0 1 0 0 1 1 1 1 0 0
DS>0 0 1 0 0 0 0 1 0 0
DS>0 0 0 1 0 0 0 1 0 0
DS>0 0 1 0 1 1 1 0 0 0
DS>0 1 1 1 0 0 0 0 0 0
DS>0 0 0 0 0 0 0 0 0 0

Вот и я тож так хотел сначало делать, но проблема возникает когда мы натыкаемся на последовательность 1-ц.
Я пока не вижу иного выхода, как разбивать всю границу на отрезки и уже проверять для них. Но хотелось бы конечно как проще.
Желаю удачи!!!
Re[4]: Да, я тут попытался для такого случая:
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 15.08.03 12:21
Оценка:
0000000000
0011001100
0100110010
0011001100
0000110000
0000000000


И понял, что поспешил с ответом ...
Re[5]: Да, я тут попытался для такого случая:
От: Max Lichmanov Россия  
Дата: 16.08.03 10:47
Оценка:
Здравствуйте, Dmi3evS, Вы писали:

DS>
DS>0000000000
DS>0011001100
DS>0100110010
DS>0011001100
DS>0000110000
DS>0000000000
DS>


DS>И понял, что поспешил с ответом ...


День добрый. Можно попробовать так (тоже по строкам или по столбцам).
1. Ищем первый пиксел с "1".
1.1. Если не нашли, то смещаемся на другую строку/столбец, и далее п.1.
2. Проверяем следующий пиксел на значение:
2.1. Если "1", то ищем далее по строке/столбцу первый "0":
2.1.1. Если нашли, то делаем его началом строки и выполняем п.1
2.1.2. Если не нашли, то смещаемся на другую строку/столбец, и далее п.1.
2.2. Если "0", то запоминаем последний "1" как входной.
3. Ищем далее пиксел с "1".
3.1. Если нашли, то запоминаем его как выходящий и красим все "0" между ним и входным. Далее п.1.
3.2. Если не нашли, то смещаемся на следующую строку/столбец, и далее п.1.

С уважением,
Макс Личманов.
С уважением,
Максим Личманов.
Re[6]: Да, я тут попытался для такого случая:
От: debjet Россия  
Дата: 16.08.03 17:39
Оценка:
Здравствуйте, Max Lichmanov, Вы писали:

ML>День добрый. Можно попробовать так (тоже по строкам или по столбцам).

ML>1. Ищем первый пиксел с "1".
ML>1.1. Если не нашли, то смещаемся на другую строку/столбец, и далее п.1.
ML>2. Проверяем следующий пиксел на значение:
ML>2.1. Если "1", то ищем далее по строке/столбцу первый "0":
ML>2.1.1. Если нашли, то делаем его началом строки и выполняем п.1
ML>2.1.2. Если не нашли, то смещаемся на другую строку/столбец, и далее п.1.
ML>2.2. Если "0", то запоминаем последний "1" как входной.
ML>3. Ищем далее пиксел с "1".
ML>3.1. Если нашли, то запоминаем его как выходящий и красим все "0" между ним и входным. Далее п.1.
ML>3.2. Если не нашли, то смещаемся на следующую строку/столбец, и далее п.1.

ML>С уважением,

ML>Макс Личманов.


Этот алгоритм не сработает для такого случая

Проход по столбцам

0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 0 0 0
0 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 1 0 0 0
0 1 1 1 1 0 0 0 1 1 1 0   << Здесь строчка не закрасится
0 1 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 1 0
0 1 1 1 1 0 0 0 1 1 1 0   << и Здесь строчка не закрасится
0 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 1 1 1 1 1 0 0 0
Желаю удачи!!!
Re: Растровый алгоритм закраски замкнутой области
От: aider  
Дата: 16.03.05 16:56
Оценка:
Здравствуйте, debjet, Вы писали:

D>Подскажите как залить произвольную замкнутую область, если не известна ни одна точка внутри этой области и область состои не из отрезков, а просто набор точек? Точнее мне хочется узнать можно ли, как-нибудь залить эту область, не находя точки внутри этой области и не разбивая границу области на отрезки?


можно я реализовал
могу дать исходники на Delphi
если ещё нужно пиши мыло
Re[7]: Да, я тут попытался для такого случая:
От: McSeem2 США http://www.antigrain.com
Дата: 16.03.05 18:02
Оценка:
Здравствуйте, debjet, Вы писали:
D>
D>0 0 0 0 0 0 0 0 0 0 0 0 
D>0 0 0 0 0 0 0 0 0 0 0 0
D>0 0 0 0 1 1 1 1 1 0 0 0
D>0 0 0 0 1 0 0 0 1 0 0 0
D>0 0 0 0 1 0 0 0 1 0 0 0
D>0 1 1 1 1 0 0 0 1 1 1 0   << Здесь строчка не закрасится
D>0 1 0 0 0 0 0 0 0 0 1 0
D>0 1 0 0 0 0 0 0 0 0 1 0
D>0 1 0 0 0 0 0 0 0 0 1 0
D>0 1 1 1 1 0 0 0 1 1 1 0   << и Здесь строчка не закрасится
D>0 0 0 0 1 0 0 0 1 0 0 0
D>0 0 0 0 1 1 1 1 1 0 0 0
D>


А если приложить еще немножечко умственного мозга, то можно обобщить, считая не отдельные единицы, а непрерывные последовательности из единиц и переключаясь fill/no_fill по ним.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.