多边形填充算法

算法系列之十二:多边形区域填充算法--几种边标志填充算法 四、边界标志填充算法 在光栅显示平面上,多边形是封闭的,它是用某一边界色围成的一个闭合区域,填充是逐行进行的,即用扫描线逐行对多边形求交,在交点对之间填充。边界标志填充算法就是在逐行处理时,利用边界或边界颜色作为标志来进行填充的。准确地说,边界标志填充算法不是指某种具体的填充算法,而是一类利用扫描线连贯性思想的填充算法的总称。这类算法有很多种,本篇就介绍几种。 首先介绍一种以边为中心的边缘填充... 阅读详情
C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
////////////////////////////////////////////////////////////////////////////////////////////////// 
// 功能:  填充多边形 
// 
// 参数:  lpPoints: 指向顶点坐标数组的指针,数组类型为POINT,多边形由它们顺次封闭连接得到 
//    nCount:  顶点的个数 
//    nColor:  填充的颜色 默认为黑色 
//    pDC:  设备句柄指针 
// 
// 返回:  无返回值 
// 
// 说明:  可以是边相交的多边形 
// 
////////////////////////////////////////////////////////////////////////////////////////////////// 
void FillPolygon(LPPOINT lpPoints,int nCount, CDC *pDC, int nColor/*=0*/) 
{ 
// 检查参数合法性 
ASSERT_VALID(pDC); 
ASSERT(lpPoints); 
ASSERT(nCount>2); 
ASSERT(nColor>=0); 
 
// 边结构数据类型 
typedef struct Edge{ 
  int ymax;  // 边的最大y坐标 
  float x; // 与当前扫描线的交点x坐标 
  float dx; // 边所在直线斜率的倒数 
  struct Edge * pNext; // 指向下一条边 
}Edge, * LPEdge; 
 
int i=0,j=0,k=0; 
int y0=0,y1=0;  // 扫描线的最大和最小y坐标 
LPEdge pAET=NULL; // 活化边表头指针 
LPEdge * pET=NULL;  // 边表头指针 
 
pAET=new Edge; // 初始化表头指针,第一个元素不用 
pAET->pNext=NULL; 
 
// 获取y方向扫描线边界 
y0=y1=lpPoints[0].y; 
for(i=1;i <nCount;i++) 
{ 
  if(lpPoints[i].y <y0) 
  y0=lpPoints[i].y; 
  else if(lpPoints[i].y>y1) 
  y1=lpPoints[i].y; 
} 
if(y0>=y1) return; 
 
// 初始化边表,第一个元素不用 
pET=new LPEdge[y1-y0+1]; 
for(i=0;i <=y1-y0;i++) 
{ 
  pET[i]= new Edge; 
  pET[i]->pNext=NULL; 
} 
 
for(i=0;i <nCount;i++) 
{ 
  j=(i+1)%nCount; // 组成边的下一点 
  if(lpPoints[i].y != lpPoints[j].y)// 如果该边不是水平的则加入边表 
  { 
  LPEdge peg;  // 指向该边的指针 
  LPEdge ppeg;  // 指向边指针的指针 
 
  // 构造边 
  peg =new Edge; 
  k=(lpPoints[i].y>lpPoints[j].y)?i:j; 
  peg->ymax=lpPoints[k].y; // 该边最大y坐标 
  k=(k==j)?i:j;  
  peg->x=(float)lpPoints[k].x; // 该边与扫描线焦点x坐标 
  if(lpPoints[i].y != lpPoints[j].y) 
    peg->dx=(float)(lpPoints[i].x-lpPoints[j].x)/(lpPoints[i].y-lpPoints[j].y);// 该边斜率的倒数 
  peg->pNext=NULL; 
 
  // 插入边 
  ppeg=pET[lpPoints[k].y-y0]; 
  while(ppeg->pNext) 
    ppeg=ppeg->pNext; 
  ppeg->pNext=peg; 
  }// end if 
}// end for i 
 
// 扫描 
for(i=y0;i <=y1;i++) 
{ 
  LPEdge peg0=pET[i-y0]->pNext; 
  LPEdge peg1=pET[i-y0]; 
  if(peg0)// 有新边加入 
  { 
  while(peg1->pNext) 
    peg1=peg1->pNext; 
  peg1->pNext=pAET->pNext; 
  pAET->pNext=peg0; 
  } 
 
  // 按照x递增排序pAET 
  peg0=pAET; 
  while(peg0->pNext) 
  { 
  LPEdge pegmax=peg0; 
  LPEdge peg1=peg0; 
  LPEdge pegi=NULL; 
 
  while(peg1->pNext) 
  { 
    if(peg1->pNext->x>pegmax->pNext->x) 
    pegmax=peg1; 
    peg1=peg1->pNext; 
  } 
  pegi=pegmax->pNext; 
  pegmax->pNext=pegi->pNext; 
  pegi->pNext=pAET->pNext; 
  pAET->pNext=pegi; 
  if(peg0 == pAET) 
    peg0=pegi; 
  } 
 
  // 遍历活边表,画线 
  peg0=pAET; 
  while(peg0->pNext) 
  { 
  if(peg0->pNext->pNext) 
  { 
    DrawLine((int)peg0->pNext->x,i,(int)peg0->pNext->pNext->x,i,pDC,nColor); 
    peg0=peg0->pNext->pNext; 
  } 
  else 
    break; 
  } 
 
  // 把ymax=i的节点从活边表删除并把每个节点的x值递增dx 
  peg0=pAET; 
  while(peg0->pNext) 
  { 
  if(peg0->pNext->ymax < i+2) 
  { 
    peg1=peg0->pNext; 
    peg0->pNext=peg0->pNext->pNext; //删除 
    delete peg1; 
    continue; 
  } 
  peg0->pNext->x+=peg0->pNext->dx; //把每个节点的x值递增dx 
  peg0=peg0->pNext; 
  } 
} 
 
// 删除边表 
for(i=0;i <y1-y0;i++) 
  if(pET[i]) 
  delete pET[i]; 
if(pAET) 
  delete pAET; 
if(pET) 
  delete[] pET; 
} 
【个人笔记】16 多边形填充与绘制 16 多边形填充与绘制 阅读详情

