Быстрая закраска

From
Vovanius Uryvaeff (2:5020/175.2)
To
Alexander Samarin
Date
2002-11-26T20:57:49Z
Area
RU.ALGORITHMS
From: "Vovanius Uryvaeff" <micro-s@vniiofi.ru>

Tue Nov 26 2002 11:51, Alexander Samarin wrote to All:

 AS>                              *|||, All!*

 AS>     Почту за предыдущие 3 месяца я потерял, так, что сильно не пинайте
 AS> т.к.
 AS> вроде пробегала здесь такая тема.

 AS>     Имею 3-х мерную модель (гоблин) состоящий из полигонов
 AS> (треугольников), так вот текстурирование мне не нужно, я хотел бы эти
 AS> полигоны просто закрашивать в свой цвет (для моей задачи итоговая
 AS> картинка вполне сойдёт).
 AS>     Пока есть только 2 идеи:
[skip]

Эти идеи - мой совет - лучше не применяй.
Впрочем, вторая идея применяется несколько иначе - сначала на отдельном
битмапе расставляются все точки границ, а потом достаточно быстро серией
логических операций все закрашивают.
Расставляются точки так: чертится отрезок с условиями: точка верхнего конца не
ставится, точка нижнего конца ставится. Остальные точки по одной в строке.
Точки ставятся по XOR - то есть если до установки отчка уже была, она
стирается.
_                <-- Один конец
     x
          x
               x <-- Еще один конец
Дальше закрашивается так:
для y=ymin..ymax для x=xmin..xmax A[x,y] = A[x-1,y] XOR C[x,y]
A - битмап для прорисовки, C - дополнительный битмап.
Так можно нарисовать любой многоугольник.

Более просто делается так:
есть вершины треугольника (x1,y1), (x2,y2), (x3,y3)
1. Сортируем вершины в порядке возрастания y (y1<y2<y3)
2. Рисуем в два приема
для y=x1..x2 линию (x1+ (x2-x1)*(y-y1)/(y2-y1), y) - (x1+
(x3-x1)*(y-y1)/(y3-y1), y)
для y=x2..x3 линию (x2+ (x3-x2)*(y-y2)/(y3-y2), y) - (x1+
(x3-x1)*(y-y1)/(y3-y1), y)
и всё.

вообще - подобным алгоритмом любые многоугольники можно закрашивать, только
там понавороченнее.

 AS>     Есть и третья идея, но она нелепа, хотя и работает (нелепа т.к. там
 AS> куча частных проверок и сильно тормозит) - такой алгоритм я не видел пока
 AS> ни у кого, хотя он напоминает мой второй. Этот третий алгоритм я придумал
 AS> (правда не с нуля, но всё-же) 6 лет назад и тогда для меня это было круто
 AS> :)

Этот лучше тоже не применяй. :)

Send Email to vovanius2000<yxo>mail. ru

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)