Быстрая закраска
- 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)