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

Процедура, реализующая описанный алгоритм, приводится ниже.

Üä5 // File fillconv.cpp
static int findEdge (int& i, int dir, int n, const Point p 0 ) {
for(;;)
6. PacTpoBbie anrop
{
int i1 = i + dir;
if(i1<0) i1 = n -1;
eise
if (i1 >= n ) i1 =0;
if ( P fl1]-y < P [i]-y ) edge [iJ1] is going upwards return -1; //must be some error
else
if ( p [i1].y == p [i].y ) //horizontal edge i = i1;
else // edge [i, i1] is going downwords
return 11;
} '
}
void fillConvexPoly (int n, const Point p []) {
int yMin = p [0].y; int yMax = p [0].y; int topPointlndex = 0;
// find y-range and for (int i = 1; i < n; i++ ) // topPointlndex if ( P W-y < P [topPointlndex].y ) topPointlndex = i;
else
if ( p [i].y > yMax ) yMax = p [i].y;
yMin = p [topPointlndex].y;
if ( yMin == yMax ) // degenerate polygon {
int xMin = p [0].x; int xMax = p [0].x;
// find it's x-range for (i = 1; i < n; i++ ) if (p [i].x < xMin ) xMin = p [i].x;
else
if ( p [i].x > xMax ) xMax = p [i].x; //fill it
line ( xMin, yMin, xMax, yMin ); return;
}
int i1, UNext; int i2, i2Next;
i1 = topPointlndex;
i1 Next = findEdge (i1, -1, n, p );

Компьютерная графика. Полигональные модели

i*2 = topPointlndex; i2Next = findEdge (i2, 1, n, p );
Fixed x1 = int2Fixed ( p [i1].x );
Fixed x2 = int2Fixed ( p [i2].x );
Fixed dx1 = fraction2Fixed ( p [i1Next].x- p [i1].x, p [i1Next].y- p [i1].y )r
Fixed dx2 = fraction2Fixed ( p [i2Next].x - p [i2].x, p [i2Next].y - p [i2].y );

for (int у = yMin; у <= уМах; y++ ) {

line (fixed2lnt ( x1 ), y, fixed2lnt ( x2 ), у );

x1 += dx1; x2 += dx2;
if(y + 1 ==p[i1Next].y) {
11 = i1 Next; // switch to next edge if (~i1Next<0 )

⇐ Предыдущая| |Следующая ⇒