Bresenham 画线算法是由 Bresenham 提出的一种精确而有效的光栅线生成算法,该算法仅仅使用了
整数的增量来实现的。
Bresenham 算法将对整形参数的符号检测,整形参数的值比于实际险段之间的偏量。
Bresenham 算法内容
对于直线方程 Y = kX + b;
A , 0< 斜率 < 1 时候的算法
1, 输入线段的两个端点 Point1 和 Point2 ,并且存储到 Point1(x1,y1) 和 Point2(x2,y2) 中;
2, 将 Point1 载入桢缓存,绘画第一个起始点;
3, 计算常量△ x 、△ y 、 2 △ y 和 2( △ y- △ x) ,并且获得一个决策参数的第一个值: P = 2 △ y - △ x ;
4, 从 n = 0 开始,在沿线经过每个 Xn 处,进行下面的监测 :
如果 Pn< 0, 下一个点绘制的是 (Xn+1,yn) ,并且 Pn+1= Pn + 2 △ y
如果 P0>= 0 , 下一个点绘制的是 (Xn+1,Yn+1) ,并且 Pn+1 = Pn + 2 (△ y- △ x )
5, 重复执行 △ x-1 次 步骤 4 ;
关于在 C++ 中的算法如下实例:
#include <iostream>
using namespace std;
void Bresenham(int x1,int y1,int x2,int y2){
int dx = x2 - x1;//△x
int dy = y2 - y1;//△y
int p = (2*dy) - dx ; //P = 2△y - △x
int dobDy = 2* dy ; // 2 △y
int dobD = 2*(dy - dx) ; // 2(△y - △x)
int PointX,PointY;
//设置两个临时用来显示位置的变量
if( x1 > x2){ //判断线段的方向
PointX = x2;//起始坐标X
PointY = y2;起始坐标Y
x2 = x1;
}
else{
PointX = x1;//起始坐标X
PointY = y1;//起始坐标Y
}
//达因第一个起始点
cout<<"Point: X:"<<PointX<<" Y:"<<PointY<<endl;
while(PointX<x2){
PointX++;
if(p < 0){
p += dobDy;
}
else{
PointY++;
p += dobD;
}
cout<<"Point: X:"<<PointX<<" Y:"<<PointY<<endl;
}
}
int main(){
//绘画线段(2,2点到(60,50)需要的点
Bresenham(20,10,30,18);
return 0;
}
B ,斜率 k = 1 或这斜率 k = 0 时候的算法
对于斜率 =0 或者斜率 =1 时候,不需要通过算法直接的对于其中单一坐标变量进行处理就可以。
C, 斜率 k < 0 的情况算法
将起始点和中止点坐标 Point1 和 Point2 交换,可以转化到斜率为 0 和 1 之内的算法去实现。