图形填充之栅栏填充算法

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

结果:

时间: 2024-08-05 15:24:31

图形填充之栅栏填充算法的相关文章

图形填充之边标志算法

编译器:VS2013 前言:该算法是我所写的四个算法里最难的,也是有问题的一个,问题在于特殊情况时,总会多出现一条直线,一直再想办法避免,但还是没想出来........ 算法述论: 源码: 1 // 边标志填充算法.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 #include"graphics.h" 7 #include<stdlib.h> 8

图形填充之边缘填充算法

编译器:VS2013 基本思想: 基本思想:按任意顺序处理多边形的每条边.处理时,先求出该边与扫描线的交点,再对扫描线上交点右方的所有象素取补. 取补:若该像素是背景色,则变为填充色; 若像素是填充色,则变为背景色. 前言:刚开始接触这个算法时,一直不知道怎么找出直线上任意一点x,y的关系,困扰了很久,也和高中数学忘了差不多有关,只记得y=kx+b,然而这题使用 (y1-y0)/(x1-x0)=(y-y0)/(x-x0) 这样一来关系很明显表达出来,而且用k做的话会存在k不存在的情况,而这种做法

图形填充之种子填充算法

编译器:VS2013 算法:在图形内选择一个点为种子,然后对这个种子四方位坐标未着色的入栈,出栈便着色,如此重复,等到栈内为空,则着色完成 代码: 1 #include "stdafx.h" 2 #include<stdio.h> 3 #include"graphics.h" 4 #include<stdlib.h> 5 #include<stack> 6 7 using namespace std; 8 9 //定义结构体存储像

GDI+绘制图形和画刷填充图形

GDI+可以再Windows窗体应用程序中以编程方式绘制图形等. 可以在VS里新建项目-Windows窗体应用程序-建一个窗体.首先引入命名空间using System.Drawing.Imaging;using System.Drawing.Drawing2D; 1.绘制矩形 可以再Form窗体的Paint事件中添加以下代码 private void Form1_Paint(object sender, PaintEventArgs e)        {            // 创建钢笔

OpenGL学习进程(13)第十课:基本图形的底层实现及算法原理

    本节介绍OpenGL中绘制直线.圆.椭圆,多边形的算法原理.     (1)绘制任意方向(任意斜率)的直线: 1)中点画线法: 中点画线法的算法原理不做介绍,但这里用到最基本的画0<=k<=1的中点画线法实现任意斜率k直线的绘制. 1)当A点x坐标值大于B点坐标值时,即A点在B点的右侧时,交换A.B点的坐标.保证A点在B的左侧. 2)考虑特殊情况,当直线AB的斜率不存在时,做近似处理,设置斜率为-(y0-y1)*100,即近似无穷大. 3)当斜率m满足0<=m<=1时,按书

Opencv图像识别从零到精通(24)------漫水填充,种子填充,区域生长、孔洞填充

可以说从这篇文章开始,就结束了图像识别的入门基础,来到了第二阶段的学习.在平时处理二值图像的时候,除了要进行形态学的一些操作,还有有上一节讲到的轮廓连通区域的面积周长标记等,还有一个最常见的就是孔洞的填充,opencv这里成为漫水填充,其实也可以叫种子填充,或者区域生长,基本的原理是一样的,但是应用的时候需要注意一下,种子填充用递归的办法,回溯算法,漫水填充使用堆栈,提高效率,同时还提供了一种方式是扫描行.经常用来填充孔洞,现在来具体看看. 漫水填充:也就是用一定颜色填充联通区域,通过设置可连通

laravel模型建立和数据迁移和数据填充(数据填充没有成功)未完

开始创建我们的第一个 Article 模型及其对应迁移文件了,我们在项目根目录运行如下 Artisan 命令一步到位: php artisan make:model Article -m -m 是 --migration 的缩写,告知 Artisan 在创建模型同时创建与之对应的迁移文件(我使用的是 Laradock 作为开发环境): 当然,还需要编辑默认生成的迁移文件: use Illuminate\Support\Facades\Schema; use Illuminate\Database

C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式

============================================== des   cbc  加密 zeropadding填充方式 ============================================== //加密 cbc zeropadding 自己实现 std::string des_cbc_zero_encrypt(const std::string &clearText, const std::string &key) { static u

搜索框自定填充,自动填充数据

1.jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ http://docs.jquery.com/Plugins/Autocomplete 2.jquery.autocomplete详解 语法: autocomplete(urlor data, [options] ) 参数: url or data:数组或者url [options]:可选项,选项解释如下: 1) m