Bresenham 画线算法


Bresenham 画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用了

整数的增量来实现的。

Bresenham算法将对整形参数的符号检测,整形参数的值比于实际险段之间的偏量。

Bresenham算法内容

对于直线方程 Y = kX + b;

A0< 斜率 < 1 时候的算法

   1,输入线段的两个端点Point1Point2,并且存储到Point1(x1,y1)Point2(x2,y2)中;

   2,Point1载入桢缓存,绘画第一个起始点;

   3,计算常量△x、△y2y2(y-x),并且获得一个决策参数的第一个值:P = 2y - x

   4,n = 0开始,在沿线经过每个Xn处,进行下面的监测:

        如果Pn< 0, 下一个点绘制的是(Xn+1,yn),并且Pn+1= Pn + 2y

        如果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(
2,2,60,50);

    
return 0;
}

 

 

B,斜率 k = 1 或这斜率 k = 0 时候的算法

 对于斜率=0或者斜率=1时候,不需要通过算法直接的对于其中单一坐标变量进行处理就可以。

 

C, 斜率 k < 0 的情况算法

将起始点和中止点坐标Point1Point2交换,可以转化到斜率为01之内的算法去实现。 

 

你可能感兴趣的:(1.2,-,游戏设计)