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

news2024/11/17 17:51:43

目录

  • 前驱知识
  • 多边形的扫描转换
  • 有效边表填充算法
    • 原理
    • 边界像素处理原则
      • 怎么算交点
      • 有效边
    • 桶表与边表
      • 桶表表示法
  • 边缘填充算法
    • 填充过程
    • 在这里插入图片描述
  • 区域填充算法/种子填充算法
    • 种子填充算法
    • 扫描线种子填充算法 (更有效)

前驱知识

  • 了解扫描转换的基本概念。
  • 熟练掌握多边形有效边表填充算法。
  • 掌握多边形边缘填充算法。
  • 熟练掌握区域四邻接点和八邻接点区域填充算法。
  • 掌握区域扫描线种子填充算法。

无论使用哪种着色模式,都意味着要使用指定颜色为多边形边界内的每一个像素着色。

在这里插入图片描述

在这里插入图片描述

多边形的表示 有两种:⑴顶点表示法;⑵点阵表示法

多边形的扫描转换

定义:将多边形的描述从顶点表示法变换到点阵表示法的过程,称为多边形的扫描转换。

即从多边形的顶点信息出发,求出位于多边形内部的各个像素点信息,并将其颜色值写入帧缓冲的相应单元中。

在这里插入图片描述
多边形可以使用平面着色模式(flat shading mode)或光滑着色模式(smooth shading mode)填充。



多边形填充的主要算法是扫描线算法
先确定多边形覆盖的扫描线条数,对每一条扫描线,计算扫描线与多边形边界的交点区间,如果能判断该区间在多边形内部,则将其内的像素绘制为指定的颜色。

扫描线算法在处理每条扫描线时,需要与多边形的所有边求交,处理效率很低。改进的算法是有效边表算法

对一条扫描线的填充一般分为以下4个步骤

  • 求交:计算扫描线与多边形各边的交点;
  • 排序:把扫描线上所有交点按递增顺序进行排序;
  • 配对:将第一个交点与第二个交点,第三个交点与第四个交点等等进行配对,每对交点代表扫描线与多边形的一个相交区间。
  • 着色:把区间内的像素置为填充色。

种子填充算法是从区域内的一个种子位置开始,由内向外用填充颜色绘制种子及其相邻像素直到颜色不同的边界像素为止。
种子填充算法主要分为4邻接点算法和8邻接点算法。


有效边表填充算法

原理

填充原理是按照扫描线从小到大的移动顺序,计算当前扫描线与有效边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,最后用指定颜色填充区间内的所有像素,即完成填充工作。

有效边表填充算法已成为目前最为有效的多边形填充算法之一。

边界像素处理原则

填充左下角为(1,1),右上角为(3,3)的正方形时,若将边界上的所有像素全部填充,就得到图示的结果。
在多边形填充过程中,常采用“左闭右开”和“下闭上开”的原则对边界像素进行处理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

怎么算交点

这里 相对于 扫描线 的位置都是上下关系,不是左右关系。
在这里插入图片描述

有效边

在这里插入图片描述
在这里插入图片描述
为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息

因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。

桶表与边表

为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息。因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。

桶表表示法

桶表是按照扫描线顺序管理边出现情况的一个数据结构。

  • 构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为桶(bucket),对应多边形覆盖的每一条扫描线。
  • 在这里插入图片描述

桶类的代码

class CBucket  
{
public:
		CBucket();
		virtual ~CBucket();
public:
		int      ScanLine;   //扫描线
		CAET     *p;      //桶上的边表指针
		CBucket  *next;
};

  • 在这里插入图片描述

在这里插入图片描述



边缘填充算法

远离/定义:
边缘填充算法是先求出多边形的每条边与扫描线的交点,然后将交点右侧的所有像素颜色全部取为补色(或反色)。按任意顺序处理完多边形的所有边后,就完成了多边形的填充任务。

