直线的扫描转换

本文介绍了直线的扫描转换,包括直接计算法、数值微分法(DDA)以及重点讲解了中点Bresenham算法,阐述了算法原理、中点误差项的构造、递推公式及初始值的计算,旨在优化直线绘制的效率。
摘要由CSDN通过智能技术生成

直接计算法

假定直线的起点、终点分别为:(x1,y1), (x2,y2),且都为整数。
计算出斜率k=(y2-y1)/(x2-x1) ,
在Y轴的截距b=y1-k*x1 
这里写图片描述

这样一来,只要给定 x的值,根据解析式立即可以计算出对应的y值,然后输出(x,round(y))。这种方法直观,但效率太低,因为每一步需要一次浮点乘法、一次浮点加法和一次舍入运算。

数值微分法(DDA)

假定直线的起点、终点分别为:(x1,y1), (x2,y2),且都为整数。 
这里写图片描述

已知过端点P0 (x1, y1), P1(x2, y2)的直线段L:y=kx+b
直线斜率为:k=(y2-y1)/(x2-x1)
考虑当x从xi xi+1时y的变化规律:
设:
Δx=xi+1xi Δ x = x i + 1 − x i
xi+1=xi+Δx x i + 1 = x i + Δ x

计算:
yi+1=kxi+1+b=k(xi+Δx)+b=kxi+b+kΔx=yi+kΔx y i + 1 = k x i + 1 + b = k ( x i + Δ x ) + b = k x i + b + k Δ x = y i + k Δ x
Δx=1;yi+1=yi+k Δ x = 1 ; y i + 1 = y i + k
即:当x每递增1,y递增k(即直线斜率);
注意上述分析的算法仅适用于|k|≤1的情形。在这种情况下,x每增加1,y最多增加1。
当 |k|>1时,必须把x,y地位互换。

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++){     
      drawpixel (x, int(y+0.5), color); 
        y=y+k;
     }
}

中点Bresenham算法

原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点误差项的值。给定理想直线的起点坐标为P0(x0,y0),终点坐标为P1(x1,y1),则直线的隐函数方程为:
F(x,y)=ykxb=0 F ( x , y ) = y − k x − b = 0
其中,直线的斜率: k=ΔyΔx=y1y0x1x0 k = Δ y Δ x = y 1 − y 0 x 1 − x 0
直线水平方向位移: Δx=x1x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值