光栅图形学

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

令 d0=2a+b, d1=2a, d2=2a+2b, 有如下算法 。
《3 光栅图形学》
3.1.3 中点画线法
• 算法描述:
while (x<x2) If (d<0) then x++, y++, d+=d2 Else x++, d+=d1 End if Setpixel(x,y) End While a=y1-y2 b=x2-x1 d=2*a+b
• 圆的特征 八对称性:只要扫描转换八分之一圆弧,就可 以求出整个圆弧的象素集。

主要算法
中点画圆法 Bresenham算法等
《3 光栅图形学》
3.2. 圆弧的扫描转换算法
• 中点画圆法 考虑中心在原点,半径为R的第二个8分圆, 构造判别式(圆方程)
d F ( M ) F ( x p 1, y p 0.5) ( x p 1) 2 ( y p 0.5) 2 R 2
《3 光栅图形学》
3.1.2 数字微分分析法
• 算法描述:
i=1 While (i<=Length) Setpixel( int(x), int(y)) x=x+ △x y=y+ △y i=i+1 End while Finish If abs(x2-x1)>=abs(y2-y1) then Length =abs(x2-x1) Else Length =abs(y2-y1) End if △x = (x2-x1)/Length
M P2
《3 光栅图形学》
3.2. 圆弧的扫描转换算法
算法描述 MidPointCircle(int r int color) { int x,y; float d; x=0; y=r; d=1.25-r; circlepoints (x,y,color); //显示圆弧上的八个对称点 while(x<=y) { if(d<0) d+=2*x+3; else { d+=2*(x-y)+5; y--;} x++; circlepoints (x,y,color); } }
P2 Q
P=(xp,yp) P1
《3 光栅图形学》
3.1.3 中点画线法
• 基本步骤 对于直线段L, 其起点Ps(x0,y0),终点Pe(x1,y1) 构造判别式:d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 当d<0,M在L(Q点)下方,取右上方P2为下一个象素; 当d>0,M在L(Q点)上方,取右方P1为下一个象素; 当d=0,选P1或P2均可,约定取P1为下一个象素; d是xp, yp的线性函数,因此可采用增量计算,提高运算效率。
《3 光栅图形学》
3.2. 圆弧的扫描转换算法
• 为进一步提高算法的效率,可以将上面的算法中的浮点
数改写成整数,将乘法运算改成加法运算,即仅用整数实 现中点画圆法。使用e=d-0.25代替d,e0=1-R。
• Bresenham算法(1977),请参考相关书籍、论文。
《3 光栅图形学》
3.3 多边形的扫描转换与区域填充
-1.5 -2.0 -3.5 -3.0 -3.5
《3 光栅图形学》
3.1.2 数字微分分析法
• 缺点: 取整计算; 浮点计算;
《3 光栅图形学》
3.1.3 中点画线法
• 基本思想
当前象素点为(xp, yp) 。下一个象 素点为P1或P2。 设M=(xp+1, yp+0.5),为p1与p2 之中点,Q为理想直线与x=xp+1 垂线的交点。将Q与M的y坐标进 行比较。 当M在Q的下方,则P2 应为 下一 个象素点;M在Q的上方,应取 P1为下一点。
i e 5 -5/8 -2/8 6 同上 1/8 7 同上 -7/8 -4/8
x, y 4,2 5,2 5,2 6,2 6,2 6,3 7,3
4 3 2 1
0 1 2 3 4 5 6 7 8 9
8 同上 7,3 -1/8 8,3
《3 光栅图形学》
3.1.4 Bresenham算法
• 整数Bresenham算法(1982):
dy k dx 或 y y2 y1 x x2 x1
其有限差分近似解
yi 1 yi y y2 y1 yi 1 yi x x2 x1
其中(x1,y1)(x2,y2)分别为直线段的两个端点坐标
《3 光栅图形学》
3.1.2 数字微分分析法
• 基本步骤: 计算斜率 计算yi+1 = yi+kx 当x =1; yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注: 上述算法仅适用于k ≤1的情形。在这种情 况下,x每增加1,y最多增加1。当 k 1时,必 须把x,y地位互换
《3 光栅图形学》
3.1.3 中点画线法
若当前象素处于d0情况,则取正右方象素P1(xp+1, yp), 要 判下一个象素位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量为a
若d<0时,则取右上方象素P2(xp+1, yp+1)。要判断再下一象 素,则要计算
3 光栅图形学
3.1 直线段的扫描转换算法 3.2 园弧的扫描转换算法 3.3 多边形的扫描转换与区域填充 3.4 字符 3.5 二维裁剪
3.6 反走样
3.7 消隐
《3 光栅图形学》
3.1 直线段的扫描转换算法
3.1.1 概述 3.1.2 数字微分分析法 3.1.3 中点画线法 3.1.4 Bresenham算法
4 3 2 1
0 1 2 3 4 5 6 7 8 9
-6 4 -2 8 2
4,1 5,2 6,2 7,3 8,3
《3 光栅图形学》
3.1.4 Bresenham算法
• 基本算法(1965):
过各行各列象素中心构造一组虚拟网格线。按直线从起点 到终点的顺序计算直线与各垂直网格线的交点,然后根据 误差项的符号确定该列象素中与此交点最近的象素,即选 择y是否增加1。 y (1,1) (0,1) 0.5<= △y /△x <=1(误差>0) 选择(1,1)
d1=2*a
d2=2*(a+b) x=x1
y=y1
Setpixel(x,y)
《3 光栅图形学》
3.1.3 中点画线法
例2-2:用中点画线法绘制(0,0)到(8, 3)的直线段 初值计算:a=-3,b=8,d=2,d1=-6,d2=10
执行循环如下 d x, y 2 0,0 -4 1,0
6 0 2,1 3,1
《3 光栅图形学》
3.1.4 Bresenham算法
例3-3:用Bresenham算法绘制(0,0)到(8, 3)的直线段 初值计算:x=0,y=0, △x =8, △y=3,m=3/8,e=3/8-1/2=-1/8
执行循环如下 i e x, y 1 -1/8 0,0 2/8 1,0 2 同上 1,0 -6/8 1,1 -3/8 2,1 3 同上 2,1 0 3,1 4 同上 3,1 3/8 4,1 5 同上 4,1
《3 光栅图形学》
3.1.4 Bresenham算法
开始
X=x1 y= y1 △x = x2- x1 △y = y2- y1 e= △y / △x -0.5
i =1
i> △x
Plot (x,y) e< 0
Y
结束
N
Y N x=x+1 e=e+ △y / △x i=i+1
y=y+1 e=e-1
《3 光栅图形学》
5
(4,4)
4.5 4.5 5.5 5.5
0
1 2 3
4 5
《3 光栅图形学》
3.1.2 数字微分分析法
例3-2:用DDA法绘制(0,0)到(-8,-4)的直线段 初值计算:Length = 8 △x = -1, △y =-0.5,x=-0.5, y=-0.5
执行循环如下 i Setpixel 1 (0,0) 2 (-1,0)
《计算机图形学》第三章
光栅图形学
电子信息工程系 苏虎
Suhu@home.SWJTU.edu.cn
顶点数据
顶点操作:转换、光照计算等 图元装配:裁剪等
片元操作:雾计 算、深度检测等
求值器(进行曲面计算)
光栅化
帧缓存
显示列表
纹理装配:将纹理应用到 几何体上
像素数据
Baidu Nhomakorabea
像素操作:缩放、偏移等
《3 光栅图形学》
△y = (y2-y1)/Length
x=x1+0.5 y=y1+0.5
《3 光栅图形学》
3.1.2 数字微分分析法
例3-1:用DDA法绘制(0,0)到 (5,5)的直线段 初值计算:Length = 5 △x = 1, △y =1,x=0.5, y=0.5 执行循环如下 i 1 2 3 4 Setpixel (0,0) (1,1) (2,2) (3,3) x,y 0.5 0.5 1.5 1.5 3.5 3.5 3.5 3.5 5 4 3 2 1
0.0<= △y /△x <0.5(误差<0) 选择(1,0) x (1,0)
(0,0)
《3 光栅图形学》
3.1.4 Bresenham算法
如:一条斜率为3/8、起点为(0,0)的直线段 误差e的初始值为-1/2
1
0
1 e=-1/2+3/8 =-1/8
2 e=-1/8+3/8 =1/4
3 e=1/4-1+3/8 =-3/8
为避免原始算法中浮点运算和除法,可采用整数算法如下: 对误差项作简单变换: ei=2e *△x 即可得到整数算法
x = x1 y = y1 △x = x2-x1
△y = y2-y1
ei= 2* △y - △x for i = 1 to △x Setpixel(x,y)
While (ei>0) y=y+1 ei=ei-2* △x end while x=x+1 ei=ei+2* △y next i finish
《3 光栅图形学》
3.1.1 概述
• 直线段的扫描转换: 确定最佳逼近于该直线的一 组象素,并且按扫描线顺序,对这些象素进行写 操作。
? ? ? ? ? ? ?
直线段扫描转换
《3 光栅图形学》
3.1.2 数字微分分析法 (Digital Differential Analyzer)
• 基本方法: 解直线的微分方程,即
《3 光栅图形学》
3.1.4 Bresenham算法
• 上述Bresenham算法适用于第一八分圆域的直线 段绘制,通用的Bresenham算法需根据斜率与所 在象限进行简单调整即可实现。 Bresenham算法已成为标准。 其改进算法包括:双步算法等。
• •
《3 光栅图形学》
3.2. 圆弧的扫描转换算法
d ' F ( xp 2, y p 1.5) ( xp 2)2 ( y p 1.5)2 R2 d 2( xp y p ) 5
第 一个象素是(0,R),判别式d的初始值为 d0 F (1, R 0.5) 1.25 R P=(xp,yp) P1
3.1.4 Bresenham算法 • 算法描述:
x = x1 y = y1
△x = x2-x1
△y = y2-y1 m= △y / △x e= m-1/2 for i = 1 to △x
Setpixel(x,y) While(e>0) y=y+1 e=e-1 end while x=x+1 e=e+m next i finish
d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为 a+b
《3 光栅图形学》
3.1.3 中点画线法
画线从(x0, y0)开始,d的初值
d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b =a+0.5b。
可以用2d代替d来摆脱小数,提高效率。
3 4 (-2,-1) (-3,-1)
x,y 0.5 0.5 -0.5 0 -1.5 -0.5 -3.5 -1.0
-8 -7 -6 -5 -4 -3 -2 -1
0
-1 -2 -3 -4
5 6 7 8
(-4,-2) (-5,-2) (-6,-3) (-7,-3)
-3.5 -4.5 -5.5 -6.5 -7.5
3.2. 圆弧的扫描转换算法
若 d<0, 则取P1为下一象素,而且再下一象素的判别式为 若d>=0, 则应取P2为下一象素,而且下一象素的判别式为
d ' F ( xp 2, y p 0.5) ( x p 2)2 ( y p 0.5)2 R2 d 2xp 3
相关文档
最新文档