第3章 基本图形光栅化

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

画线算法
DDA算法: (四舍五 入取整) 中点画线法: 采用增量计 算 di+1=
t max x , y
d0 = 2*a+b di+2*a di≥0 PB (xi+1,yi)
di+2*(a+b) di<0 PT (xi+1,yi+1)
Bresenham 画线法:采 用增量计算 di+1=
递推公式 : di 1 di 2dy 2dx( yi yi 1 )
当di≥0时,选Ti, 当di<dx)
di 1 di 2dy
d1 2dy dx
算法
画线算法
Bresenham画线法:采用增量计算
生成圆弧的算法
考虑AB弧的画法,显示 一个整圆时,只要在显 示AB上任一点(x,y)时, 同时显示在圆周上其它 七个对称点 (y,x), (y,-x), (x,-y), (-x,-y), (-y,-x), (-y,x), (-x,y)
7个对称点
3.2.1中点画圆算法
假设圆的半径为R,则圆的方程为
DDA算法
DDA算法的缺点是: 计算量较大,产生一个像素点需要两次 浮点数加法,两次取整运算。
3.1.2 中点画线法(正负法)
为了讨论方便,假设直线的斜率在0到1之间: 若直线在x方向上增加一个光栅单位,则在y方向上的增量 只能在0到1之间。 设P(x,y)是直线上的一点,与P点最近的网格点为(xi, yi),那 么,下一个与直线最近的像素只能是正右方的网格点PB(xi+1, yi) 或右上方的网格点PT(xi+1,yi+1)两者之一。 再以点M(xi+1, yi+0.5)表示PB和PT的中点,设Q是直线与垂 直线x= xi+1的交点。 显然,若M在Q的下方,则PT 离直线较近,应取PT为下一个像素 点, 否则应取PB做为下一个像素点, 这就是中点画线算法的基本思想。
d0 = 2*dy-dx
di+2*(dy-dx) di+1= di+2*dy di<0 PB (xi+1,yi) di≥0 PT (xi+1,yi+1)
3.1.3Bresenham画线算法
上面讨论的是直线斜率0≤k≤1的情况。对于一 般情况可作如下处理: (1)当斜率的绝对值k>1时,将x、y和dx、dy 对换,即以y向作为增长方向,y总是增1(或减 1),x是否增减1,则根据di的符号判断:di≥0 时x增1(或减1);di<0时,x不变。 (2)根据dx和dy的符号来控制(x或y)增1还是 减 1。
P P1 M P2
3.2.1中点画圆算法
判别式d:
d F M F x p 1, y p 0.5 x p 1 y p 0.5 R 2
2 2
d的初始值为:
d 0 F (1, R 0.5) 1 (R 0.5) 2 R 2 1.25 R
F x, y x 2 y 2 R 2 0
当点(x,y)在圆内时,F(x,y)<0; 当点(x,y)在 圆外时,F(x,y)>0; 当点(x,y)在圆上时,F(x,y) =0;
x22+y22>r2 P2 Y
r
P0
y0 x0
x02+y02=r2 X
0 x12+y12<r2 P1
3.2.1中点画圆算法
3.1.3 Bresenham画线算法
设直线的起点和终点分别为(x1,y1)和(x2,y2), 则直线方程为 y=y1+
dy dx
(x-x1),其中dx=x2-x1,dy=y2-y1
直线方程经变换后可表示为从(0,0)到(dx,dy), 方程可简化为 Y=
dy
dx
*x
3.1.3 Bresenham画线算法
3.1.2 中点画线法
由于我们使用的只是d的符号,而且d的增量都是 整数,只是其初始值包含小数。因此,我们可以用2d 代替d,来摆脱小数。 如果进一步把算法中2*a改为a+a等等,那么这个 算法不仅只包含整数变量,而且不包含乘除法,适合硬 件实现。
算法实现
中点画线算法
中点画线法:采用增量计算
d0 = 2*a+b
3.2.1中点画圆算法
glBegin(GL_POINTS); 下述程序使用中点画圆算法绘制一个1/8glVertex2f(x,y); 圆弧。 glVertex2f(x,-y); void MidPointCircle(int r) { glVertex2f(-x,y); glVertex2f(-x,-y); { if(d<=0) d+=8x+12; x); int x,y,d else glVertex2f(y, glVertex2f(y, -x); x=0; { glVertex2f(-y, x); y=r; d+=8(x-y)+20; glVertex2f(-y, -x); y--; glEnd(); d=5-4r; ; d的初值 glBegin(GL_POINTS); } glVertex2f(x,y); x++; glEnd(); glBegin(GL_POINTS); while(x<=y) glVertex2f(x,y); glEnd(); } }
在d≥0的情况下,取右下方像素P2(xp+1,yp-1),
d1 F M F x p 2, y p 1.5 x p 2 y p 1.5 R 2 d 2x p y p 5
2 2
d 2 F M F x p 2, y p 0.5 x p 2 y p 0.5 R 2 d 2 x p 3
中点画圆算法的基本原理 是:假设点P(xp,yp)为圆弧上 一点,如图所示,下一个与圆 弧最近的像素点只能是正右方 的点P1(xp+1,yp)或右下方的点 P2(xp+1,yp-1)。令M为P1和P2的 中点,易知M的坐标为 (xp+1,yp-0.5)。显然,若M在 圆内,则P1离圆弧近,应取为下 一个像素点;否则应取P2作为下 一个像素点。
3.1.1DDA算法
DDA(Digital Differential Analyzer)法是根 据直线的微分方程来画直线的。 设直线的起点坐标为Ps(xs,ys),终点坐标为 Pe(xe,ye),令△x= xe- xs,△y= ye- ys,则要绘 制的直线的微分方程为
dx dy x , y dt dt
计算机图形学
第3章 基本图形光栅化
主讲教师:尉秀梅
第3章 基本图形光栅化
3.1 直线的光栅化
3.2 圆的光栅化
3.3 区域填充
3.4 字符表示 3.5 反走样
3.1 直线的光栅化
在数学上,理想的直线是没有宽度的、由无 数个点构成的集合。当我们对直线进行光栅化时, 只能在显示器所给定的有限个像素组成的矩阵中, 确定最佳逼近该直线的一组像素,并且按扫描线 顺序对这些像素进行写操作,这就是通常所说的 直线的扫描转换。 通常用于直线光栅化的算法有数值微分法 (DDA)、中点画线法和Bresenham画线算法。
t max x , y
取时间步长dt为1/△t,则可得上述微分方 程数值解的递推公式为
3.1.1DDA算法
通常情况下,直线的方向分为8个不同的区域, 每个区域的处理方法有所不同。
区域 dx dy
1a
1 △x/△y
△y/△x 1
2b 2a
1b 1a
1b 2a 2b
-1
-△x/△y -1 -△x/△y 1 △x/△y
3.2 圆的光栅化
与直线的生成类似,圆的生成算法的好坏将直接 影响到绘图的效率。本节仅讨论圆心位于坐标原点的 圆弧生成算法,对于圆心为任意的圆弧,可以先将其 平移到原点,然后光栅化,再平移到原来的位置。
圆的八对称性:圆心位于原点的圆有4条 对称轴:x=0, y=0, x=y, x=-y,为了求出表示整 个圆弧的像素集,只要扫描转化八分之一就可 以了。
△y/△x
1 -△y/△x -1 -△y/△x -1
1
3a 3b 4b 4a
3a 3b 4a
t max x , y
4b
3.1.1 DDA算法
例:画直线段P0(0,0)--P1(5,2) 解:斜率K=2/5=0.4,所以X方向每次步长为1,Y方向 递增K。 初始点为(0,0)。 x int(y+0.5) y Line: P0(0, 0)-- P1(5, 2) 3 0 0 0 xi+1=xi+1 2 1 0 0.4 2 1 0.8 1 yi+1=yi+K 3 1 1.2 0 1 2 3 4 5 4 2 1.6 5 2 2.0
PT P Q M PB
3.1.2 中点画线法
设直线的起点和终点分别为(x0,y0)和 (x1,y1),则直线方程为 F(x,y)=ax+by+c=0 其中a=y0-y1,b=x1-x0,c=x0y1-x1y0。
PT P Q M PB
M’’ M’
构造判别式:采用增量计算:M(x+1,y+0.5) d=F(M)=F(x+1, y+0.5)=a(x+1)+b(y+0.5)+c 在d≥0的情况下,M点在直线(Q点)上方,取正右方像素PB (xi+1,yi) , 判断下一像素,应计算下一个中点M’(x+2,y+0.5) d1=a(x+2)+b(y+0.5)+c =d+a 增量dt1=a 在d<0的情况下, M点在直线(Q点)下方,取右上方像素PT (xi+1,yi+1) , 判断下一像素,应计算下一个中点M’’(x+2,y+1.5) d2=a(x+2)+b(y+1.5) = d+a+b 增量dt2=a+b d的初始值: d0 = F(x0+1,y0+0.5)=a+0.5b
d0 = 2*dy-dx di+2*(dy-dx) di+2*dy di<0
di≥0 PT (xi+1,yi+1) PB (xi+1,yi)
习题
• P57 • 2. 根据DDA算法,中点画线算法,Bresenham 算法,绘制一条端点为(1,1)和(6,5)的直 线,写出对应的各个像素点的坐标,并画出具 体位置。
2 2
在d<0的情况下,取正右方像素P1(xp+1,yp) ,
为了消除在计算判别式初始值产生的浮点数运算, 将用4d来代替d。
中点画圆法
采用增量计算
d0 = 5-4R
xi=xi-1+1
di+8*(xi-1-yi-1)+20 di≥0 PB (xi+1,yi-1)
di+1= di+8*xi-1+12 di<0 PT (xi+1,yi)
直线的DDA算法程序
void dda(int x1,int y1,int x2,int y2) //直线DDA { int k, i; float x, y, dx, dy; k = abs(x2-x1); if (abs(y2-y1)>k) k = abs(y2-y1); dx = float(x2-x1)/k; dy = float(y2-y1)/k; x=float(x1); 可以实现四 y=float(y1); 舍五入 for (i=0;i<k;i++){ glBegin(GL_POINTS); glVertex2i(int(x+0.5),int(y+0.5)); 图中圆黑点表示用 glEnd(); DDA法生成的直线 x = x+dx; Int(x): 取整 y = y+dy; Round(x):四舍五入取整 } }// end DDA
dy s= *(xi-1+1)-yi-1 dx
t=(yi-1+1)-
dy dx
*(xi-1+1)
dy s-t=2* *(xi-1+1)-2yi-1-1 dx
dx(s-t)=2(xi-1dy-2yi-1dx)+2dy-dx
3.1.3Bresenham画线算法
令di=dx(s-t), 则 di=2(xi-1dy-2yi-1dx)+2dy-dx di+1=2(xidy-2yidx)+2dy-dx di+1-di=2dy(xi-xi-1)-2dx(yi-yi-1)
di+2*a di+1= di+2*(a+b) di<0 PT (xi+1,yi+1) di≥0 PB (xi+1,yi)
3.1.3 Bresenham画线算法
原理:过各行各列像素中心构造一组虚拟网格线,按直 线从起点到终点的顺序计算直线与各垂直网格线的交点, 然后确定该列像素中与此交点最近的像素。 若s<t,则Si比较靠近理 想直线,应选 Si (x+1,y) 若s≥t,则Ti比较靠近理 想直线,应选 Ti (x+1,y+1)
相关文档
最新文档