📜  计算机图形学Bresenham的线算法

📅  最后修改于: 2020-12-20 03:56:58             🧑  作者: Mango

布雷森汉姆线算法

该算法用于扫描转换线。它是由Bresenham开发的。这是一种有效的方法,因为它只涉及整数加法,减法和乘法运算。这些操作可以非常快速地执行,因此可以快速生成线。

在此方法中,选择的下一个像素是与真实线距离最小的像素。

该方法的工作方式如下:

假设一个像素P 1 '(x 1 ',y 1 '),然后选择我们可能工作到深夜的后续像素,在水平方向上一次朝P 2 '(x 2 ',y 2)一个像素位置')。

随时选择一个像素

下一个像素是

  • 右边的任一行(该行的下界)
  • 顶部在其右上方(行的上限)

该线最好由那些距P 1 ',P 2 '之间的路径的距离最小的像素来近似。

要在底部像素S和顶部像素T之间选择下一个像素。
如果选择S
我们有x i + 1 = x i +1和y i + 1 = y i
如果选择了T
我们有x i + 1 = x i +1和y i + 1 = y i +1

在x = x i + 1处线的实际y坐标为
y = mx i + 1 + b

从S到y方向上的实际线的距离
s = y i

从T到y方向上的实际线的距离
t =(y i +1)-y

现在考虑这两个距离值之间的差异
吨< p="">

当(st)<0 s s

最接近的像素是S

当(st)≥0s s

最近的像素是T

这个区别是
st +="" -1<="" 1)-y]
="2y-2yi" =(y-yi)-[(yi="" p="">

用m代替布雷森汉姆线算法并引入决策变量
d i =△x(st)
d i =△x(2 布雷森汉姆线算法 (x i +1)+ 2b-2y i -1)
= 2△xy i -2△y-1△x.2b-2y i △x-△x
d i = 2△yx i -2△xy i + c

其中c = 2△y +△x(2b-1)

我们可以为下一个滑动写决策变量d i + 1
d i + 1 = 2△yx i + 1 -2△xy i + 1 + c
d i + 1 -d i = 2△y。(x i + 1 -x i )-2△x(y i + 1 -y i )

由于x_(i + 1)= x i +1,我们有
d i + 1 + d i = 2△y。(x i + 1-x i )-2△x(y i + 1 -y i )

特别案例

如果选择的像素是在顶部像素T(即,d≥0)⟹ýi + 1的= Y+1
d i + 1 = d i + 2△y-2△x

如果选择的像素在底部像素T处(即d i <0)⟹y i + 1 = y i
d i + 1 = d i + 2△y

最后,我们计算d 1
d 1 =△x [2m(x 1 +1)+ 2b-2y 1 -1]
d 1 =△x [2(mx 1 + by 1 )+ 2m-1]

由于mx 1 + by i = 0和m = 布雷森汉姆线算法 , 我们有
d 1 = 2△y-△x

优点:

1.它仅涉及整数算术,因此很简单。

2.避免了重复点的产生。

3.因为它不使用乘法和除法,所以可以使用硬件来实现。

4.与DDA(数字差分分析仪)相比,它更快,因为它不涉及DDA算法之类的浮点计算。

坏处:

1.此算法仅用于基本线条绘制。初始化不是Bresenham线条算法的一部分。因此,要绘制平滑的线条,您应该要研究其他算法。

布雷森纳姆线算法:

步骤1:开始算法

步骤2:声明变量x 1 ,x 2 ,y 1 ,y 2 ,d,i 1 ,i 2 ,dx,dy

步骤3:输入x 1 ,y 1 ,x 2 ,y 2的值
其中x 1 ,y 1是起点的坐标
x 2 ,y 2是终点的坐标

步骤4:计算dx = x 2 -x 1
计算dy = y 2 -y 1
计算i 1 = 2 * dy
计算i 2 = 2 *(dy-dx)
计算d = i 1 -dx

步骤5:将(x,y)作为起点,将x end作为x的最大可能值。
如果dx <0
然后x = x 2
y = y 2
x末端= x 1
如果dx> 0
然后x = x 1
y = y 1
x结束= x 2

步骤6:在(x,y)坐标处生成点。

步骤7:检查是否生成了整行。
如果x> = x结束
停止。

步骤8:计算下一个像素的座标
如果d <0
然后d = d + i 1
如果d≥0
然后d = d + i 2
y = y + 1

步骤9:递增x = x + 1

步骤10:绘制最新(x,y)坐标点

步骤11:前往步骤7

步骤12:算法结束

示例:该行的开始和结束位置是(1,1)和(8,5)。寻找中间点。

解决方案: x 1 = 1
y 1 = 1
x 2 = 8
y 2 = 5
dx = x 2 -x 1 = 8-1 = 7
dy = y 2 -y 1 = 5-1 = 4
I 1 = 2 * ∆y = 2 * 4 = 8
I 2 = 2 *(∆y-∆x)= 2 *(4-7)=-6
d = I 1- Δx= 8-7 = 1

x y d=d+I1 or I2
1 1 d+I2=1+(-6)=-5
2 2 d+I1=-5+8=3
3 2 d+I2=3+(-6)=-3
4 3 d+I1=-3+8=5
5 3 d+I2=5+(-6)=-1
6 4 d+I1=-1+8=7
7 4 d+I2=7+(-6)=1
8 5

实现Bresenham的线条绘制算法的程序:

#include
#include
void drawline(int x0, int y0, int x1, int y1)
{
    int dx, dy, p, x, y;
    dx=x1-x0;
    dy=y1-y0;
    x=x0;
    y=y0;
    p=2*dy-dx;
    while(x=0)
        {
            putpixel(x,y,7);
            y=y+1;
            p=p+2*dy-2*dx;
        }
        else
        {
            putpixel(x,y,7);
            p=p+2*dy;}
            x=x+1;
        }
}
int main()
{
    int gdriver=DETECT, gmode, error, x0, y0, x1, y1;
    initgraph(&gdriver, &gmode, "c:\\turboc3\\bgi");
    printf("Enter co-ordinates of first point: ");
    scanf("%d%d", &x0, &y0);
    printf("Enter co-ordinates of second point: ");
    scanf("%d%d", &x1, &y1);
    drawline(x0, y0, x1, y1);
    return 0;
}

输出:

DDA算法和布雷森汉姆线算法之间的区别:

DDA Algorithm Bresenham’s Line Algorithm
1. DDA Algorithm use floating point, i.e., Real Arithmetic. 1. Bresenham’s Line Algorithm use fixed point, i.e., Integer Arithmetic
2. DDA Algorithms uses multiplication & division its operation 2.Bresenham’s Line Algorithm uses only subtraction and addition its operation
3. DDA Algorithm is slowly than Bresenham’s Line Algorithm in line drawing because it uses real arithmetic (Floating Point operation) 3. Bresenham’s Algorithm is faster than DDA Algorithm in line because it involves only addition & subtraction in its calculation and uses only integer arithmetic.
4. DDA Algorithm is not accurate and efficient as Bresenham’s Line Algorithm. 4. Bresenham’s Line Algorithm is more accurate and efficient at DDA Algorithm.
5.DDA Algorithm can draw circle and curves but are not accurate as Bresenham’s Line Algorithm 5. Bresenham’s Line Algorithm can draw circle and curves with more accurate than DDA Algorithm.

st>


吨<>