常用直线图形的生成算法
1、逐点比较法
在绘图的过程中,绘图笔每走一步就与规定的图形进行偏差比较,然后决定下一步的走向,所以算法的核心在于步进之后的偏差比较。
逐点比较法的执行过程可用下面的流程图来表示:
走向规定
对于一般的绘图机,画笔在平面的走向只有水平和垂直方向,所以规定走向为X方向和Y方向。
偏差计算(以0~90°的直线为例)
为了简化起见,直线的起点都固定在坐标系原点,实际实现时,对于任意直线可做坐标系变换,将坐标原点移到起点
参数:所画直线的斜率,作为计算偏差的原始参数
定义:目标直线的与X轴的夹角为α,画笔当前点与原点连线与X轴的夹角为β
偏差值: Δ=tan(β)−tan(α)
当 Δ<0 时,笔当前的位置在直线的下方,下一步向+Y的方向走一步
当 Δ⩾0 时,笔当前的位置在直线的上方,下一步向+X的方向走一步
用递推法简化偏差的计算
为了简化计算提高性能,实际算法实现时,常常使用递推法计算偏差。
定义: A(xA,yA) 是目标直线的终点, P(xP,yP) 是当前画笔的坐标。
所以上面提到的 Δ=(xA⋅yp−xp⋅yA)/xP⋅xA
分母恒正,所以只要考虑分子的符号。
当下一步为+Y 时
x2=x1,y2=y1+1代入之后,与之前的偏差进行比较,增量为 xA当下一步为+X 时
x2=x1+1,y2=y1代入之后,与之前的偏差进行比较,增量为 −yA
于是我们可以省去每步都进行