相关推荐

mfc 多边形扫描线填充算法

多边形扫描线填充 预览图: 这里给大家贴一下颜色框怎么用 //定义: COLORREF clr; //初始化 clr=RGB(255,0,0); //调用调色板 CColorDialog dlg; if(dlg.DoModal()==IDOK) clr=dlg.GetColor(); 这里:在多边形内部点击一点(x,y)oldColor:区域原色(这里我的是白色)newColor:...

quhongjuan12的博客 8049

多边形填充 | 计算机图形学(c++版MFC)

多边形填充 | 计算机图形学(c++版MFC) 直接上代码,不墨迹!!!

kndjg的博客 4652

图形学篇:多边形有效边表填充算法

什么是多边形? 多边形是由折线段组成的封闭图形 多边形的表示方法有哪些? 顶点表示法:使用顶点进行描述,但此时多边形仅仅是一些封闭线段,内部是空的,且不能直接进行填充上色 点阵表示法:使用大量的点进行描述,描述完成之后,得到的就是完整形态的多边形,内部已被填充,可直接针对点来进行上色 多边形的扫描转换就是从顶点表示法转换到点阵表示法的过程。 基础的填充多边形方式: 检查光栅上的每一个像素...

设计师养成记 1万+

计算机图形学 第4章 多边形填充

边缘填充算法是先求出多边形的每条边与扫描线的交点,然后将交点。

优快云_YJX的博客 1万+

快速多边形填充算法

多边形填充在图形、图像处理中经常用到。本文对已有的快速填充方法做了进一步的改进,减少了不必要的运算。对填充算法的思路给出了简要的描述,并给出了伪代码以及程序最终的运行结果。

sunyfeifei的专栏 8672