边缘填充算法利用了图像处理中的求“补”或求“反”的概念,对于黑白图像,求补就是把RGB(1,1,1)(白色)的像素置为RGB(0,0,0)(黑色),反之亦然;对于彩色图像,求补就是将背景色置为填充色,反之亦然。求补的一条基本性质是一个像素求补两次就恢复为原色。如果多边形内部的像素被求补偶数次,保持原色,如果被求补奇数次,显示填充色。

填充过程

在这里插入图片描述
过程:
(下图顺序)从左到右从上到下在这里插入图片描述
代码:

void CTestView::FillPolygon(CDC *pDC) 
{
      COLORREF BClr=RGB(255,255,255);//背景色
      COLORREF FClr=GetClr;//填充色
      int yMin,yMax;//边的最小y值与最大y值
      double x,y,k;//x,y当前点,k斜率的倒数
      for(int i=0;i<7;i++)//循环多边形所有边
     {
	int j=(i+1)%7;
	k=(P[i].x-P[j].x)/(P[i].y-P[j].y);//计算1/k
	if(P[i].y<P[j].y)//得到每条边y的最大值与最小值
	{
		yMin=Round(P[i].y);
		yMax=Round(P[j].y);
		x=P[i].x;//得到x|ymin
	}
	else
	{
		yMin=Round(P[j].y);
		yMax=Round(P[i].y);
		x=P[j].x;
	}
		
	for(y=yMin;y<yMax;y++)//沿每一条边循环扫描线
	{
	//对每一条扫描线与边的交点的右侧像素循环   
                     for(int m=Round(x);m<MaxX;m++)
                     //MaxX为包围盒的右边界
	         {
		if(FClr==pDC->GetPixel(m,Round(y)))			                      pDC->SetPixelV(m,Round(y),BClr);
		else
		          pDC->SetPixelV(m,Round(y),FClr);	
		}
		x+=k; 
	}
     }
}


在这里插入图片描述


区域填充算法/种子填充算法

原理
种子填充算法是从区域内任一个种子像素位置开始,由内向外将填充色扩散到整个多边形区域的填充过程。

优点是能对具有任意复杂闭合边界的区域进行填充。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

种子填充算法

定义;

  • 从种子像素点开始,使用四邻接点方式搜索下一像素点的填充算法称为四邻接点填充算法。
  • 从种子像素点开始,使用八邻接点方式搜索下一像素点的填充算法称为八邻接点填充算法。

八邻接点填充算法的设计和四邻接点填充算法基本相似,只要把搜索方式由四邻接点修改为八邻接点即可。

种子填充算法一般要求区域边界色和填充色不同,输入参数只有种子坐标位置填充颜色

原理
在这里插入图片描述
代码:

void CTestView::FillPolygon(CDC *pDC)//填充多边形
{
	COLORREF BoundaryClr=RGB(0,0,0);//边界色
	COLORREF PixelClr;//当前像素的颜色
	pHead=new CStackNode;//建立栈头结点
	pHead->next=NULL;//栈的头结点总是为空
	Push(Seed); //种子像素入栈
	while(NULL!=pHead->next)//如果栈不为空
	{
		CP2 PopPoint;
		Pop(PopPoint); //种子像素出栈
		pDC->SetPixelV(Round(PopPoint.x),
                                           Round(PopPoint.y),SeedClr);
		PointLeft.x=PopPoint.x-1;//左方像素
		PointLeft.y=PopPoint.y;
		PixelClr=pDC->GetPixel(Round(PointLeft.x),
                                          Round(PointLeft.y));
		if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
			Push(PointLeft);//左方像素入栈
		
PointTop.x=PopPoint.x;
		PointTop.y=PopPoint.y+1;//上方像素
		PixelClr=pDC->GetPixel(Round(PointTop.x),
                                               Round(PointTop.y));
		if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
			Push(PointTop);	//上方像素入栈
		PointRight.x=PopPoint.x+1;//右方像素
		PointRight.y=PopPoint.y;
		PixelClr=pDC->GetPixel(Round(PointRight.x),
                                                 Round(PointRight.y));
		if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
			Push(PointRight);//右方像素入栈	
		PointBottom.x=PopPoint.x;
		PointBottom.y=PopPoint.y-1;//下方像素
		PixelClr=pDC->GetPixel(Round(PointBottom.x),
                                               Round(PointBottom.y));
		if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
			Push(PointBottom);//下方像素入栈
		}
		pDC->TextOut(rect.left+50,rect.bottom-20,"填充完毕");
		delete pHead;
		pHead = NULL;
}

