基本图形的光栅化算法

如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。

图形生成的概念
图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形。
图形的扫描转换:在光栅显示器等数字设备上确定一个最佳逼近于图形的象素集的过程。

直线段的扫描转换
直线的绘制要求

(1)直线要直;

(2)直线的端点要准确,无定向性无断裂;

(3)直线的亮度、色泽要均匀;

(4)画线的速度要快;

(5)具有不同的色泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。

逐点比较法:

数值微分法(DDA法):
增量算法
直观、易实现
不利于用硬件实现
x(i+1) = x(i) + 1

y(i+1) = y(i) + k

中点Bresenhan算法:
算法原理:根据直线的斜率确定或选择变量在x或y方向上每次递增一个单位,而另一方向的增量为1或0,它取决于实际直线与相邻象素点的距离,这一距离称为误差项。

中点Bresenham算法——算法步骤
输入直线的两端点P0(x0,y0)和P1(x1,y1)。
计算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
绘制点(x,y)。判断D的符号。若D<0,则(x,y)更新为(x+1,y+1),D更新为D+2△x-2△y;否则(x,y)更新为(x+1,y), D更新为D-2△y。
当直线没有画完时,重复上一步骤,否则结束。

改进的Bresenhan算法——算法步骤
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。否则结束。

圆的扫描转换
解决的问题:绘出圆心在原点,半径为整数R的圆x2+y2=R2。

简单方程产生圆弧:
算法原理:利用其函数方程,直接离散计算。

中点Bresenham画圆——算法步骤
1.输入圆的半径R。
2.计算初始值d=1-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
5.当x<y时,重复步骤3和4。否则结束。

多边形的扫描转换与区域填充:
多边形的扫描转换主要是通过确定穿越区域的扫描线的覆盖区间来填充。
区域填充是从给定的位置开始涂描直到指定的边界条件为止。

多边形的扫描转换:
顶点表示用多边形的顶点序列来刻划多边形。
点阵表示是用位于多边形内的象素的集合来刻划多边形。
扫描转换多边形:从多边形的顶点信息出发,求出位于其内部的各个象素,并将其颜色值写入帧缓存中相应单元的过程。

X-扫描线算法——原理
基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的所有象素。

X-扫描线算法——算法步骤
1.确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax)。
2.从y=ymin到y=ymax,每次用一条扫描线进行填充。
3.对一条扫描线填充的过程可分为四个步骤:

求交;排序;交点配对;区间填色。

X-扫描线算法——取整规则
交点的取整规则:使生成的像素全部位于多边形之内。(用于直线等图元扫描转换的四舍五入原则可能导致部分像素位于多边形之外,从而不可用)。
假定非水平边与扫描线y=e相交,交点的横坐标为x,规则如下:

规则1:X为小数,即交点落于扫描线上两个相邻像素之间时:
交点位于左边界之上,向右取整;
交点位于右边界之上,向左取整;

规则2:边界上象素的取舍问题,避免填充扩大化。规定落在右边边界上的像素不予填充。(具体实现时,只要对扫描线与多边形的相交区间左闭右开)
规则3:当扫描线与多边形顶点相交时,交点的取舍,保证交点正确配对。
解决方法:

当扫描线与多边形的顶点相交时,
若共享顶点的两条边分别落在扫描线的两边,交点只算一个;
若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。

实际处理:只要检查顶点的两条边的另外两个端点的Y值,两个Y值中大于交点Y值的个数是0,1,2,来决定取0,1,2个交点。

改进的有效边表算法:
改进原理:
处理一条扫描线时,仅对有效边求交。
利用扫描线的连贯性。
利用多边形边的连贯性。

改进的有效边表算法(Y连贯性算法)
有效边(Active Edge):指与当前扫描线相交的多边形的边,也称为活性边。
有效边表(Active Edge Table, AET):把有效边按与扫描线交点x坐标递增的顺序存放在一个链表中,此链表称为有效边表。
有效边表的每个结点:

x
ymax
1/k
next

改进的有效边表算法——构造边表
首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,称为一个桶,则对应多边形覆盖的每一条扫描线


