通过EasyX实现中点画线

作为数值微分法(DDA)的改进算法,中点画线法【采用了直线的一般式方程、增量思想,实现整数加法】

中点画线法

每次在最大位移方向上走一步,而另一个方向是走步还是不走步要取决于中点误差项的判断。
假定:0<=|k|<=1,每次在x方向上加1,y方向上加或不变需要判断。

d是x,y的线性函数采用增量计算是可行的,所以可以用增量计算的方法导出d的增量表达式,且增量计算提高运算效率:


可以用2d代替d来摆脱浮点运算——>能写出仅包含整数运算的算法——>中点生成直线的算法提升到整数加法——>优于DDA算法

实现如下:

#include <graphics.h>
#include <conio.h>

// 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Midpoint(int x1, int y1, int x2, int y2, int color)
{
	int x = x1, y = y1;
	int a = y1 - y2, b = x2 - x1;
	int cx = (b >= 0 ? 1 : (b = -b, -1));
	int cy = (a <= 0 ? 1 : (a = -a, -1));

	putpixel(x, y, color);

	int d, d1, d2;
	if (-a <= b)		// 斜率绝对值 <= 1
	{
		d = 2 * a + b;
		d1 = 2 * a;
		d2 = 2 * (a + b);
		while (x != x2)
		{
			if (d < 0)
				y += cy, d += d2;
			else
				d += d1;
			x += cx;
			putpixel(x, y, color);
		}
	}
	else				// 斜率绝对值 > 1
	{
		d = 2 * b + a;
		d1 = 2 * b;
		d2 = 2 * (a + b);
		while (y != y2)
		{
			if (d < 0)
				d += d1;
			else
				x += cx, d += d2;
			y += cy;
			putpixel(x, y, color);
		}
	}
}

// 主函数
int main()
{
	initgraph(640, 480);

	// 测试画线
	Line_Midpoint(100, 1, 1, 478, GREEN);
	Line_Midpoint(1, 478, 638, 1, GREEN);

	// 按任意键退出
	_getch();
	closegraph();
	return 0;
}

结果如下:

参考链接:

https://www.cnblogs.com/Penglimei/p/9669132.html

https://codebus.cn/yangw/a/midpoint-line-algorithm

发布了109 篇原创文章 · 获赞 179 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44350205/article/details/105641819