基于《高级计算机图形学原理与实践》(西安科技大学)的学习笔记(一、二)

本文介绍了计算机图形学的基本概念,包括图形与图像的区别,重点讲解了二维图形的绘制方法,如直线的扫描转换、中点Bresenham算法以及圆的绘制。此外,还涉及了走样与反走样技术,特别是中点Bresenham直线和圆的反走样算法,以及有效边表填充算法在多边形填充中的应用。内容深入浅出,适合计算机图形学初学者。
摘要由CSDN通过智能技术生成


前言

提示:以下介绍计算机图形学的起源及定义:

计算机图形学术语起源:1963年,美国麻省理工学院的Ivan E. Sutherland博士论文《Sketchpad:一个人机通讯的图形系统》中,首次使用Computer Graphics(CG)术语。
证明交互式图形学的可行、价值,确立图形学独立学科!
Alt
在这里插入图片描述在这里插入图片描述

1988年图灵奖获得者,美国科学院和工程院两院院士。
(评价:计算机图形学之父!)

计算机图形学定义:研究如何在计算机中表示图形、以及利用计算机进行图形的生成、处理和显示的学科。
有别于数据可视化,研究对象是场景对象,两个层面内容:
将场景对象转换为图形:计算机中表示和建模(网格、曲线曲面等)
将转换后的图形显示出来:计算机中绘制与渲染(投影、光照等)

注意:本课程实验使用MFC进行绘图,本人使用VC6内自带的MFC进行,内容源自课程PPT及个人理解。


提示:以下是本篇文章正文内容

一、图形和图像的概念

图形:由不同属性的点、线、面等几何元素组成的图画。
形状参数(形):描述形状的数学方程系数、顶点、连接关系、面关系等拓扑信息的几何参数。
属性参数(图) :描述明暗、灰度、色彩、线型等非几何参数。
例如:理想圆、网格模型

图像:记录在介质上的客观对象的映像。
计算机介质:数字图像,由像素组成的矩形光栅。
例如:圆、照片

比较点图形图像
组成元素点、线、面等几何元素像素
存储数据形状参数+属性参数像素灰度或颜色值
处理方式旋转、投影等图形处理增强、边缘检测等图像处理
缩放结果无失真(矢量图形)失真(分辨率固定)
观察方向全方位不同角度观察固定

二、基本二维图形绘制

1、直线的扫描转换

光栅扫描显示器的绘图过程就是在屏幕像素点阵中确定最佳逼近于理想图形的像素点集的过程。这个过程称“图形的扫描变换”。
光栅图形: 像素点集 +颜色

算法
斜率截距公式计算法(浮点数乘法、加法、取整)
直线: y=0.4x +0.6
x=1 y=0.4+0.6=1
x=2 y=0.42+0.6=1.4
x=3 y=0.4
3+0.6=1.8
x=4 y=0.4*4+0.6=2.2
随着x的递增,每一次都进行一次的乘法。

数值微分法(DDA)(浮点数加法、取整<-增量思想)
Δ=0.4
x=1 y=0.4+0.6=1
x=2 y=1+Δ=1.4
x=3 y=1.4+Δ=1.8
x=4 y=1.8+Δ=2.2
相比于上面的算法,把乘法变成了加法,加快了运算的速度。

中点Bresenham算法(整数的加减法<-值的符号判断)
前面的算法表达了优化的思想,那么有没有办法再优化,完成
浮点数乘法-> 浮点数加法 ->整数加法” 的转变?
这就是下面详细介绍的中点Bresenham算法了

2、中点Bresenham直线扫描转换

(1)算法原理
每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。
(2)算法推导
直线的隐函数方程表示:
在这里插入图片描述
就是将直线y=kx+b全部移到一边后作为一个函数。

理想直线将平面划分成三个区域:
对于直线上的点,F(x,y)=0;
对于直线上方的点,F(x,y)>0;
对于直线下方的点,F(x,y)<0。
在这里插入图片描述

(一) 构造中点判别式

