C语言——Bresenham算法生成直线(easyx图形库)

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

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

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

 

 

源代码展示:

#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<conio.h>
#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();                        //关闭图形窗口
}


 结果显示:

  • 12
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MMagicLoren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值