扫描线种子填充算法 (更有效)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九龙证券|兔年行情将打响,A股2月上涨概率最高

兔年行情行将正式打响&#xff0c;迎接投资者的会否是 “兔”飞猛进的行情呢&#xff1f;证券时报数据宝带您一起透视兔年股票上涨概率。 A股新年后上扬概率高 从近10年A股新年后的市场体现来看&#xff0c;头几个买卖日大概率上涨。 数据宝统计&#xff0c;曩昔10年&#xf…

国内在线图表工具,你能说出几个?

之前写过很多篇在线图表、数据分析处理类工具的内容&#xff0c;但都是针对单个问题写的&#xff0c;没有将其整合起来&#xff0c;今天就借着这个问题&#xff0c;做个国内在线图表工具的合集。 一共5大类&#xff0c;每一类各介绍一个代表性工具&#xff0c;全文较长&#x…

【c语言进阶】文件操作知识大全上

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;> c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是…

15. XML解析

1. 什么是 XML&#xff1f; XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;。 a. XML 是一种很像HTML的标记语言。 b. XML 的设计宗旨是传输数据&#xff0c;而不是显示数据。 c. XML 标签没有被预定义。您需要自行定义标签。 d. XML 被设计为具有自…

Tomcat详解

Tomcat 是一个 HTTP 服务器. 前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. 同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端. HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实…

星戈瑞--磺化CY7标记活性脂Sulfo CY7-NHS注意事项你知道那些?

Sulfo-Cy7 NHS酯是一种磺化、亲水性和高度水溶性染料。该试剂允许制备Cy7标记的生物分子&#xff0c;特别适用于标记脆弱的蛋白质和易变性的蛋白质。染料标记的分子可用于各种研究相关的实验。近红外荧光成像利用了生物组织在特定波长范围内的透明度。在活生物体中&#xff0c;…

2. Kimball的DW/BI架构解析

文章目录Kimball的DW/BI架构1. 业务系统&#xff08;数据源系统&#xff09;2. 获取-转换-加载&#xff08;ETL&#xff09;系统3. 用于支持BI&#xff08;商业智能&#xff09;决策的展现区4. 商业智能应用引言&#xff1a;DW&#xff0c;即Data Warehouse&#xff0c;数据仓库…

LLA: Loss-aware Label Assignment for Dense Pedestrian Detection 原理与代码解析

paper&#xff1a;LLA: Loss-aware Label Assignment for Dense Pedestrian Detectioncode&#xff1a;https://github.com/Megvii-BaseDetection/LLA背景标签分配由于对检测器的性能影响很大&#xff0c;在通用目标检测中得到了广泛的研究&#xff0c;但是密集行人检测中的标签…

【SpringCloud复习巩固】Gateway

目录 一.统一网关Gateway 1.1为什么需要网关 1.2网关的技术实现 1.3网关的作用 1.4搭建网关服务 1.5路由断言工厂Route Predicate Factory 1.6路由过滤器GatewayFilter 1.7全局过滤器GlobalFilter 1.8过滤器执行顺序 1.9跨域问题解决 一.统一网关Gateway 1.1为什么需…

《流浪地球2》里的硬核科技,IT人带入了

