这是图形学期末复习攻略噢
一、图形生成算法
直线段扫描转换:(DDA算法、Bresenham画线算法、中点画线法)
圆弧扫描转换:(Bresenham画圆算法、中点画圆算法)
考一道大题,题目类型为给出一条直线或圆画图。(这是老师说的)
习题:
使用直线扫描方法绘制点P(0,0)到P(8,5)的直线段,分别使用如下方法绘制。1)DDA画线; 2)Bresenham画线;3)中点画线
答案见 "第二次作业答案.doc"
DDA
输入:起始点(x0,y0)、终点(x1,y1)
求斜率:m=(y1-y0)/(x1-x0)
for (x=x0; x≤x1, x++)
{ setpixel(x, int(y+0.5));
y=y+m;
}
解题技巧:
先写第一列和第三列,第一列为自然数,第三列为等比数列。将第三列取整得到第二列。
注意:
当|m|>1时,必须把x,y地位互换, y每增加1,x相应增加1/m。
DDA算法缺点:
在此算法中,y、m必须是float,且每一步都必须对y进行舍入取整,不利于硬件实现。
Bresenham画线算法
|m|<1时的算法:
输入线段的两个端点,并将左端点存储在(x0, y0)中。
画第一个点
计算
p0=2Δy-Δx-
从k=0开始,在沿线路径的每个xk处,进行两个步骤地判断:
重复步骤4, 共Δx次
#解题技巧:
首先计算几个常量。在斜率为正时,d的变化趋势是:d大于0,y加d减,d小于0,y不变d加。
中点画线算法
假设直线方程为:F(x,y)=ax+by+c=0
欲判断M点是在Q点上方还是在Q点下方,只需把M代入F(x,y),并检查它的符号。
算法步骤:
d0=2(a+0.5b)
若d≥0, 增量为2a ,y不变
若d<0,增量为2(a+b), y加1
解题技巧:
- 注意b要大于零,否则结果会反过来
- 计算初始d时记得乘2
- 解题时首先计算常量2a和2(a+b),这两个数一正一负。当直线斜率为正时,d为正,y不变 d减小,d为负,y加1 d增加。
中点画圆
算法步骤
d<0 上点
-
d>=0 下点
初始化: d=1.25-R、x=0、y=R 绘制点(x,y)及其在八分圆中的另外七个对称点 if d<0 d=d+2x+3 (x,y)->(x+1,y) if d>=0 d=d+2(x-y)+5 (x,y)->(x+1,y-1) x<y 结束
解题技巧:
- d的递推公式可以自己推出来
- 把握好y和d的增减趋势,所有情况一律为d正则减,d负则加,可以作为验算根据。
(未完待续)