将每条边的信息链入与该边最小y坐标(ymin )相对应的桶处。也就是说,若某边的较低端点为ymin,则该边就放在相应的扫描线桶中。
每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax。
x|ymin
ymax
1/k
NEXT
同一桶中若干条边按X|ymin由小到大排序,若X|ymax 相等,则按照1/k由小到大排序。

改进的有效边表算法——算法步骤
(1)初始化:构造边表,AET表置空;
(2)将第一个不空的ET表中的边与AET表合并;
(3)由AET表中取出交点对进行填充。填充之后删除y=ymax的边;
(4)yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并ET表中y=yi+1桶中的边,按次序插入到AET表中,形成新的AET表;
(5)AET表不为空则转(3),否则结束。

边缘填充算法:
基本思想:按任意顺序处理多边形的每条边。处理时,先求出该边与扫描线的交点,再对扫描线上交点右方的所有象素取反。
算法简单,但对于复杂图型,每一象素可能被访问多次

栅栏填充算法:
栅栏指的是一条过多边形顶点且与扫描线垂直的直线。它把多边形分为两半。
基本思想:按任意顺序处理多边形的每一条边,但处理每条边与扫描线的交点时,将交点与栅栏之间的象素取反。
这种算法尽管减少了被重复访问象素的数目,但仍有一些象素被重复访问。

边标志算法:
基本思想:先用特殊的颜色在帧缓存中将多边形的边界勾画出来,然后将着色的象素点依x坐标递增的顺序配对,再把每一对象素构成的区间置为填充色。
分为两个步骤:打标记;填充。
当用软件实现本算法时,速度与改进的有效边表算法相当,但本算法用硬件实现后速度会有很大提高。

区域填充
基本概念:
区域填充是指从区域内的某一个象素点(种子点)开始,由内向外将填充色扩展到整个区域内的过程。
区域是指已经表示成点阵形式的填充图形,它是相互连通的一组像素的集合。

区域的表示方法:
边界表示法:把位于给定区域的边界上的象素一一列举出来的方法。
边界表示法中,由于边界由特殊颜色指定,填充算法可以逐个象素地向外处理,直到遇到边界颜色为止,这种方法称为边界填充算法(Boundary-fill Algorithm)。

内点表示法:枚举出给定区域内所有象素的表示方法。以内点表示法为基础的区域填充算法称为泛填充算法(Flood-fill Algorithm)。

区域的分类:
4-连通区域:从区域上的一点出发,通过访问已知点的4-邻接点,在不越出区域的前提下,遍历区域内的所有象素点。
8-连通区域:从区域上的一点出发,通过访问已知点的8-邻接点,在不越出区域的前提下,遍历区域内的所有象素点。

4连通与8连通区域的区别:
连通性: 4连通可看作8连通区域,但对边界有要求。
对边界的要求。

区域填充算法:
区域填充算法(边界填充算法和泛填充算法)是根据区域内的一个已知象素点(种子点)出发,找到区域内其他象素点的过程,所以把这一类算法也成为种子填充算法。

算法的输入:种子点坐标(x,y),填充色以及边界颜色。
利用堆栈实现简单的种子填充算法

算法从种子点开始检测相邻位置是否是边界颜色,若不是就用填充色着色,并检测该像素点的相邻位置,直到检测完区域边界颜色范围内的所有像素为止。

栈结构实现4-连通边界填充算法的算法步骤为:

种子象素入栈;当栈非空时重复执行如下三步操作:

(a)栈顶象素出栈;

(b)将出栈象素置成填充色;

(c)检查出栈象素的4-邻接点,若其中某个象素点不是边界色且未置成多边形色,则把该象素入栈。

栈结构实现8-连通边界填充算法的算法步骤为:

种子象素入栈;当栈非空时重复执行如下三步操作:

(a)栈顶象素出栈;

(b)将出栈象素置成填充色;

(c)检查出栈象素的8-邻接点,若其中某个像素点不是边界色且未置成多边形色,则把该像素入栈。可以用于填充带有内孔的平面区域。
把太多的像素压入堆栈,降低了效率,同时需要较大的存储空间。
递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,进/出栈费时费内存。
通过沿扫描线填充水平象素段,来代替处理4-邻接点和8-邻接点。

