光栅图形学(一)——直线段的扫描转换算法

1. 数值微分法

  已知过端点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0) P 1 ( x 1 , y 1 ) P_1(x_1,y_1) P1(x1,y1)的直线段 L ( P 0 , P 1 ) L(P_0,P_1) L(P0,P1);直线斜率 k = y 1 − y 0 x 1 − x 0 k = \frac{y_1 - y_0}{x_1 - x_0} k=x1x0y1y0。画线的过程为:从 x x x的左端点 x 0 x_0 x0开始,向右端点步进,步长为1(像素),按 y = k x + b y = kx +b y=kx+b计算相应的 y y y坐标,并取像素点 ( x , r o u n d ( y ) ) (x,round(y)) (x,round(y))作为当前坐标。但这样做,计算每一个点需要做一个乘法、一个加法。设步长为 Δ x \Delta x Δx,有 x i + 1 = x i + Δ x x_{i+1} = x_i + \Delta x xi+1=xi+Δx,于是
(1.1) y i + 1 = k x i + 1 + b = k x i + k Δ x + b = y i + k Δ x y_{i+1} = kx_{i+1} + b = kx_i + k \Delta x + b = y_i + k\Delta x \tag{1.1} yi+1=kxi+1+b=kxi+kΔx+b=yi+kΔx(1.1)
  当 Δ x = 1 \Delta x = 1 Δx=1时,有 y i + 1 = y i + k y_{i+1} = y_i + k yi+1=yi+k。即 x x x每递增1, y y y递增 k k k(即直线的斜率)。这样,计算就由一个乘法和加法减少为一个加法。

  • 算法程序:DDA画线算法程序
void DDALine(int x0, int y0, int x1, int y1, int color)
{
   
	int x;
	float dx, dy, y, k;
	dx = x1 - x0, dy = y1 - y0;
	k = dy/dx, y = y0;
	for(x = x0; x < x1; x++,y+=k)
	{
   
		drawpiexl(x, int(y + 0.5), color);
	}
}

注意: 用int(y + 0.5)取整的目的是为取离真正交单近的像素网格点作为光栅化的点。
  应当注意的是,上述算法仅适用于 k ≤ 1 k \leq 1 k1的情形。在这种情况下, x x x每增加1, y y y最多增加1。当 ∣ k ∣ ≥ 1 |k| \ge 1 k1时,必须把 x , y x,y x,y地位互换, y y y每增加1, x x x相应增加 1 / k 1/k 1/k。本节的其它算法也是如此。在这个算法中, y y y k k k必须用浮点数表示,而且每一步都要对 y y y进行四舍五入后取整,这使得该算法不利于硬件的实现。

2.中点画线法

在这里插入图片描述
  通过观察可以发现,画直线段的过程中,当前像素点 ( x p , y p ) (x_p,y_p) (xp,yp),下一个像素点有两种选择点 P 1 ( x p + 1 , y p ) P_1(x_p+1,y_p) P1(xp+

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值