主位移方向的确认
谁的变换比较快,就选谁作为主位移方向
如0<=|k|<1 的时候,x每次加1的时候y加k,k的绝对值小于1,则x变化得比y快,则选择x为主位移方向,反之则选y为主位移方向。有:
x轴为主位移方向:0<=|k|<1
y轴为主位移方向:|k|>=1

走步
x每增加1,
y值+1 或 不变(0<=k<1)
y值-1 或 不变(-1<k<=0)
在这里插入图片描述

对于0<=k<1时
假定直线的当前点是(xi, yi) ,沿主位移x方向走一步,下一点只能在Pu和 Pd 两点中选取, Pu和 Pd 的中点M 为 (xi+1, yi+0.5)在这里插入图片描述
在这里插入图片描述
Pu(xi+1,yi+1)
Pd(xi+1,yi)
两个点中选取其中一个作为下一步走到的点,而选取点的依据就是这两个点的中点是在直线的上方(d>=0,中点在直线上方,说明Pd距离直线的距离更近)还是下方(d<0,中点在直线下方,说明Pu距离直线的距离更近)。

对于-1<k<=0时
则是将上面原本的yi+1全部变成yi,原本的yi全部变成yi-1即可.

(二)中点判别式的递推公式
假定在主位移x方向上已走一步的情况下,现在考虑沿主位移方向再走一步,应该选择哪个中点代入中点偏差判别式以决定下一步该点亮的像素,如图所示,分两种情况讨论。
在这里插入图片描述
在这里插入图片描述

(三)中点判别式的初始值:
在这里插入图片描述

3、圆的扫描转换

在屏幕像素点集中,寻找最佳逼近于理想圆的过程,称为圆的扫描转换

(一)算法原理:
考虑到圆的对称性,本算法可以进一步简化为1/8圆弧。
只要绘制出第一象限内的1/8圆弧Ⅰ,根据对称性就可绘制出整圆,这称为八分法画圆算法。

在这里插入图片描述
圆心在原点、半径为R的圆方程的隐函数表达式为
在这里插入图片描述
圆将平面划分成三个区域:
对于圆上的点,F(x,y)=0;
对于圆外的点,F(x,y)>0;
对于圆内的点,F(x,y)<0。

只画右上角的1/8圆:
下图中虚线上方部分的圆
在这里插入图片描述
(二) 中点Bresenham画圆算法推导:
(1) 构造中点偏差判别式
假定当前点是P (xi,yi),则下一个点只能在Pu (xi+1,yi)与Pd (xi+1,yi-1)中选取,两者的中点为M (xi+1,yi-0.5)。
代入隐函数方程,构造中点偏差判别式如下:
在这里插入图片描述
当M 在理想圆弧的下方,则点亮Pu
当M 在理想圆弧的上方,则点亮Pd
在这里插入图片描述
(2)中点偏差判别式的递推公式
假定在主位移x方向上已走一步的情况下,现在考虑沿主位移方向再走一步,应该选择哪个中点代入中点偏差判别式以决定下一步该点亮的像素,如图所示,分两种情况讨论。
在这里插入图片描述
在这里插入图片描述
(3)中点偏判别式的初始值
圆的起点为P(0, R) ,x为主位移方向,
因此,第一个中点是M(1,R-0.5),对应的d的初始值为:
在这里插入图片描述

4、走样与反走样

