Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。

其原理是:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。

Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其本质思想也是步进的思想,但由于避免了浮点运算,相当于DDA算法的一种改进算法。

ac56fe66bca77b3c856622fdc3a0d76e.png

386b50ee079af7b8c0c42664ede939de.png

9a63cc93f60bafb7fd899b4b61bb97aa.png

源代码展示:

#include

#include

#include

#include

#define x0 400 //定义全局变量x0,y0:坐标轴中心(x0,y0)

#define y0 300

void Bresenham(int x1, int y1, int x2, int y2)

{

int x, y, dx, dy, p1, i;

dx = x2 - x1;

dy = y2 - y1;

if (abs(dx) > abs(dy)) //斜率绝对值在(0,1),步进方向为x轴

{

if (x1 < x2) //默认画点从左往右画

{

x = x1;

y = y1;

}

else

{

x = x2;

y = y2;

}

putpixel(x + x0, y0 - y, RED);

Sleep(50);

p1 = 2 * abs(dy) - abs(dx); //计算初始pi的值

for (i = min(x1, x2); i < max(x1, x2); i++)

{

x = x + 1;

if (p1 >= 0)

{

if (dx*dy >= 0)

y = y + 1;

else

y = y - 1; //若Pi>=0,y(i+1)=y(i)±1

p1 = p1 + 2 * (abs(dy) - abs(dx)); //更新pi

}

else

{

y = y; //若Pi<0,y(i+1)=y(i)

p1 = p1 + 2 * abs(dy); //更新pi

}

putpixel(x + x0, y0 - y, RED);

Sleep(50);

}

}

else

{

if (y1 < y2)

{ //步进方向为y轴,默认画点从下往上画

x = x1;

y = y1;

}

else

{

x = x2;

y = y2;

}

putpixel(x + x0, y0 - y, RED);

Sleep(50);

p1 = 2 * abs(dx) - abs(dy);

for (i = min(y1, y2); i < max(y1, y2); i++)

{

y = y + 1;

if (p1 >= 0)

{

if (dx*dy >= 0) //判断x方向是增加还是减少,很关键

x = x + 1;

else

x = x - 1;

p1 = p1 + 2 * (abs(dx) - abs(dy));

}

else

{

x = x;

p1 = p1 + 2 * abs(dx);

}

putpixel(x + x0, y0 - y, RED);

Sleep(50);

}

}

}

void main()

{

int x1, x2, y1, y2;

printf("请输入两个整数点的坐标(x1,y1),(x2,y2)\n");

scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

initgraph(800, 600); //初始化图形窗口大小

setbkcolor(WHITE);

cleardevice();

setcolor(BLACK);

line(0, y0, x0 * 2, y0); //坐标轴X

line(x0, 0, x0, y0 * 2); //坐标轴Y

Bresenham(x1, y1, x2, y2); //Bresenham画线算法

_getch(); //等待一个任意输入结束

closegraph(); //关闭图形窗口

}

结果显示:

f2c70e5895f9198b8c9808bd9a6d0bb2.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