计算机图形学07:有效边表法的多边形扫描转换
创始人
2024-05-28 15:59:04
0

在这里插入图片描述

作者:非妃是公主
专栏:《计算机图形学》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

文章目录

  • 专栏推荐
  • 专栏系列文章
  • 一、算法原理
  • 二、OpenGL代码实现
  • 三、效果展示
  • the end……

专栏推荐

专栏名称专栏地址
软件工程专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统专栏——操作系统
软件测试专栏——软件测试
机器学习专栏——机器学习
数据库专栏——数据库
算法专栏——算法

专栏系列文章

文章名称文章地址
直线生成算法(DDA算法)计算机图形学01——DDA算法
中点BH算法绘制直线计算机图形学02——中点BH算法
改进的中点BH算法计算机图形学03——改进的中点BH算法
中点Bresenham画椭圆计算机图形学04——中点BH绘制椭圆
中点BH算法绘制任意斜率直线计算机图形学05——中点BH算法绘制任意斜率的直线
中点Bresenham画圆计算机图形学06——中点BH算法画圆
有效边表法的多边形扫描转换计算机图形学07——有效边表法绘制填充多边形
中点BH算法绘制抛物线 100x=y2100x = y^2100x=y2计算机图形学08——中点BH绘制抛物线
二维观察之点的裁剪计算机图形学09——二维观察之点裁剪
二维观察之线的裁剪计算机图形学10——二维观察之线裁剪
二维观察之多边形的裁剪计算机图形学11——二维观察之多边形裁剪
二维图形的几何变换计算机图形学12——二维图形几何变换
三维图形的几何变换计算机图形学13——三维图形几何变换
三维图形的投影变换计算机图形学14——三维图形投影变换

计算机图形学(英语:computer graphics,缩写为CG)是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科,是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形,事实上同时包括了二维图形以及影像处理。


一、算法原理

有效边表法是X射线扫描转换的一种改进实现方式,相比于X射线方法,有效边表法由于不需要判断虚实交点,整体效率更高。

通过构造边表,然后随着X射线的移动不断地维护有效边表,通过两两配对边表中的有效边点亮像素,实现多边形的绘制。

具体原理如下:

在这里插入图片描述

在这里插入图片描述

排序方式按照x_ymin(y取到最小值的时候,x值的大小)排,x_ymin相等时按照1k\frac{1}{k}k1​大小排,稍加思考会发现,正常情况下,不会出现相等情况。

在这里插入图片描述

在这里插入图片描述

由于配对原则,在顶点相交处,会影响到配对,采用的做法是,在影响配对的情况下进行ymax=ymax−1ymax=ymax-1ymax=ymax−1处理,通过此来保证在进行有效边交替的时候不会出现错误(即保证有效边表中的有效边数量为偶数)。

在这里插入图片描述

算法流程(本人在实现的时候,为编码符合自己的逻辑方式,先增加节点、再填充像素、填充后即检查是否需要删除如需要删除、最后进行各个有效边x_ymin属性的+1k+\frac{1}{k}+k1​):

在这里插入图片描述


二、OpenGL代码实现

OpenGL代码实现如下:

