7 void fillPolygon(struct kPoint *p, int number, int col, unsigned char **image){
\r
15 //detect max/min y-point
\r
16 for(i = 0; i < number; i++){
\r
17 if(p[i].Y < miny) miny = p[i].Y;
\r
18 if(p[i].Y > maxy) maxy = p[i].Y;
\r
19 //fprintf(stderr,"%.1f:%.1f\n",p[i].X,p[i].Y);
\r
21 //detect crossing point of each y-point and draw
\r
22 for(j = miny; j <= maxy; j++){
\r
24 for(i = 0; i < number; i++){
\r
25 //if two points are tha same position, do nothing
\r
26 if(p[i].X == p[(i + 1) % number].X &&
\r
27 p[i].Y == p[(i + 1) % number].Y) continue;
\r
28 //if be parallel to x-axis
\r
29 if(p[i].Y == p[(i + 1) % number].Y){
\r
31 cross[num] = p[(i + 1) % number].X;
\r
32 //fprintf(stderr,"[%d]",cross[num]);
\r
36 //if be parallel to y-axis
\r
37 else if(p[i].X == p[(i + 1) % number].X){
\r
38 if((p[i].Y < j && j <= p[(i + 1) % number].Y) ||
\r
39 (p[(i + 1) % number].Y <= j && j < p[i].Y)){
\r
40 cross[num] = p[i].X;
\r
41 //fprintf(stderr,"[%d]",cross[num]);
\r
43 //spearhead: add one more
\r
44 if(p[(i + 1) % number].Y == j &&
\r
45 ((p[i].Y > p[(i + 1) % number].Y &&
\r
46 p[(i + 1) % number].Y < p[(i + 2) % number].Y) ||
\r
47 (p[i].Y < p[(i + 1) % number].Y &&
\r
48 p[(i + 1) % number].Y > p[(i + 2) % number].Y))){
\r
49 cross[num] = p[(i + 1) % number].X;
\r
50 //fprintf(stderr,"[%d]",cross[num]);
\r
52 //fprintf(stderr,"(add:%d)",j);
\r
56 //detect crossing point of each vector
\r
57 else if((p[i].Y < j && j <= p[(i + 1) % number].Y) ||
\r
58 (p[(i + 1) % number].Y <= j && j < p[i].Y)){
\r
59 a = (p[(i + 1) % number].Y - p[i].Y)
\r
60 / (p[(i + 1) % number].X - p[i].X);
\r
61 b = p[i].Y - a * p[i].X;
\r
62 cross[num] = (j - b) / a;
\r
63 //fprintf(stderr,"[%d]",cross[num]);
\r
65 //spearhead: add one more
\r
66 if(p[(i + 1) % number].Y == j &&
\r
67 ((p[i].Y > p[(i + 1) % number].Y &&
\r
68 p[(i + 1) % number].Y < p[(i + 2) % number].Y) ||
\r
69 (p[i].Y < p[(i + 1) % number].Y &&
\r
70 p[(i + 1) % number].Y > p[(i + 2) % number].Y))){
\r
71 cross[num] = p[(i + 1) % number].X;
\r
72 //fprintf(stderr,"[%d]",cross[num]);
\r
74 //fprintf(stderr,"(add:%d)",j);
\r
79 if(num % 2 != 0)fprintf(stderr,"y:%d(%d)\n",j,num);
\r
80 //if(num != 0 && num % 2 == 0){
\r
81 //sort crossing point
\r
82 for(k = 0; k < num - 1; k++){
\r
83 for(l = num - 1; l > k; l--){
\r
84 if(cross[l] < cross[l - 1]){
\r
86 cross[l] = cross[l - 1];
\r
91 //for(k=0;k<num;k++)fprintf(stderr,"%d:",cross[k]);
\r
93 for(k = 0 ; k < num; k = k + 2){
\r
94 for(l = cross[k]; l <= cross[k + 1]; l++){
\r
95 if(0 <= j && j < canvasHeight && 0 <= l && l < canvasWidth)
\r
98 //image[j][cross[k]] = col;
\r
99 //image[j][cross[k+1]] = col;
\r