计算机图形学实验教程.doc
计算机图形学实验教程
信息科学与工程系
实验名称
实验一 直线生成算法
实验二 圆的生成算法
实验三 椭圆的生成算法
实验四 多边形填充算法
实验五 二维图形的几何变换
实验六 常用曲面和曲线的生成算法
实验七 常用消隐算法
实验八 曲线和曲面算法的应用
实验九 真实感图形生成
实验一、直线生成算法
数值微分法 (DDA画线算法)
?DDA-Digital Differential Analyzer
?设直线两端点为:P1(x1,y1)及 P0(x0,y0),
?则直线斜率为
则直线方程为
当 k<1 , x每增加1,y 最多增加1(或增加小于1)。
当 k>1 ,y每增加1,x 最多增加1 (或增加小于1) 。
DDA算法:
复杂度:加法+取整
优点:避免了y=kx+b 方程中的浮点乘法,比直接用点斜式画线快
缺点:需浮点数加法及取整运算,不利于硬件实现.
上机实验一
题目:编写用DDA画线算法画线算法的程序。
要求:
1。写出DDA画线算法的基本思想和公式。并叙述其优缺点。
2。编写用DDA画线算法的程序。并比较其结果。
3。写出上机报告
中点画线法
?设0
中点M在直线下方,下一点取p1点
中点M在直线上方取p2点
中点算法: 用整数加法及比较代替了DDA中的浮点数加法及取整运算,效率大大提高.
直线方程: F(x,y)=ax+by+c=0
直线将二维空间划分为三个区域:
如F(x,y)=0, 则(x,y) 在直线上
如F(x,y)<0, 则(x,y)在直线下方
如F(x,y)>0, 则(x,y)在直线上方
条件: a= -(y1-y0)
b=(x1-x0)
c= -B(x1-x0)
设(x0,y0)和(x1,y1)分别为直线的两端点
(y=y1-y0, (x=x1-x0
由 y=kx+B 及k=(y/(x, k∈[0,1]
得:
y=((y/ (x).x+B
(y.x-(xy+(x.B=0
则直线一般方程为:
F(x,y)=(y.x- (x.y+B. (x=0
a= (y, b= -(x,c= B.(x
设 (x,y) 为直线上一点,将点P=(x,y+?m)代入直线 方程:
F(x,y+m)= (y.x-(x.(y+m)+B.(x= ((y.x-(x.y+B. (x)-(x.m =F(x,y)-(x.m
= -(x.m
因为(x>0
if m >0(即P点在直线上方) then F(x,y+yb)<0;
if m<0 (即P点在直线下方) then F(x,y+yb)>0;
定义决策变量:
d= F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c
如果 d>0,则M在理想直线上方,选正右方E点
如果 d<0,则M在理想直线下方,选右上方NE点
如果 d=0,则M在理想直线上,选E/NE点
由于d是xi和yi的线性函数k([0,1],可采用增量计算数提高运算效率.
1.如由pi点确定在是正右方E点(d>0).,则新的中点M仅在x方向加1,新的d值为:
dnew=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c
而 dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c
dnew=dold+a= dold-dy
2.如由pi点确定是右上方NE点(d<0),则新的中点M在x和y方向都增加1,新的d值为
dnew=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c
而 dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c
dnew=dold+a+b= dold-dy+dx
在每一步中,根据前一次第二迭中计算出的d值 的符号,在正右方和右上方的两个点中进行选择.
d的初始值:
d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2
F(x0,y0)=0 (x0,y0) 在直线上
为了消除d的分数,重新定义 F(x,y)=2(ax+by+c)
则每一步需要计算的dnew 是简单的整数加法
dy=y1-y0 dx=x1-x0
d0=-2dy+dx
dnew=dold-2*dy 当 dold>=0
dnew=dold-2(dy-dx) 当dold<0
Bresenham画线算法
与DDA算法相似, Bresenham画线算法也要在每列象素中找到与理想直线最逼近的象素点。
根据直线的斜率来确定变量在x或y方向递增一个单位。另一个方向y或x的增量为0或1,它取决于实际直线与最接近网格点位置的距离。这一距离称为误差。算法的巧