// 有效边表法(AET)绘制填充多边形
void AETPolygon(vector pnts) {vector::iterator min_iter = min_element(pnts.begin(), pnts.end());vector::iterator max_iter = max_element(pnts.begin(), pnts.end());int min_y = min_iter->y;int max_y = max_iter->y;int dist = max_y - min_y + 1;vector ET;		// 边表for (int i = 0; i < dist; i++) {ET.push_back(new ETNode(0, 0, 0));}for (int i = 0; i < pnts.size(); i++) { // 建立边表// 建立边表节点的属性值double x_ymin, y_max, rev_k;if (pnts[i].y > pnts[(i + 1) % pnts.size()].y) {	// 找出y最小值对应的x值x_ymin = pnts[(i + 1) % pnts.size()].x;y_max = pnts[i].y;// 如果为一个顶点的情况,y_max--if ((pnts[(i - 1 + pnts.size()) % pnts.size()].y - pnts[i].y) * (pnts[(i + 1 + pnts.size()) % pnts.size()].y - pnts[i].y) < 0) {y_max--;}}else {x_ymin = pnts[i].x;y_max = pnts[(i + 1) % pnts.size()].y;// 如果为一个顶点的情况,y_max--if ((pnts[(i + pnts.size()) % pnts.size()].y - pnts[i + 1].y) * (pnts[(i + 2 + pnts.size()) % pnts.size()].y - pnts[i + 1].y) < 0) {y_max--;}}// 计算 1/krev_k = (double)(pnts[(i + 1) % pnts.size()].x - pnts[i].x) / (pnts[(i + 1) % pnts.size()].y - pnts[i].y);// 计算 (1/斜率)ETNode* tmp = new ETNode(x_ymin, y_max, rev_k);ETNode* tmpFirstNode = ET[x_ymin - min_y];// 寻找合适的插入位置while (tmpFirstNode->next != nullptr && *(tmpFirstNode->next) < *tmp){tmpFirstNode = tmpFirstNode->next;}// 插入tmp->next = tmpFirstNode->next;tmpFirstNode->next = tmp;}// 建立活动边表ETNode* AET = new ETNode(0, 0, 0); // AET为头节点,不储存边表节点,后续节点才储存// 从下到上进行 x 射线扫描for (int i = min_y; i < max_y; i++) {ETNode* tmp_ETNode = ET[i - min_y];ETNode* tmp_AETNode = AET;while (tmp_ETNode->next != nullptr) {tmp_AETNode = AET;// 寻找AET中的插入位置while (tmp_AETNode->next != nullptr && *(tmp_AETNode->next) < *(tmp_ETNode->next)) {tmp_AETNode = tmp_AETNode->next;}//ET[i - min_y]->next = tmp_ETNode->next->next; 将tmp->next加入到 AET中//tmp_ETNode->next->next = tmp_AETNode->next;//tmp_AETNode->next = tmp_ETNode->next;//tmp_ETNode = ET[i - min_y];// 将tmp加入到 AET 中ETNode* tmp = new ETNode(tmp_ETNode->next->x_ymin, tmp_ETNode->next->y_max, tmp_ETNode->next->rev_k);tmp->next = tmp_AETNode->next;tmp_AETNode->next = tmp;tmp_ETNode = tmp_ETNode->next;}// 添加完以后进行画点tmp_AETNode = AET;while (tmp_AETNode->next != nullptr && tmp_AETNode->next->next != nullptr) {int fillBegin = (int)(tmp_AETNode->next->x_ymin + 0.5);int fillEnd = (int)(tmp_AETNode->next->next->x_ymin + 0.5);glColor3f(0.0f, 1.0f, 0.0f);			// 设置颜色为绿色进行填充glBegin(GL_POINTS);for (int j = fillBegin; j <= fillEnd; j++) {glVertex2i(j, i);}			glEnd();// 填充之后删除y=y_max的边if (i == tmp_AETNode->next->y_max || i == tmp_AETNode->next->next->y_max) {if (i == tmp_AETNode->next->y_max && i == tmp_AETNode->next->next->y_max) { // 删两个ETNode* del = tmp_AETNode->next;tmp_AETNode->next = tmp_AETNode->next->next;delete del;del = tmp_AETNode->next;tmp_AETNode->next = tmp_AETNode->next->next;delete del;}else if(i == tmp_AETNode->next->y_max) { // 删第一个ETNode* del = tmp_AETNode->next;tmp_AETNode->next = tmp_AETNode->next->next;delete del;tmp_AETNode = tmp_AETNode->next;}else {			// 删第二个ETNode* del = tmp_AETNode->next->next;tmp_AETNode->next->next = tmp_AETNode->next->next->next;delete del;tmp_AETNode = tmp_AETNode->next;}continue;}tmp_AETNode = tmp_AETNode->next->next;}// 更新AET表中的x值tmp_AETNode = AET;while (tmp_AETNode->next != nullptr){tmp_AETNode->next->x_ymin += tmp_AETNode->next->rev_k;tmp_AETNode = tmp_AETNode->next;}}// 进行析构// 析构AETETNode* AEThead = AET;while (AEThead != nullptr) {ETNode* del = AEThead;AEThead = AEThead->next;delete del;}// 析构ETfor (int i = 0; i < ET.size(); i++) {ETNode* EThead = ET[i];while (EThead != nullptr) {ETNode* del = EThead;EThead = EThead->next;delete del;}}
}

