图形填充之边缘填充算法

编译器:VS2013

基本思想:

基本思想:按任意顺序处理多边形的每条边。处理时,先求出该边与扫描线的交点,再对扫描线上交点右方的所有象素取补。

取补:若该像素是背景色,则变为填充色; 若像素是填充色,则变为背景色。

前言:刚开始接触这个算法时,一直不知道怎么找出直线上任意一点x,y的关系,困扰了很久,也和高中数学忘了差不多有关,只记得y=kx+b,然而这题使用

(y1-y0)/(x1-x0)=(y-y0)/(x-x0)

这样一来关系很明显表达出来,而且用k做的话会存在k不存在的情况,而这种做法极端情况是y1=y0,但是这个时候根本不用填充,好啦,老规矩,附一波源码

代码:

 1 // 边缘填充算法.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include<stdio.h>
 6 #include"graphics.h"
 7 #include<stdlib.h>
 8
 9 //函数声明
10 int  maxX(int a[], int n);//求取最大值
11 void Edgefilling(int a[], int n);
12 int putcolor(int x, int y);//颜色填充
13
14 int main()
15 {
16     int gdriver = DETECT, gmode,n,i;
17
18     printf("please input the nymber of point:\n");
19     scanf_s("%d", &n);
20
21     int *a = (int *)malloc(n*sizeof(int));//动态分配内存
22
23     printf("input the point:\n");
24     for (i = 0; i < n; i++)
25         scanf_s("%d",&a[i]);
26
27     initgraph(&gdriver, &gmode, "");
28
29     setcolor(YELLOW);
30     setbkcolor(BLACK);
31
32     drawpoly(n / 2, a);//画出多边形
33
34     Edgefilling(a, n);
35
36     system("pause");
37     closegraph();
38
39     return 0;
40 }
41
42 //边缘填充算法实现
43 void Edgefilling(int a[],int n)
44 {
45     int i,x,y,Ymax,Ymin;
46
47     for (i = 0; i < n - 2; i = i + 2)
48     {
49         //判断纵坐标大小
50         Ymax = (a[i + 1] > a[i + 3]) ? a[i + 1] : a[i + 3];
51         Ymin = (a[i + 1] <= a[i + 3]) ? a[i + 1] : a[i + 3];
52
53         for (y = Ymin; y < Ymax; y++)
54         {
55             x = (y - a[i + 1])*(a[i + 2] - a[i]) / (a[i + 3] - a[i + 1]) + a[i];
56
57             while (x <= maxX(a, n))
58             {
59                 putpixel(x, y, putcolor(x, y));
60                 x++;
61             }
62         }
63     }
64
65 }
66
67 //求取最大值
68 int  maxX(int a[],int n)
69 {
70     int i,max=a[0];
71
72     for (i = 0; i < n; i += 2)
73     {
74         if (a[i] > max)
75             max = a[i];
76     }
77
78     return max;
79 }
80
81 //颜色填充
82 int putcolor(int x, int y)
83 {
84     if (getpixel(x, y) == BLACK)
85         return BLUE;
86     else if (getpixel(x, y) == BLUE)
87         return BLACK;
88     else
89         return YELLOW;
90 }

结果:

时间: 2024-08-24 17:11:49

图形填充之边缘填充算法的相关文章

图形填充之栅栏填充算法

编译器:VS2013 该算法相对边缘填充算法莱说,效率较高来说,选取一个顶点的横坐标为栅栏,将直线和栅栏之间进行填充,如果颜色为背景色,则填充填充色,否则则填充背景色 代码: 1 // 栅栏填充算法.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 #include"graphics.h" 7 #include<stdlib.h> 8 9 //函数声

图形填充之边标志算法

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

图形填充之种子填充算法

编译器: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 参数拟合法的基本原理 CCD是光积分器件,它以固定大小的面积在固定的时间间隔内对投影其感光面上的光强进行积分,输出的结果就是图像的灰度值.由于CCD的积分时间和面积是相对固定的,所以它的输出灰度值只与感光面上光强分布有关.对于某一像素的灰度值输出可以表示为 原文地址:https://www.cnblogs.com/fujj/p/9678658.html