扫描线种子填充算法:扫描线通过在任意不间断扫描线区间中只取一个种子像素的方法使堆栈的尺寸极小化。不间断区间是指在一条扫描线上的一组相邻像素。

基本过程:当给定种子点时,首先填充种子点所在的扫描线上的位于给定区域的一个区段,然后确定与这一区段相通的上下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。

区域填充算法——泛填充算法
算法的输入:种子点坐标(x,y),填充色和内部点的颜色。
算法原理:算法从指定的种子(x,y)开始,用所希望的填充颜色赋给所有当前为给定内部颜色的象素点。种子象素入栈;栈非空时重复执行如下三步操作:

(1)栈顶象素出栈;

(2)将出栈象素置成填充色;

(3)检查出栈象素的8-邻接点,若其中某个象素点不是给定内部点的颜色且未置成新的填充色,则把该象素入栈。

当以边界表示时,4-连通边界填充算法只能填充4-连通区域,8-连通边界填充算法也只能填充8-连通区域。
当以内点表示时,8-连通泛填充算法可以填充8-连通区域也可以填充4-连通区域,当然4-连通泛填充算法还是只能填充4-连通区域。

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

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

相关文章

php左侧,php左侧补零

在php中有两个函数——至少有两个是否有其他的我还不知道&#xff0c;能够实现数字补零&#xff0c;str_pad(),sprintf()详细如下str_pad顾名思义这个函数是针对字符串来说的这个可以对指定的字符串填补任何其它的字符串例如:str_pad(带填补的字符串,填补后的长度&#xff0c;填…

python - work3

# -*- coding:utf-8 -*-project: jiaxyauthor: Jimmyfile: work_20181107.pyide: PyCharm Community Editiontime: 2018-11-07 10:46blog: https://www.cnblogs.com/gotesting/## 1&#xff1a;一个足球队在寻找年龄在10岁到12岁的小女孩&#xff08;包括10岁和12岁&#xff09…

团队-中国象棋-最终程序

托管平台地址:https://gitee.com/zhanghongjian666/ZhongGuoXiangQi 小组名称:exciting 小组成员合照: 程序运行方法:html 程序运行示例及运行结果:转载于:https://www.cnblogs.com/qwsa/p/7944093.html

NET CORE 基于缓存策略的SignalR控制推送频率(每多少秒/多少次)API接口控制(限流)...

ASP.NET Core SignalR 概述&#xff0c;自行去官网搜。SignalR 没有控制和前端推送频率的功能&#xff0c;就是后端一旦发送请求&#xff0c;前端立马响应。或者前端发送请求&#xff0c;后端立马响应&#xff0c;但是如果误操作&#xff0c;或者业务原因&#xff0c;对产生的信…

svn 的使用(二)

这篇主要介绍下 svn 钩子的使用&#xff0c;svn 的安装以及配置等能够查看 svn 的使用&#xff08;一&#xff09; 我们能够在svn创建的仓库目录下看到hooks 目录。这里面就存放这个各种svn操作同一时候会运行的脚本文件。&#xff08;你能够自己查看每一个脚本文件&#xff0c…

java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

CAS你知道吗&#xff1f;原子类AtomicInteger的ABA问题谈谈&#xff1f;&#xff0c;原子共面问题(1)CAS是什么&#xff1f;比较并交换举例1, CAS产生场景代码&#xff1f;importjava.util.concurrent.atomic.AtomicInteger;public classCASDemo {public static voidmain(Stri…

ABP Vnext 批量导入用户,解决密码加密问题

因为ABP Vnext在密码加密方面使用的盐加密的方式&#xff0c;底层的加密方式让人摸不着头脑。如何需要批量导入用户的时候&#xff0c;这个密码问题就很头疼。假设&#xff0c;已经有一个集合List<entity>的用户数据了&#xff0c;此时进行循环取出一条用户信息&#xff…

深入分析JavaWeb Item7 -- HttpServletResponse详解

Web服务器收到客户端的http请求&#xff0c;会针对每一次请求&#xff0c;分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应&#xff0c;那我们要获取客户机提交过来的数据&#xff0c;只需要找request对象就行了。…

Spring.net学习记录

