7 void fillPolygon(kPoint *p, int number, int col, unsigned char **image){
\r
11 kPoint tpoly[kResolution + 2];
\r
15 //copy to temp buffer and detect max/min y-point
\r
17 tpoly[tnum].X = p[0].X;
\r
18 tpoly[tnum].Y = p[0].Y;
\r
19 miny = maxy = tpoly[tnum].Y;
\r
21 for(i = 1; i < number; i++){
\r
22 if(p[i].X != tpoly[tnum - 1].X || p[i].Y != tpoly[tnum - 1].Y){
\r
23 tpoly[tnum].X = p[i].X;
\r
24 tpoly[tnum].Y = p[i].Y;
\r
25 if(tpoly[tnum].Y < miny) miny = tpoly[tnum].Y;
\r
26 if(tpoly[tnum].Y > maxy) maxy = tpoly[tnum].Y;
\r
30 tpoly[tnum].X = tpoly[0].X;
\r
31 tpoly[tnum].Y = tpoly[0].Y;
\r
32 tpoly[tnum + 1].X = tpoly[1].X;
\r
33 tpoly[tnum + 1].Y = tpoly[1].Y;
\r
35 //detect crossing point of each y-point and draw
\r
36 for(j = miny; j <= maxy; j++){
\r
38 for(i = 0; i < tnum; i++){
\r
39 //if be parallel to x-axis
\r
40 if(tpoly[i].Y == tpoly[i + 1].Y){
\r
41 if(tpoly[i].Y == j){
\r
42 cross[num] = tpoly[i + 1].X;
\r
46 //if be parallel to y-axis
\r
47 else if(tpoly[i].X == tpoly[i + 1].X){
\r
48 if((tpoly[i].Y < j && j <= tpoly[i + 1].Y) ||
\r
49 (tpoly[i + 1].Y <= j && j < tpoly[i].Y)){
\r
50 cross[num] = tpoly[i].X;
\r
52 //spearhead: add one more
\r
53 if(tpoly[i + 1].Y == j &&
\r
54 ((tpoly[i].Y > tpoly[i + 1].Y &&
\r
55 tpoly[i + 1].Y < tpoly[i + 2].Y) ||
\r
56 (tpoly[i].Y < tpoly[i + 1].Y &&
\r
57 tpoly[i + 1].Y > tpoly[i + 2].Y))){
\r
58 cross[num] = tpoly[i + 1].X;
\r
63 //detect crossing point of each vector
\r
64 else if((tpoly[i].Y < j && j <= tpoly[i + 1].Y) ||
\r
65 (tpoly[i + 1].Y <= j && j < tpoly[i].Y)){
\r
66 a = (tpoly[i + 1].Y - tpoly[i].Y)
\r
67 / (tpoly[i + 1].X - tpoly[i].X);
\r
68 b = tpoly[i].Y - a * tpoly[i].X;
\r
69 cross[num] = (j - b) / a;
\r
71 //spearhead: add one more
\r
72 if(tpoly[i + 1].Y == j &&
\r
73 ((tpoly[i].Y > tpoly[i + 1].Y &&
\r
74 tpoly[i + 1].Y < tpoly[i + 2].Y) ||
\r
75 (tpoly[i].Y < tpoly[i + 1].Y &&
\r
76 tpoly[i + 1].Y > tpoly[i + 2].Y))){
\r
77 cross[num] = tpoly[i + 1].X;
\r
85 fprintf(stderr,"y:%d(%d)\n",j,num);
\r
86 for(k=0;k<num;k++) fprintf(stderr,"%d+",cross[k]);
\r
88 //sort crossing point
\r
89 for(k = 0; k < num - 1; k++){
\r
90 for(l = num - 1; l > k; l--){
\r
91 if(cross[l] < cross[l - 1]){
\r
93 cross[l] = cross[l - 1];
\r
99 for(k = 0 ; k < num; k = k + 2){
\r
100 for(l = cross[k]; l <= cross[k + 1]; l++){
\r
101 if(0 <= j && j < canvasHeight && 0 <= l && l < canvasWidth)
\r