三、效果展示

有效边表法的多边形扫描转换效果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


the end……

有效边表法的多边形扫描转换算法到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

😘😘😘 我是Cherries,一位计算机科班在校大学生,写博客用来记录自己平时的所思所想!
💞💞💞 内容繁杂,又才疏学浅,难免存在错误,欢迎各位大佬的批评指正!
👋👋👋 我们相互交流,共同进步!

:本文由非妃是公主发布于https://blog.csdn.net/myf_666,转载请务必标明原文链接:https://blog.csdn.net/myf_666/article/details/128226399

相关内容

热门资讯

江苏多个高速入口临时关闭! 转自:扬子晚报【江苏高速】省交通综合执法局:5月5日16:00,目前,全省高速公路总体运行平稳,通行...
五一假期14.67亿人次跨区域... 【#五一假期14.67亿人次跨区域流动#】5月5日,记者从交通运输部获悉,劳动节假期第5日,预计全社...
明天上班上学,北京逐渐转晴升温... 转自:北京日报客户端明天(6日)天气逐渐转晴,气温逐步回升,记得调整好闹钟,准备上班上学喽!预计周三...
传壳牌(SHEL.US)正探索... 据媒体援引知情人士消息报道,壳牌(SHEL.US)正在探索收购其竞争对手英国石油(BP.US)的可能...
吃粥、绘彩蛋,来海淀苏家坨体验... 转自:北京日报客户端5月5日,海淀区苏家坨镇梁家园村文化活动中心,千斤粥米熬成六大锅“百家粥”,邀村...
科思科技:5月5日召开董事会会... 科思科技(SH 688788,收盘价:56.5元)5月5日晚间发布公告称,公司第三届第二十一次董事会...
科思科技拟斥3000万至500... 2025年5月5日,深圳市科思科技股份有限公司召开第三届董事会第二十一次会议等,全票审议通过以集中竞...
康力电梯原实控人王友林逝世 配... 5月5日,康力电梯(002367)发布公告,公司控股股东、实际控制人因王友林逝世而发生变更。王友林于...
东信和平:关于公司董事辞职的公...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 证券代码:00201...
欣天科技5%以上股东薛枫拟减持... 欣天科技2025年5月6日公告,持股5%以上股东薛枫因个人资金需求拟减持不超3%股份。薛枫持有17,...
错峰游、国风游盛行,“网红城市... 转自:扬子晚报今年“五一”假期旅游市场活力四射,低线城市旅游消费加速释放,境内游、出境游双向火爆。途...
老凤祥:子公司与上海久事体育等... 人民财讯5月5日电,老凤祥(600612)5月5日晚间公告,公司下属子公司上海老凤祥有限公司与上海久...
软通动力股东CEL Bravo... 软通动力4月30日公告,股东CEL Bravo Limited因自身资金安排拟减持不超1%股份,涉资...
电连技术持股5%以上股东任俊江... 电连技术近日发布公告,持股5%以上股东任俊江因个人资金需求,计划减持公司股份。股东基本情况截至公告披...
五一返程车流高峰杀到!新疆这些... 5月5日,正值“五一”假期收官之日,自治区交通运输厅发布返程安全出行提示,提醒广大司乘人员,当前返程...
美的集团(000333.SZ)... 美的集团(000333.SZ)公告,公司截至2025年4月30日以集中竞价交易方式累计回购公司A股股...
剧痛!多地已出现蜈蚣!看到赶紧... 来源:厦门日报 “五一”假期 正是出行游玩的好时机 但放松享受的同时 一定小心别被它“亲”上祸从天降...
首届“巴丹杯”2025春季赛马... 转自:草原云5月3日,首届“巴丹杯”2025春季赛马赛驼大会在阿拉善右旗巴丹吉林沙漠旅游区的巴丹湖景...
南方多地需警惕雷暴大风或冰雹天... 近期,江南、华南和贵州等地多降水和强对流天气。今天(5月5日)午后到夜间,江南东南部、华南大部等地的...
泸天化回购进展:已回购2359... 泸天化于2025年4月30日发布回购公司股份进展公告,披露了截至该日的回购情况。回购方案回顾2024...