Spring.Net功能&#xff1a; 1、控制反转&#xff08;IOC&#xff09;&#xff1a;就是创建对象的权利由开发人员自己控制New&#xff0c;转到了有容器来控制 2、依赖注入&#xff08;DI&#xff09;&#xff1a;就是通过容器来创建对象的时候&#xff0c;在对象初始化时给一些…

uAdmin the Golang Web framework

2019独角兽企业重金招聘Python工程师标准>>> A little over two years ago, I started looking for a web framework like Django for Golang but to my surprise, I couldn’t find anything that even does the basic. My requirements were simple: A standard w…

ABP Vnext 数据库表字段存在IsDeleted如何物理删除HardDeleteAsync

ABP Vnext在写表实体会继承 xxxEntity : FullAuditedAggregateRoot<Guid>此时这个聚合根会包含一个 IsDeleted字段属性&#xff0c;一旦继承了这个软删除字段&#xff0c;你在仓储对象调用 await _xxxxRepository.DeleteAsync(x > x.Id > 0)时的时候&#xff0c;…

详解当当网的分布式作业框架elastic-job

详解当当网的分布式作业框架elastic-job

java条件触发,条件事件触发Anylogic

所以首先event.restart()函数仅在事件具有触发类型时才适用&#xff1a;timeout和mode&#xff1a;user control&#xff0c;否则你的event.restart()函数什么也不做......其次&#xff0c;你需要在有条件的事件上调用你的函数&#xff0c;但是在停车的那一刻......你可以在car…

攻城不易守城更难,汇付天下该如何守住打下来的“江山”?

伴随着相关监管政策的实施&#xff0c;第三方支付市场俨然已经迎来了“罚单潮”。根据不完全统计&#xff0c;截至2018年10月8日&#xff0c;央行已开出109张支付罚单&#xff0c;国付宝等多家支付机构罚金甚至高达千万以上&#xff0c;今年累计处罚的金额已超过2亿元。照此速度…

1024技术论坛 | C#与.NET技术新发展

主办方简介上海维宏电子科技股份有限公司&#xff08;维宏股份&#xff0c;股票代码&#xff1a;300508&#xff09;&#xff0c;是一家专业提供运动控制系统解决方案的高科技企业&#xff0c;公司拥有雄厚的研发力量和高素质的服务队伍&#xff0c;我们以快捷的速度&#xff0…

Oracle Code登录北京 代码盛宴邀你high起来|免费报名

盛夏北京&#xff0c;将迎来 Oracle Code 北京站活动。作为贯穿全年、横跨全球的 20 场活动中的一场&#xff0c;北京站汲取各地 Oracle Code 精华&#xff0c;结合国内开发者社区现状和需求&#xff0c;呈现一场代码盛宴。 来自 Oracle Code、OTN 及 AppsLap 的大咖们将齐聚北…

简单的四则运算

// 20163536 杨宇航 奖励原创 上课未完成原因&#xff1a; 哎&#xff0c;在上那节课时候&#xff0c;我们正在准备程序设计大赛&#xff0c;因为我们团队当中只有我的电脑有数据库&#xff0c;所有我只好将我的电脑贡献给团队了&#xff0c;不然在10分钟内完成应该不成问题&a…

导出导入数据库

一、导出用 mysqldump 备份数据库 1mysqldump -u用户 -p密码 数据库名 > &#xff08;目录&#xff09;导出文件名如&#xff1a;mysqldump -uroot -p123 dbname > /root/test.sql 回车就直接完成备份。如果只需要建表指令&#xff0c;则命令如下&#xff1a; shell> …

matlab randn 范围,请问randn产生的数据在什么范围内变化

产生均值为0&#xff0c;方差 σ^2 1&#xff0c;标准差σ 1的正态分布的随机数或矩阵的函数。Example:产生一个随机分布的指定均值和方差的矩阵&#xff1a;将randn产生的结果乘以标准差&#xff0c;然后加上期望均值即可。例如&#xff0c;产生均值为0.6&#xff0c;方差为…

C#开发串口通信实例及串口基础

一、串口通信简介串行接口&#xff08;串口&#xff09;是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去&#xff0c;同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路&#xff0c;我们称为串行接口电路。串口通信&a…