《流浪地球2》不负期待&#xff0c;上映后口碑和热度一路高歌猛进&#xff0c;霸坐春节档&#xff0c;稳居票房TOP2。硬核科技惊喜不断&#xff0c;如喷出冲天蓝光的行星发动机、洞悉一切的量子计算机、高耸入云的太空电梯…… 逼真的特效质感以及浓厚的重工业美学掀起科技新热…

UE4中修改模型的中心点

UE4系列文章目录 文章目录UE4系列文章目录前言一、增加scenen空组件前言 在UE4中的模型中心点一般都在模型的中点&#xff0c;如果是门这样的模型&#xff0c;我们就不能绕中心点旋转了&#xff0c;不然会觉得很奇怪。但是默认的静态网格体中心点都在物体中心&#xff0c;那我…

易观千帆 | 2022年12月银行APP月活跃用户规模盘点

易观千帆&#xff1a;12月手机银行服务应用活跃人数51688.69万&#xff0c;环比下降1.81%。结合历史数据&#xff0c;2022年9月达到全年高峰的54191.75万&#xff0c;总体来看保持波动增长。12月农商行手机银行服务应用活跃人数1580.59万&#xff0c;环比下降3.01%。农商行手机…

scrapy的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

K8s简介之什么是K8s

1.概述 欢迎来到K8s入门课程。Kubernetes&#xff0c;也被称为K8s或Kube&#xff0c;是谷歌推出的业界最受欢迎的容器编排器。本K8s教程由一系列关于K8s的文章组成。在第一部分&#xff0c;我们将讨论什么是K8s和K8s的基本概念。 本课程是专为初学者开设的&#xff0c;你可以…

Java个人遇到问题汇总

问题汇总1. 虚拟机1.1 CentOS71) 连不上网络问题解决1.2 Docker1) 私服配置无法重启docker问题解决后续2. SSMP2.1 Spring1) 测试类一直空指针问题解决2.2 MyBatis MyBatis-Plus1) IDEA加入方言后SQL语句依然不提示解决2) MP更新数据,更新了其他列问题解决3.SpringBoot3.1 Thym…

nginx学习笔记8(小滴课堂)

nginx第三方利器---OpenRestyLua介绍 OpenRestyLua的相关环境准备 我们先来去安装我们的OpenResty: 我们按照官网的要求去配置就可以了&#xff1a; 按照官网的步骤一步一步去走就可以了。 然后我们开始去安装我们的OpenResty: 这里有非常多的安装包吧&#xff0c;我们到时候需…

硬件---计算机概论

电脑硬件的五大单元 输入单元&#xff1a;包括键盘、鼠标、卡片阅读机、扫描仪、手写板、触控屏幕等等一堆&#xff1b;主机部分(控制单元、算数逻辑单元与主存储器)&#xff1a;这个就是系统单元&#xff0c;被主机机壳保护住了&#xff0c;里面含有一堆板子、CPU 与主存储器…

为什么u盘不显示数据?u盘不显示数据恢复的3种方法

虽然u盘在数据备份、重装系统或其他领域中都能发挥很大的作用&#xff0c;但是在使用过程中难免会遇到一些问题&#xff0c;比如u盘数据不显示&#xff01;那么&#xff0c;遇到u盘不显示数据怎么解决呢&#xff1f;阅读本文&#xff0c;您将知晓u盘不显示数据的常见原因和相应…

Deep Learning Tuning Playbook(中译版)

前言 由五名研究人员和工程师组成的团队发布了《Deep Learning Tuning Playbook》&#xff0c;来自他们自己训练神经网络的实验结果以及工程师的一些实践建议&#xff0c;目前在Github上已有1.5k星。原项目地址本文为《Deep Learning Tuning Playbook》中文翻译版本&#xff0…

Vuex状态管理器

目录 1、什么是vuex 2、vuex的使用场景&#xff1a; 3、vuex的工作方式&#xff1a; 4、vuex的核心API ​ &#xff08;1&#xff09;state&#xff1a; &#xff08;2&#xff09;mutations &#xff08;3&#xff09;actions&#xff1a;通过actions去触发mutations中…