Re[14]: Чередующаюся закраска полигона
От: Reunion  
Дата: 27.07.05 14:41
Оценка: :)
Здравствуйте, raskin, Вы писали:

R>Reunion wrote:

>> R>>Так там так и сделано. Я еагирую на последовательность черных
>> пикселей. Закрашиваю от одной последовательности до другой, потом
>> пропускаю один промежуток, потом опять крашу... Чего-то тут не хватает
>>
>> C>Пришла в голову еще одна мысль. Совсем с другого края. Раз изображение
>> растровое, будем вовсю использовать flood fill. Можно заливать
>> поочередно замкнутые области, учитывая направление границ для
>> определения соседей. Для упрощения можно заранее залить фон каким-нибудь
>> отдельным цветом.
>> C>Но! Задача сводится к раскраске планарного графа в 2 цвета, что, как
>> известно, в общем случае невозможно. Поэтому идеального решения не
>> существует, но для симпатичного представления "на вид" можно
>> использовать эвристики. Например: при противоречии закрашиваем тем
>> цветом, которого меньше всего среди соседей.
>> C>Хотя, сдается мне, полностью детерминированно можно раскрасить только
>> после векторизации и полноценного применения even-odd, как предложил
>> <http://rsdn.ru/forum/Message.aspx?mid=1289220&amp;only=1&gt;
Автор: McSeem2
Дата: 25.07.05
McSeem2.

>>
>> В моем случае можно всегда покрасить в два цвета — кривая рисуется
>> пользователем не отрывая карандаша... Такую кривую можно.

R>А нельзя хранить дополнительную информацию о пути рисования? А то можно

R>ведь такого нарисовать..

Упс, , чего-то я вам сказать забыл... Можно. Есть последовательность точек, которую рисует пользователь... Не бейте...
Re[14]: Чередующаюся закраска полигона
От: Reunion  
Дата: 27.07.05 14:44
Оценка:
Здравствуйте, conraddk, Вы писали:

C>Здравствуйте, Reunion, Вы писали:


R>>В моем случае можно всегда покрасить в два цвета — кривая рисуется пользователем не отрывая карандаша... Такую кривую можно.

C>А ну как он точно-точно проведет по одной и той же линии два раза? Или много раз?

Это не важно. Чего получится то и получится. Нефиг по одному месту возить мышку... Не, реально, забей на этот случай.
Re[15]: Чередующаюся закраска полигона
От: raskin Россия  
Дата: 27.07.05 16:14
Оценка:
Reunion wrote:
>> > В моем случае можно всегда покрасить в два цвета — кривая рисуется
>> > пользователем не отрывая карандаша... Такую кривую можно.
>
> R>А нельзя хранить дополнительную информацию о пути рисования? А то можно
> R>ведь такого нарисовать..
>
> Упс, , чего-то я вам сказать забыл... Можно. Есть последовательность
> точек, которую рисует пользователь... Не бейте...

Так тогда у Вас есть набор отрезков в пару точек, проведённых
пользователем. И пересечения считаются легко и непринуждённо всегда.
Находите все куски кривой, проходящие через задетые чёрные клетки. После
этого достаточно посчитать число отрезков, уходящих вверх (не вниз) из
задетой чёрной клетки и добавить его к счётчику чётности. Закраска — по
чётности.
Posted via RSDN NNTP Server 2.0 beta
Re[16]: Чередующаюся закраска полигона
От: Reunion  
Дата: 28.07.05 03:44
Оценка:
Здравствуйте, raskin, Вы писали:

R>Reunion wrote:

>>> > В моем случае можно всегда покрасить в два цвета — кривая рисуется
>>> > пользователем не отрывая карандаша... Такую кривую можно.
>>
>> R>А нельзя хранить дополнительную информацию о пути рисования? А то можно
>> R>ведь такого нарисовать..
>>
>> Упс, , чего-то я вам сказать забыл... Можно. Есть последовательность
>> точек, которую рисует пользователь... Не бейте...

R>Так тогда у Вас есть набор отрезков в пару точек, проведённых

R>пользователем. И пересечения считаются легко и непринуждённо всегда.
R>Находите все куски кривой, проходящие через задетые чёрные клетки. После
R> этого достаточно посчитать число отрезков, уходящих вверх (не вниз) из
R>задетой чёрной клетки и добавить его к счётчику чётности. Закраска — по
R>чётности.

Можно подробнее, а то я что-то не понял.
Re[17]: Чередующаюся закраска полигона
От: raskin Россия  
Дата: 28.07.05 05:17
Оценка:
Reunion wrote:
> R>Так тогда у Вас есть набор отрезков в пару точек, проведённых
> R>пользователем. И пересечения считаются легко и непринуждённо всегда.
> R>Находите все куски кривой, проходящие через задетые чёрные клетки. После
> R> этого достаточно посчитать число отрезков, уходящих вверх (не вниз) из
> R>задетой чёрной клетки и добавить его к счётчику чётности. Закраска — по
> R>чётности.
>
> Можно подробнее, а то я что-то не понял.

Не вопрос. Можно на полупаскаль?

const l=...;
const n=...;
moves: array [1..l] of record
x,y:integer;
end;
field: array[1..n,1..n] of integer; {сейчас — все нули}

i,j,k:integer;

{Поле заполняется по следующим правилам:
0 — пусто
1 — пусто и закрашено
2 — чёрная точка, надо менять чётность
3 — чёрная точка, не надо менять чётность}
for k:=1 to l-1 do begin
(i,j):=(moves[k].x,moves[k].y);
field[i,j] :or= 2;
if moves[k].y>moves[k+1].y then begin
(i,j):=(moves[k+1].x,moves[k+1].y);
field[i,j] :xor= 1;
end else if moves[k].y<moves[k+1].y then begin
field[i,j] :xor= 1;
end;
end;

А после этого — просто Ваш проход на чётность, в каждой клетке написано,
надо ли менять чётность. Другими словами, имеется самопересекающаяся
ломаная. При проходе по строке пустим луч на уровне 1/4 от верхнего края
(мы знаем, что вся пустая клетка целиком в одной области, поэтому всё
равно, где пускать луч) и считаем пересечения с ним с учётом кратности
(это делается легко).
Posted via RSDN NNTP Server 2.0 beta
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.