Bresenham 算法画直线

参考:Bresenham 画线算法推导过程_在到处之间找我-CSDN博客_bresenham画线算法今天复习这个算法的时候,有一点没有立马反应过来,故特此记此篇博客作为备忘。文章目录描点原理用 $p_i$ 代替 $d_1 - d_2$$p_i$ 递推如何确定 $p_1$ 呢?程序代码描点原理原理就是描实距离D点最近的那个点,距离的判断通过判断d1和d2的大小来确定。d1大,说明距离(xi+1,yi)(x_i + 1, y_i)(xi​+1,yi​)更远,要描实(xi+1,yi+1)(x_i...https://blog.csdn.net/sinat_41104353/article/details/82858375

 

 

 

代码实现

void Canvas::drawLine(intV2 pt1, intV2 pt2, RGBA _color)
	{
		int disY = abs(pt2.y - pt1.y);	// △y
		int disX = abs(pt2.x - pt1.x);  // △x
										// 直线的斜率 k = △y / △x

		int xNow = pt1.x;
		int yNow = pt1.y;

		int stepX = 0;
		int stepY = 0;

		//判断2个方向步进的正负
		pt1.x < pt2.x ? stepX = 1 : stepX = -1;
		pt1.y < pt2.y ? stepY = 1 : stepY = -1;

		//对比xy偏移量,决定步进的方向选取x or y
		int sumStep = disX;			//默认步进方向为x方向,步进总数为 △x
		bool useXStep = true;

		//斜率与1进行对比,如果斜率大于1,则使用y方向进行步进
		if (disX < disY) {
			sumStep = disY;
			useXStep = false;
			SWAP_INT(disX, disY)
		}

		/*
			Bresenham 算法结论:

			0、P_1 = 2△y - △x

			1、P_i >= 0
							y_(i+1) = y_i + 1
							P_(i+1) = P_i + 2(△y - △x)

			2、P_i < 0
							y_(i+1) = y_i
							P_(i+1) = P_i + 2△y
		
		*/

		//初始化P值
		int p = 2 * disY - disX;

		//算法
		for (int i = 0; i < sumStep; i++) {
			drawPoint(xNow, yNow, _color);
			if (p >= 0) {
				if (useXStep) {
					yNow += stepY;
				}
				else {
					xNow += stepX;
				}

				p = p /*+ 2* disY*/ - 2 * disX;
			}

			//步进主坐标
			useXStep ? xNow += stepX : yNow += stepY;

			//计算下一点的判别式
			p = p + 2 * disY;
		}
	}

 

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值