扫描线填充多边形算法详解与代码

扫描线填充多边形算法详解与代码首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色class MyPolygon { public: int m_VerticeNumber; CPoint m_Vertex[50]; COLORREF m_LineColor; }思路:   找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,通过

sherlockreal的博客 3万+

图形学初步----------多边形填充算法

参考博文: https://blog.youkuaiyun.com/xiaowei_cqu/article/details/7693985 https://blog.youkuaiyun.com/xiaowei_cqu/article/details/7712451 https://blog.youkuaiyun.com/wodownload2/article/details/52154207 https://blog.cs...

Arcobaleno 2万+

计算机图形学实验二 多边形的填充算法

接着,将该像素点的四周像素点依次加入一个队列中,然后逐个取出队列中的像素点,并将其颜色替换为所需填充的颜色。该算法的时间复杂度与填充的像素数量有关,通常为 O(m),其中 m 是填充的像素数量。本次实验理解多边形的表示方法,理解四连接和八连接的概念,学会了多边形的种子填充算法,多边形填充有扫描线算法、边界填充算法、色彩种子填充算法四种填充算法。答:四连接种子填充算法是指从种子像素的上、下、左、右四个方向进行填充,而八连接种子填充算法则是在四个基本方向的基础上,增加四个斜向(45度)方向的填充。

XIYOUMIN110的博客 1643

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

计算机图形学——区域填充算法 橡皮筋效果 本次实验的环境是使用vs提供的MFC框架,在鼠标交互输入中使用橡皮筋算法来实现多边形的输入。首先定义相应变量来保存输入的数据。 int m_pNumbers; //输入点的个数 CPoint m_pAccord[N], m_mousePoint; //保存输入的顶点信息和当前的鼠标所处位置 ......

阿蓬的个人博客 9086

多边形有效边表填充算法

<br />绘制多边形时用桶结构,其实类似于图里面的邻接表,从上到下是桶(bucket),右边链接的指针是边(edge).<br />class Bucket  //桶类<br />{<br />public:<br />    Bucket();<br />    virtual ~Bucket();<br />    int ScanLine;<br />    AET *p;//桶上的边表指针<br />    Bucket *next;<br />};<br />class Edge  //边类<b

tmljs1988的专栏 1万+

图形学C++多边形填充!!!!!!!

编译运行,左键为画出多边形,右键为填充 互相学习 互相借鉴!!!!!!!!!

任意画一个多边形,用边缘填充算法填充

任意画一个多边形,并用边(缘)填充算法进行填充。(多边形的顶点坐标存放在数组中,坐标值由键盘输入) #include&lt;stdio.h&gt; #include&lt;graphics.h&gt; //边缘填充 void draw(int a,int b){ for(int i=a;i&lt;500;i++){ if(getpixel(i,b)==0) putpixel(i,b,W...

一只睡不醒的猪 5647

C++ 多边形边缘填充算法

C++ 多边形边缘填充算法主要于图像填充的开发,代码调理清晰,有助于图像处理方面开发。

多边形扫描线填充算法

按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。对于一条扫描线填充过程可以分为四个步骤:1. 求交:计算扫描线与多边形各边的交点;2.排序:把所有交点按x值递增顺序排序;3. 配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,4.着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。

2401_85042349的博客 2288

多边形填充的扫描线c++算法

适用于图形学的课程设计类代码,实用性较高,对广大同学有帮助的

C++多边形有效边填充算法

图形学作业题,多边形有效边填充算法,C++实现。

多边形填充算法实现

 //////////////////////////////////////////////////////////////////////////////////////////////////// 功能:  填充多边形//// 参数:  lpPoints: 指向顶点坐标数组的指针,数组类型为POINT,多边形由它们顺次封闭连接得到//    nCount:  顶点的个数//    nCo

nauty的专栏 2362

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+
上一篇: 在Linux下执行一个文件时候提示“权限不够”的解决办法
下一篇: 图形编程中释放资源的几个函数
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyJiang.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值