图形填充之栅栏填充算法

Posted 么么打123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图形填充之栅栏填充算法相关的知识,希望对你有一定的参考价值。

编译器: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 }

 

结果:

以上是关于图形填充之栅栏填充算法的主要内容,如果未能解决你的问题,请参考以下文章

图形填充之种子填充算法

图形填充之边缘填充算法

图形填充之边标志算法

openGL实现图形学扫描线种子填充算法

计算机图形学——区域填充算法

计算机图形学实验一——基本图素的生成算法和图形填充