|
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; } |
相关推荐
mfc 多边形扫描线填充算法
多边形扫描线填充 预览图: 这里给大家贴一下颜色框怎么用 //定义: COLORREF clr; //初始化 clr=RGB(255,0,0); //调用调色板 CColorDialog dlg; if(dlg.DoModal()==IDOK) clr=dlg.GetColor(); 这里:在多边形内部点击一点(x,y)oldColor:区域原色(这里我的是白色)newColor:...
多边形填充 | 计算机图形学(c++版MFC)
多边形填充 | 计算机图形学(c++版MFC) 直接上代码,不墨迹!!!
图形学篇:多边形有效边表填充算法
什么是多边形? 多边形是由折线段组成的封闭图形 多边形的表示方法有哪些? 顶点表示法:使用顶点进行描述,但此时多边形仅仅是一些封闭线段,内部是空的,且不能直接进行填充上色 点阵表示法:使用大量的点进行描述,描述完成之后,得到的就是完整形态的多边形,内部已被填充,可直接针对点来进行上色 多边形的扫描转换就是从顶点表示法转换到点阵表示法的过程。 基础的填充多边形方式: 检查光栅上的每一个像素...
计算机图形学 第4章 多边形填充
边缘填充算法是先求出多边形的每条边与扫描线的交点,然后将交点。
快速多边形填充算法
多边形填充在图形、图像处理中经常用到。本文对已有的快速填充方法做了进一步的改进,减少了不必要的运算。对填充算法的思路给出了简要的描述,并给出了伪代码以及程序最终的运行结果。
扫描线填充多边形算法详解与代码
扫描线填充多边形算法详解与代码首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色class MyPolygon { public: int m_VerticeNumber; CPoint m_Vertex[50]; COLORREF m_LineColor; }思路: 找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,通过
图形学初步----------多边形填充算法
参考博文: 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...
计算机图形学实验二 多边形的填充算法
接着,将该像素点的四周像素点依次加入一个队列中,然后逐个取出队列中的像素点,并将其颜色替换为所需填充的颜色。该算法的时间复杂度与填充的像素数量有关,通常为 O(m),其中 m 是填充的像素数量。本次实验理解多边形的表示方法,理解四连接和八连接的概念,学会了多边形的种子填充算法,多边形填充有扫描线算法、边界填充算法、色彩种子填充算法四种填充算法。答:四连接种子填充算法是指从种子像素的上、下、左、右四个方向进行填充,而八连接种子填充算法则是在四个基本方向的基础上,增加四个斜向(45度)方向的填充。
计算机图形学——多边形区域填充算法
计算机图形学——区域填充算法 橡皮筋效果 本次实验的环境是使用vs提供的MFC框架,在鼠标交互输入中使用橡皮筋算法来实现多边形的输入。首先定义相应变量来保存输入的数据。 int m_pNumbers; //输入点的个数 CPoint m_pAccord[N], m_mousePoint; //保存输入的顶点信息和当前的鼠标所处位置 ......
多边形有效边表填充算法
<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
图形学C++多边形填充!!!!!!!
编译运行,左键为画出多边形,右键为填充 互相学习 互相借鉴!!!!!!!!!
任意画一个多边形,用边缘填充算法填充
任意画一个多边形,并用边(缘)填充算法进行填充。(多边形的顶点坐标存放在数组中,坐标值由键盘输入) #include<stdio.h> #include<graphics.h> //边缘填充 void draw(int a,int b){ for(int i=a;i<500;i++){ if(getpixel(i,b)==0) putpixel(i,b,W...
C++ 多边形边缘填充算法
C++ 多边形边缘填充算法主要于图像填充的开发,代码调理清晰,有助于图像处理方面开发。
多边形扫描线填充算法
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。对于一条扫描线填充过程可以分为四个步骤:1. 求交:计算扫描线与多边形各边的交点;2.排序:把所有交点按x值递增顺序排序;3. 配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,4.着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。
多边形填充的扫描线c++算法
适用于图形学的课程设计类代码,实用性较高,对广大同学有帮助的
C++多边形有效边填充算法
图形学作业题,多边形有效边填充算法,C++实现。
多边形填充算法实现
//////////////////////////////////////////////////////////////////////////////////////////////////// 功能: 填充多边形//// 参数: lpPoints: 指向顶点坐标数组的指针,数组类型为POINT,多边形由它们顺次封闭连接得到// nCount: 顶点的个数// nCo
windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7
打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。
8049



被折叠的 条评论
为什么被折叠?



