画线算法-Bresenham算法

    xiaoxiao2021-12-14  22

            Bresenhan算法将坐标系分割成棋盘形状,每个像素占有一个棋格,当我们进行采样时(直线斜率小于1),如下图所示,假设给定绘图的起始点为(10,11),那么绘制下一个采样点的坐标必然是从(11,11)和(11,12)中选择一个。如果把这种情况一般化,对于绘制直线的起始点是(Xk,Yk),那么其下一个采样点必然是(Xk+1,Yk)或者(Xk+1,Yk+1)中的一个。

      

      想要得到3.16表达式,需要将yk=m*xk+b带入3.14中,而且应该注意△y和△x都是常量,△y为给定的起始点和终点的纵坐标差的绝对值,△x为给定的起始点和终点的横坐标的差的绝对值。

    void lineBresenham(int x0,int y0,int xEnd,int yEnd) { int x,y; int dx=fabs(xEnd-x0),dy=fabs(yEnd-y0); int p=2*dy-dx; int twody=2*dy,twodysubdx=2*(dy-dx); if(x0>xEnd) { x=xEnd; y=yEnd; xEnd=x0; yEnd=y0; } else { x=x0; y=y0; } SetPixel(x,y); while (x<xEnd) { x++; if(p<0) { p+=twody; } else { y++; p+=twodysubdx; } SetPixel(x,y); } }   这是当直线的斜率小于1的情况,当斜率大于1时,只需交换x和y的计算规则,沿着y方向单位步长移动,来计算x的值即可。Opengl中绘制效果:

    转载请注明原文地址: https://ju.6miu.com/read-962763.html

    最新回复(0)