图形填充之边标志算法

编译器:VS2013

前言:该算法是我所写的四个算法里最难的,也是有问题的一个,问题在于特殊情况时,总会多出现一条直线,一直再想办法避免,但还是没想出来。。。。。。。。

算法述论:

源码:

  1 // 边标志填充算法.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5 #include<stdio.h>
  6 #include"graphics.h"
  7 #include<stdlib.h>
  8
  9 void dealpoint(int a[], int n);
 10 int maxcoor(int a[], int n, int x);
 11 int mincoor(int a[], int n, int x);
 12 void fill(int a[], int maxx, int minx, int miny, int maxy);
 13
 14 int main()
 15 {
 16     int gdriver = DETECT, gmove,n,i,maxx,minx,maxy,miny;
 17
 18     printf("please input the number of coordinate:\n");
 19     scanf_s("%d", &n);
 20
 21     int *a = (int *)malloc((n + 2)*sizeof(int));//动态分配内存,多分配两个存储起点
 22
 23     printf("please input the coordinate:\n");
 24     for (i = 0; i < n + 2; i++)
 25         scanf_s("%d", &a[i]);
 26
 27     //利用外接矩形缩小范围
 28     maxx = maxcoor(a, n, 0);
 29     minx = mincoor(a, n, 0);
 30     maxy = maxcoor(a, n, 1);
 31     miny = mincoor(a, n, 1);
 32
 33     initgraph(&gdriver, &gmove, "");
 34
 35     setcolor(YELLOW);//设置画笔颜色
 36
 37     drawpoly(n / 2 + 1, a);
 38     dealpoint(a, n);
 39     fill(a, maxx, minx, miny, maxy);
 40
 41     system("pause");
 42
 43     closegraph();
 44
 45     return 0;
 46 }
 47
 48 //检查顶点是否为区域最大点或最小点
 49 void dealpoint(int a[], int n)
 50 {
 51     int i, j, k, x ,y, color[6] = { 0, 0, 0, 0, 0, 0 };
 52
 53     for (i = 0; i < n; i += 2)//遍历点的数组
 54     {
 55         //遍历顶点上方和下方三个点
 56         for (j = -1,x=0; j <= 1; j += 2)
 57         for (k = -1; k <= 1; k++,x++)
 58         {
 59             if (getpixel(a[i] + k, a[i + 1] + j) == YELLOW)
 60                 color[x] = 1;
 61         }
 62
 63         //如果该点位区域最大点或最小点,则将该点变成背景色
 64         if (!((color[0] || color[1] || color[2]) && (color[3] || color[4] || color[5])))
 65             putpixel(a[i], a[i + 1], BLACK);
 66
 67         for (y = 0; y < 6; y++)
 68             color[y] = 0;
 69     }
 70 }
 71
 72 //填充颜色
 73 void fill(int a[], int maxx, int minx, int miny, int maxy)
 74 {
 75     int temp ,i,j;
 76
 77     for (j = miny; j <= maxy; j++)
 78     {
 79         temp = 0;
 80
 81         for (i = minx; i <= maxx; i++)
 82         {
 83             if ((getpixel(i, j) == YELLOW) && (getpixel(i + 1, j) == BLACK))
 84                 temp++;
 85
 86             if ((temp % 2) == 1)
 87                 putpixel(i, j, YELLOW);
 88         }
 89     }
 90
 91 }
 92
 93 //返回最大值
 94 int maxcoor(int a[], int n,int x)
 95 {
 96     int i,max=a[0];
 97
 98     for (i = x; i < n; i+=2)
 99         if (a[i]>max)
100             max = a[i];
101
102     return max;
103 }
104
105 //返回最小值
106 int mincoor(int a[], int n, int x)
107 {
108     int i, min = a[0];
109
110     for (i = x; i < n; i += 2)
111         if (a[i]<min)
112             min = a[i];
113
114     return min;
115 }

结果:

产生该直线的原因并非是顶点,而是顶点附近的点,一直没想到办法避免

下面是简单的菱形

时间: 2024-10-25 21:45:57

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

图形学_多边形扫描转换_边界标志算法

边界标志算法 1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志. 2.填充 对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素. 取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真.若点在多边形外,则inside为假. Inside 的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反.对未打标志的点,inside不变. 1 #include "easyx.h" 2 #include &qu

理解SVG的图形填充规则

SVG的图形填充规则通过fill-rule属性来指定. 有效值:   nonzero | evenodd | inherit 默认值:   nonzero fill-rule属性用于指定使用哪一种算法去判断画布上的某区域是否属于该图形“内部” (内部区域将被填充).对一个简单的无交叉的路径,哪块区域是“内部” 是很直观清除的.但是,对一个复杂的路径,比如自相交或者一个子路径包围另一个子路径,“内部”的理解就不那么明确了. nonzero 字面意思是“非零”.按该规则,要判断一个点是否在图形内,从

图形填充之栅栏填充算法

编译器: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 #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 //定义结构体存储像

图形填充之边缘填充算法

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

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时,按书

计算机图形学中的边标志算法c++程序实现2

摘要: 讲一讲这个程序遇到的错误 1.就是最后一个点,当他只有一个点的时候,他就是吧后面的全部填充,这是因为标志填充算法一定要有两个边界才可以,我解决这个问题的办法是错开一个点 2.就是当有三个点的时候,第2和3点中间部分就不会被填充了,以上的解决办法就是错开一点,也就是把第二个点变成两个点 3,使用中点画圆方法画的圆,在这个算法中,由于他选择的点有可能不是下一个点,而是跟当前点平行的那一个,这个时候他就会填充的是这两个点,所以会有下面运行结果图中心形上方的填充空白,尤其是弧度比较水平的时候 #

Canvas---Canvas版画图、圆角矩形、圆形、矩形、图形填充、mvc模式重新整合代码版

 使用Canvas实现画图程序.(转载注明出处与作者啊) 本次主要更新了一下功能: 新添加图形:矩形,圆形,圆角矩形 实现了描边颜色与填充颜色的选择 使用类似mvc的模式重新整理了代码. M层: 特殊图形的路径规划代码组成,只包含路径规划,无样式设计. V层:设计样式,调用路径规划代码,实际绘制图案.在这里完成填充.描边. C层:判断选择框内容,调用不同的实际绘制代码 其他:事件处理与辅助计算函数等 不足:感觉代码结构还是不够好,果然是我没用面向对象么? 下面是效果图: 下面是源代码: ①本

详述canvas(三)—绘制图形/填充和渐变

未闭合的图形也会被填充 <body> <canvas id = "palette" width="500px" height="500px"> 您的浏览器不支持canvas标签,请升级浏览器或更换其它浏览器 </canvas> </body> </html> <script> var palette = document.querySelector("#palett