慢羊羊的空间

无为,无我,无欲,居下,清虚,自然

[图形学] 画任意斜率的直线(基于 Bresenham 算法) 铜牌收录

图形学中的 Bresenham 画直线算法,以下是该算法的 C 语言实现:

///////////////////////////////////////////////////
// 程序名称:基于 Bresenham 算法画任意斜率的直线
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版
// 作  者:yangw80 <yw80@qq.com>
// 发布日期:2011-4-26
//
#include <graphics.h>
#include <conio.h>

// 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Bresenham(int x1, int y1, int x2, int y2, int color)
{
	int x = x1;
	int y = y1;
	int dx = abs(x2 - x1);
	int dy = abs(y2 - y1);
	int s1 = x2 > x1 ? 1 : -1;
	int s2 = y2 > y1 ? 1 : -1;
	
	bool interchange = false;	// 默认不互换 dx、dy
	if (dy > dx)				// 当斜率大于 1 时,dx、dy 互换
	{
		int temp = dx;
		dx = dy;
		dy = temp;
		interchange = true;
	}
	
	int p = 2 * dy - dx;
	for(int i = 0; i < dx; i++)
	{
		putpixel(x, y, color);
		if (p >= 0)
		{
			if (!interchange)		// 当斜率 < 1 时,选取上下象素点
				y += s2;
			else					// 当斜率 > 1 时,选取左右象素点
				x += s1;
			p -= 2 * dx;
		}
		if (!interchange)
			x += s1;				// 当斜率 < 1 时,选取 x 为步长
		else
			y += s2;				// 当斜率 > 1 时,选取 y 为步长
		p += 2 * dy;
	}
}

// 主函数
int main()
{
	initgraph(640, 480);
	
	// 测试画线
	Line_Bresenham(100, 1, 1, 478, GREEN);
	Line_Bresenham(1, 478, 638, 1, GREEN);
	
	// 按任意键退出
	_getch();
	closegraph();
	return 0;
}

评论 (2) -

  • for (int i = 0; i <= dx; i++)
    这个样多写一个等于号就更全面了,不然会少画一个像素。
    • 谢谢提醒!不过,写这个算法的时候,设计的就是不包括终点像素。

添加评论