(计算机图形学)基本图形的扫描转换

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
给定理想直线的起点坐标为P0(x0,y0),终点坐标 为P1(x1,y1),则直线的隐函数方程为:
F ( x, y) y kx b 0
其中,直线的斜率: 直线水平方向位移 : 直线垂直方向位移 :
(3-1)
k
y y1 y 0 x x1 x0
x x1 x0
y y1 y0
•对于直线,中点 Bresenham 算法与 Bresenham 算法产生同样的像素点,
而且还可以扩展为更复杂的图形扫描转换算法,如绘制圆的中点 Bresenham算法和绘制椭圆的中点Bresenham算法。
3.1.1 算法原理
直线的中点Bresenham算法的原理:每次在主位移
方向上走一步,另一个方向上走不走步取决于中点误 差项的值。
3.2 反走样技术
直线扫描转换算法在处理非水平、非垂直且非45°的直线段时会出现 锯齿,这是因为直线段在光栅扫描显示器上显示的图像是由一系列亮度相 同而面积不为零的离散像素点构成的。这种由离散量表示连续量而引起的 失真称为走样(aliasing)。用于减轻走样现象的技术称为反走样(antialiasing,AA)或者抗锯齿。走样是理想直线(理想直线宽度为零)扫描转 换后(真实像素点面积不为零)的必然结果。走样是光栅扫描显示器的一
0≤k≤1的Bresenham算法:
(1)输入直线段的两个端点坐标P0(x0,y0),P1(x1,y1)。 (2)计算△x=x1-x0,△y=y1-y0,k= △y/△x , d=0.5-k。 (3)绘制点P(x,y),判断d的符号。如果d<0,则P(x,y) 点更新为P(x+1,y+1),d更新为d+1-k;否则,P(x,y)点更 新为P(x+1,y),d更新为d-k。 (4)当P点的x坐标小于P1点的x坐标时,重复步骤(3), 否则结束程序 。
理想直线将平面划分成三个区域:对于直线上的点,F(x,y)=0 ; 对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。 假设直线的斜率为 0≤k≤1,则△x≥△y,所以确定x 方向为主位移方 向。按照Bresenham原理,x方向上每次加1,y方向上加不加1取决于中点 误差项的值。
颜色渐变直线
void CTestView::CLine(CDC *pDC) { CPoint p0(-100,-50),p1(200,50),p; int dx=p1.x-p0.x,dy=p1.y-p0.y; double k,d; k=(double)dy/dx; d=0.5-k; double dc=1/(double)dx; for(p=p0;p.x<p1.x;p.x++)//不包括终点p1 { double r,g,b; r=(1-(p.x-p0.x)*dc),g=0,b=(p.x-p0.x)*dc; pDC->SetPixelV(p,RGB(r*255,g*255,b*255)); if(d<0) { p.y++; d+=1-k; } else d-=k; } }
(d i 0) (d i 0)
(3-3)
3.1.3 递推公式
1.中点误差项的递推公式
M(x i+2,y i+1.5)
M(x i+2,y i+0.5)
Pu
Pu
Pi(xi,yi)
Pd Pi(xi,yi) (a)di<0 中点的递推 (b)di≥0
Pd
di y i 0.5 k(xi 1) b
从Pi(xi,yi)点出发选取下一像素时,需将Pu和Pd的中点M(x i+1,y i+ 0.5)代入隐函数方程,构造中点误差项di 。
d i F ( xi 1, yi 0.5) yi 0.5 k ( xi 1) b(3-2)
yi 1
yi 1 , yi ,
显示器的分辨率提高一倍的效果图
软件反走样技术主要是加权区域采样。算法的实质是利用人眼视觉特 性,通过加权平均的方法,调节像素的亮度和灰度,以产生模糊的边界, 从而达到较好的视觉效果以消除 “锯齿”。加权参数可以选择距离、面 积和体积等。下面主要讲解直线的距离加权反走样算法,关于面积加权 和体积加权反走样算法请参考相关文献。
例:从(20,10)到(30,18),画直线.
i xi yi pi i xi yi pi
0
1 2 3 4 5
20
21 22 23 24 25
10
11 12 12 13 14
6
2 -2 14 10 6
6
7 8 9 10
26
27 28 29 30
15
16 16 17 18
2
-2 14 10
思考:K>1时如何画线?
光照线框球
光栅扫描显示器的本质决定它难以生成完美的直线段,也不能保证直 线段精确地通过起点和终点。绘制直线段的基本要求: •直线要直。要求具有精确的起点和终点。 •直线无方向性。从起点绘制到终点的直线段与从终点绘制到起点的直线 段要重合。 •直线的绘制速度要快。即尽量使用加减法整数运算,避免乘、除、开方、 三角等复杂运算。但随着计算机处理浮点数与整数的速度趋于一致,这点 要求在减弱。 •MSDN:Draws a line from the current position up to, but not including, the point specified by x and y (or point). The line is drawn with the selected pen. The current position is set to x,y or to point.
2.中点误差项的初始值
直线的起点坐标为P0(x0,y0),x为主位移方向。因此, 第一个中点是M (x0+1,y0+0.5),相应的di的初始值为:
d 0 F ( x0 1, y0 0.5) y0 0.5 k ( x0 1) b
y Fra Baidu bibliotek kx0 b k 0.5
其中,因为(x 0,y 0)在直线上,所以
y0 kx0 b 0
则:
d 0 0.5 k
(3-6)
说明:
由于使用的是di的符号,可以用2di△x代替
di来摆脱小数,使得算法只涉及整数运算。
——孙家广《计算机图形学(第3版)》。
现有的研究已经证明:端点采用整数坐标没 有什么益处,因为现在的CPU可以按照与处理整 数同样的速度处理浮点数。因此本课程中使用的 中点Bresenham算法采用了浮点数运算并且方便 解决了直线的反走样问题。
x
提出问题: •许多软件中都供了绘制直线的函数,为什么要讲直线绘制算法?如, MFC的CDC类就提供了MoveTo与LineTo函数。 •连续理想直线是用直线路径上的离散像素点来绘制的。 •MoveTo与LineTo函数无法绘制光滑的(颜色渐变)走样或反走样直线。 而上述直线是光照模型的基础。
颜色渐变走样直线
红绿两段直线连结点处的颜色应该是 红色还是蓝色?连结点像素要求不绘 制两次。
Bresenham算法的特点: •Bresenham 算法是一个经典的增量算法。在一个迭代算法中,如果每一 步的x,y值是用前一步的值加上一个增量来获得的,那么这种算法就称为 增量算法。 •Bresenham 算 法 有 几 种 变 体 , 计 算 方 法 略 有 不 同 。 本 章 只 介 绍 中 点 Bresenham算法(Midpoint Bresenham Algorithm)。
3.1.4 绘制任意斜率的直线
k =-1 k<-1 |k|=∞ k>1 k =1
-1≤k<0
0≤k≤1 k =0
0≤k≤1
-1≤k<0
k>-1
k<-1
直线斜率的对称性
任意斜率的直线
3.1.4 颜色渐变直线
绘制光滑过渡的彩色直线段时,需要使用公式(3-28)进行前 景色线性插值 c=(1-t)c0+tc1 (3-28) 式中,c为颜色渐变直线段上任一点的颜色; c0为直线段起点 的颜色;c1为直线段终点的颜色。
(3-4)
⑵当di≥0,时下一步的中点坐标为M(xi+2, yi+0.5),下一步中点误差项为
di 1 F ( xi 2, yi 0.5) yi 0.5 k ( xi 2) b yi 0.5 k ( xi 1) b k di k
(3-5)
3.1 直线的扫描转换
直线的扫描转换是在屏幕像素点阵中确定最佳逼近于理想直线的像素 点集的过程。计算机图形学要求直线的绘制速度要快,即尽量使用加减法 (增量算法),避免乘、除、开方、三角等复杂运算。最著名的算法是由 J.E. Bresenham于1965年提出的Bresenham算法。
y
O
直线的扫描转换
Pu
Pu
Pu
M
M
Pi(xi,yi)
Pd
Pi(xi,yi)
Pd
Pi(xi,yi)
Pd
直线中点Bresenham算法原理
假定直线的当前点是P,沿主位移x方向走一步,下一点只能在Pu 和Pd 两点中选取,Pu和Pd的中点为M 。显然,若中点M在理想直线的下方,则 Pu点距离直线近,否则选取Pd。
3.1.2 构造中点误差项
直线的中点Bresenham算法小结: 1. 确定主位移方向。在主位移方向上每次加1,另一个方 向上加不加1,取决于中点误差项。 2. 计算d的初始值。 3. 区分di <0与di≥0两种情况,分别计算di的递推公式。
后面讲解的圆的中点Bresenham算法与椭圆的中点 Bresenham算法,采用类似的步骤,请同学们掌握学习 的技巧。 直线是构成复杂图形的基本图元,场景中的模型往 往由成千上万条直线组成,所以直线的中点Bresenham 算法是本章学习的重点。
(1)当di<0时,下一步的中点坐标为M(xi+2, yi+1.5),下一步中点误差项为
di 1 F ( xi 2, yi 1.5) yi 1.5 k ( xi 2) b
yi 0.5 k ( xi 1) b 1 k
di 1 k
void CTestView::BresenhamLine(CDC *pDC) { CPoint p0(-100,-50),p1(200,50),p; int dx,dy; dx=p1.x-p0.x; dy=p1.y-p0.y; double k,d; k=(double)dy/dx; d=0.5-k; for(p=p0;p.x<p1.x;p.x++)//不包括终点(x1,y1) { pDC->SetPixelV(p,RGB(0,0,0)); if(d<0) { p.y++; d+=1-k; } else d-=k; } }
种固有现象,不可避免,只能减轻。
不走样直线
走样直线
未开抗锯齿
开启抗锯齿
“画图”绘制的斜线
“word”绘制的斜线
反走样技术主要分为两类:一类是硬件技术,通过提高显示器的分 辨率来实现;另一类是软件技术,通过改进软件算法来实现。 从硬件角度把显示器的分辩率提高了一倍。由于每个锯齿在x方向 和y方向都只有原先分辨率的一半,所以看上去走样现象有所改善。虽 然如此,硬件反走样技术由于受到硬件条件和成本的限制,实现起来较 为困难,很难达到理想的反走样效果。
BOOL SetPixelV(int x, int y, COLORREF crColor);
直线、圆、椭圆的扫描转换主要使用Bresenham算法实现。
Bresenham算法最初是为数字绘图仪提出,但同样适用于光栅显示 器。
Jack Elton Bresenham
Plotter movement
第二章
本章内容
3.1 3.2 3.3 3.4 3.6
直线的扫描转换 直线的Wu反走样算法 圆的扫描转换 椭圆的扫描转换(自学) 本章小结
直线、圆、椭圆是二维场景中的最基本图形。尽管MFC的CDC类已 经提供了相关的绘制函数,但直接使用这些函数仍然无法满足真实感图形 绘制的要求。光栅扫描显示器是画点设备,基本图形的光栅化就是在像素 点阵中确定最佳逼近于理想图形的像素点集,并用指定颜色显示这些像素 点集的过程。当光栅化与按扫描线顺序绘制图形的过程结合在一起时,也 称为扫描转换。本章从基本图形的生成原理出发,使用绘制像素点函数实 现基本图形的扫描转换。绘制像素点函数的原型为
相关文档
最新文档