(1)走样(aliasing)
用离散量(像素)表示连续量(图形)而引起的失真,称为走样。
走样是光栅扫描显示器的一种固有现象,不可避免,只能减轻。
(2)光栅图形的走样现象
产生阶梯或锯齿形;
狭小图形遗失;细节失真;
实时动画忽隐忽现、闪烁跳跃;
(3)反走样
减少走样效果的技术称为反走样技术,或抗锯齿
(4)反走样技术
2类:
提高分辨率方法(硬件技术)
改进软件扫描转换算法(软件技术)
<1>提高分辨率
帧分辨率增加,存储代价提高,成本限制,实现较困难
反走样效果不理想
<2>非加权区域采样方法
将直线段看作具有一定宽度的狭长矩形;
当直线段与某象素有交时,求出两者相交区域的面积;
根据相交区域的面积,确定该象素的亮度值 .
<3>加权区域采样
原理:利用人眼视觉特性,通过加权平均的方法,调节像素的亮度和灰度,以产生模糊的边界,从而达到较好的视觉效果以消除 “锯齿”。
加权参数可以选择距离、面积和体积等。
(5)Wu反走样算法
在这里插入图片描述
一种直线的距离加权反走样算法,空间混色原理指出,人眼对某一区域颜色的识别是取这个区域颜色的平均值。
<1>算法原理
采用空间混色原理来对走样进行修正,对于理想直线上的任一点,同时以两个不同亮度级别的相邻像素来表示。
在这里插入图片描述
上面的图因为是截取自ppt,颜色没有体现出来,真实的图片如下:
即是每个圆的圆心距离直线的距离的值决定圆的亮度.
在这里插入图片描述

<2>构造距离误差项
在这里插入图片描述
Pd(xi+1,yi)像素的亮度级别为:
在这里插入图片描述
Pu(xi+1,yi+1)像素的亮度级别为:
在这里插入图片描述
每右移一个像素,ei+1=ei + k。
当ei≥1.0时,yi+1= yi+1,ei+1= ei-1

5、有效边表填充算法

(1)多边形填充
多边形的扫描转换: 把多边形的顶点表示转换为点阵表示
从多边形的顶点信息出发,求出覆盖的每个像素点,取为填充色。其主要工作是确定穿越多边形内部的扫描线的覆盖区间。
方法
有效边表填充算法
边缘填充算法
种子填充算法
(2)有效边表填充算法
<1>基本思想
按扫描线从小到大的移动顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
求交:计算扫描线与多边形各边的交点;
排序:把所有交点按x值递增顺序排序;
配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,
着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。
该算法利用相邻像素之间的连贯性,提高算法效率
<2>边界像素的处理原则
存在问题1:边界上象素的取舍问题,避免填充扩大化
在这里插入图片描述
处理原则: “左闭右开” 和“下闭上开”

存在问题2:当扫描线与多边形顶点相交时,交点的取舍问题
在这里插入图片描述

处理原则:顶点的两条边的另外两个端点的y值中大于交点y值的个数,是0,1,2来决定。
:若共享顶点的两条边分别落在扫描线的两边,交点只算一个;
若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。

(3)有效边和有效边表
在这里插入图片描述

在这里插入图片描述
多边形的每一条边都作为边表的一个结点
(4)桶表与边表
边表
有效边表给出了扫描线与有效边交点坐标的计算方法,但是并没有给出新边出现的位置坐标。为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息。因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。
桶表:按照扫描线顺序管理边出现情况的一个数据结构。
1)构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为一个桶,对应多边形覆盖的每一条扫描线;
2)将每条边的信息链入与该边最小y坐标(ymin)相对应的桶处;
3)对于每一条扫描线,如果新增多条边,则按x|ymin坐标递增的顺序存放在一个链表中,若x|ymin 相等,则按照1/k由小到大排序,这样就形成边表。
新边表(NET)
用来对除水平边外的所有边进行登记,
来建立边的记录

算法过程
1、根据给出的多边形顶点坐标,建立NET表;
求出顶点坐标中最大y值ymax和最小y值ymin。
2、初始化AET表指针,使它为空。
3、按扫描线顺序,执行下列步骤直至NET和AET都为空.
①更新:对AET中剩下的每一条边的x递增1/k,即x = x+ 1/k;
②删除:将当前扫描线纵坐标y值递值1;如果AET表中某记录的ymax=yj,则删除该记录 (因为每条边被看作下闭上开的;
③插入:如NET中的第y类非空,则将其中的所有边取出并插入AET中;
④排序:如果有新边插入AET,则对AET中各边排序;
⑤配对:对AET中的边两两配对,(1和2为一对,3和4为一对,…),将每对边中x坐标按规则取整,获得有效的填充区段,
⑥填充: 使用指定的颜色对填充区段着色;
算法的具体流程可以去观看视频,由于不太容易解释,这里只给出理论.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值