图形填充之栅栏填充算法
编译器:VS2013
该算法相对边缘填充算法莱说,效率较高来说,选取一个顶点的横坐标为栅栏,将直线和栅栏之间进行填充,如果颜色为背景色,则填充填充色,否则则填充背景色
代码:
1 // 栅栏填充算法.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 #include"graphics.h" 7 #include<stdlib.h> 8 9 //函数声明 10 void fencefill(int a[], int x,int n);//栅栏填充算法实现 11 void putcolor(int Xmin, int Xmax, int k);//着色函数 12 13 int main() 14 { 15 int gdriver = DETECT, gmove, x,y,n; 16 17 printf("please input the number of point\n"); 18 scanf_s("%d", &n); 19 int *a=(int *)malloc((n+2)*sizeof(int));//动态分配内存 20 21 for (y = 0; y < n + 2; y++) 22 scanf_s("%d", &a[y]); 23 24 x = a[n];//选取a[n]为栅栏 25 26 initgraph(&gdriver, &gmove, ""); 27 28 setcolor(YELLOW); 29 drawpoly(n/2+1, a);//画出多边形 30 fencefill(a, x,n);//栅栏填充算法实现 31 drawpoly(n/2+1, a);//再处理一次边界 32 33 //因栅栏被处理两次,所以再次填充栅栏一列 34 for (y = a[n+1]+1; getpixel(x, y) != YELLOW; y++) 35 putpixel(x, y, YELLOW); 36 37 system("pause"); 38 39 closegraph(); 40 41 return 0; 42 } 43 44 //栅栏填充算法实现 45 void fencefill(int a[], int x,int n) 46 { 47 int i, y, Xmin, Xmax, Ymax, Ymin,xi; 48 49 //循环数组a 50 for (i = 0; i < n; i = i + 2) 51 { 52 //判断纵坐标大小 53 Ymax = (a[i + 1] > a[i + 3]) ? a[i + 1] : a[i + 3]; 54 Ymin = (a[i + 1] <= a[i + 3]) ? a[i + 1] : a[i + 3]; 55 56 //行处理 57 for (y = Ymin; y < Ymax; y++) 58 { 59 //利用直线关系求得y=k时x对应的坐标 60 xi = (y - a[i + 1])*(a[i + 2] - a[i]) / (a[i + 3] - a[i + 1]) + a[i]; 61 62 //求x与栅栏大小关系 63 Xmax = (xi > x) ? xi : x; 64 Xmin = (xi <= x) ? xi : x; 65 66 putcolor(Xmin, Xmax, y);//着色函数 67 } 68 } 69 70 } 71 72 //着色函数 73 void putcolor(int Xmin, int Xmax, int y) 74 { 75 while (Xmin <= Xmax) 76 { 77 if (getpixel(Xmin, y) == YELLOW) 78 putpixel(Xmin, y, BLACK); 79 else 80 putpixel(Xmin, y, YELLOW); 81 82 Xmin++; 83 } 84 }
结果: