实现Bresenham提取线段上的所有点(图像栅格化)

主要是在原来算法的基础上略微修改,增加了对首尾端点的处理:

#include "opencv.hpp"

// 交换整数 a 、b 的值
inline void swap_int(int*a, int *b)
{
	*a ^= *b;    *b ^= *a;    *a ^= *b;
}

// Bresenham's line algorithm
bool GetLinePts(int x1, int y1, int x2, int y2, std::vector<cv::Point>& vPts)
{
	//参数 c 为颜色值
	//增加第一个端点
	cv::Point ptStart(x1, y1);
	cv::Point ptEnd(x2, y2);
	vPts.push_back(ptStart);

	int dx = abs(x2 - x1), dy = abs(y2 - y1), yy = 0;
	if (dx < dy)
	{
		yy = 1;
		swap_int(&x1, &y1);
		swap_int(&x2, &y2);
		swap_int(&dx, &dy);
	}
	int ix = (x2 - x1) > 0 ? 1 : -1, iy = (y2 - y1) > 0 ? 1 : -1, cx = x1, cy = y1, n2dy = dy * 2, n2dydx = (dy - dx) * 2, d = dy * 2 - dx;
	if (yy) { // 如果直线与 x 轴的夹角大于 45 度
		while (cx != x2)
		{
			if (d < 0)
			{
				d += n2dy;
			}
			else
			{
				cy += iy;
				d += n2dydx;
			}
			vPts.push_back(cv::Point(cy, cx));
			cx += ix;
		}
	}
	else
	{
		// 如果直线与 x 轴的夹角小于 45 度
		while (cx != x2)
		{
			if (d < 0)
			{
				d += n2dy;
			}
			else
			{
				cy += iy;
				d += n2dydx;
			}
			vPts.push_back(cv::Point(cx, cy));
			cx += ix;
		}
	}

	//需要包含首尾端点,进行处理
	if (vPts.size() >= 2 && vPts[0] == vPts[1])
	{
		vPts.erase(vPts.begin());
	}

	if (vPts.size() && vPts[vPts.size() - 1] != ptEnd)
	{
		vPts.push_back(ptEnd);
	}

	return true;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值