home *** CD-ROM | disk | FTP | other *** search
-
- /************************************************************************/
- /* Fill a base triangle using scan-line function */
- /* and then fill a general triangle (using triangle fill routine) */
- /************************************************************************/
-
- fill_triag()
- {
-
- /* Fill a base line triangle */
-
- int x0 = 100,x1 = 0, x2 = 300, y0 = 10, y1 = 100, y2 = 100;
- int y, color = 15, start, end;
- for (y = y0; y <= y1; y++) /* Loop over raster lines */
- { /* Compute intercepts */
- start = x0 + ((y - y0)*(x1 - x0))/(y1 - y0);
- end = x0 + ((y - y0)*(x2 - x0))/(y2 - y0);
- scanline(start,end,y,color); /* Fill next section */
- }
-
- /* Fill a general triangle */
-
- triangle(400,100, 500,0, 630,200, color);
- }
-
- /************************************************************************/
- /* */
- /* triangle(x0,y0,x1,y1,x2,y2,color) - Fill a general triangle with */
- /* color 'color'. This routine will call the scanline */
- /* procedure to fill scanlines between two edges of the */
- /* triangle. */
- /* */
- /* First vertices are ordered so that vertex 'a' is the */
- /* left most top vertex, and 'b' is the left most bottom */
- /* vertex. Triangle is than split into two 'baseline' */
- /* triangles, and each triangle is filled separately. */
- /* One triangle is an upward pointing arrow and the second */
- /* Triangle is a downward pointing arrow. */
- /* */
- /************************************************************************/
-
- triangle(x0,y0, x1,y1, x2,y2, color)
- int x0,y0, x1,y1, x2,y2,color;
- {
- int x[4],y[4],a,b,c,temp;
- x[0] = x0;
- x[1] = x1;
- x[2] = x2;
- y[0] = y0;
- y[1] = y1;
- y[2] = y2;
-
- /* Order the vertices */
- a = 0; /* Get lowest left in a */
- if (y[0] > y[1]) a = 1;
- if (y[a] > y[2]) a = 2;
- b = (a+1)%3;
- c = (b+1)%3;
- if (y[a] == y[b] && x[a] > x[b]) a = b;
- if (y[a] == y[c] && x[a] > x[c]) a = c;
- b = (a+1)%3;
- c = (b+1)%3;
- if (y[b] < y[c]) /* Get highest left in b*/
- {
- temp = b;
- b = c;
- c = temp;
- }
- if (y[b] == y[c] && x[b] > x[c])
- {
- temp = b;
- b = c;
- c = temp;
- }
- /* fill 'base' triangles */
- if (y[a] == y[b]) /* Fill degenerates */
- {
- scanline(x[a],x[b],y[b],color);
- scanline(x[a],x[c],y[c],color);
- }
- else if (y[a] == y[c]) /* Fill down arrow */
- fill_dw(x[a],y[a],x[b],y[b],x[c],y[c],x[b],y[b],y[c],color);
- else if (y[b] == y[c]) /* Fill up arrow */
- fill_up(x[a],y[a],x[b],y[b],x[a],y[a],x[c],y[c],y[c],color);
- else
- { /* Split into two bases */
- y[3] = y[c]; /* one up and one down */
- x[3] = x[a] + ((y[3] - y[a])*(long int)(x[b] - x[a]))/(y[b] - y[a]);
- if (x[3] < x[c]) /* 'c' is to the right */
- {
- fill_up(x[a],y[a],x[b],y[b],x[a],y[a],x[c],y[c],y[c],color);
- fill_dw(x[a],y[a],x[b],y[b],x[c],y[c],x[b],y[b],y[c],color);
- }
- else /* 'c' is to the left */
- {
- fill_up(x[a],y[a],x[c],y[c],x[a],y[a],x[b],y[b],y[c],color);
- fill_dw(x[c],y[c],x[b],y[b],x[a],y[a],x[b],y[b],y[c],color);
- }
- }
- }
-
- fill_up(ax,ay, bx,by, cx,cy, dx,dy,y0,color) /* Fill up arrow */
- int ax,ay,bx,by,cx,cy,dx,dy,y0,color;
- {
- int dyab,dycd,y,d1,d2;
- dycd = dy - cy;
- dyab = by - ay;
- for (y = ay; y <= y0; y++)
- {
- d1 = ((y - ay)*(long)(bx - ax))/dyab;
- d2 = ((y - cy)*(long)(dx - cx))/dycd;
- scanline(ax+d1, cx+d2, y,color);
- }
- }
- fill_dw(ax,ay, bx,by, cx,cy, dx,dy,y0,color) /* Fill down arrow */
- int ax,ay,bx,by,cx,cy,dx,dy,y0,color;
- {
- int dyab,dycd,y,d1,d2;
- dycd = dy - cy;
- dyab = by - ay;
- for (y = dy; y >= y0; y--)
- {
- d1 = ((y - ay)*(long)(bx - ax))/dyab;
- d2 = ((y - cy)*(long)(dx - cx))/dycd;
- scanline(ax+d1, cx+d2, y, color);
- }
- }