bresenham贝汉明算法

参考:https://www.jianshu.com/p/d63bf63a0e28
https://blog.csdn.net/chaosir1991/article/details/109561010
算法作用:如下图所示,在栅格地图中,给定两个坐标点得出两点说形成的直线所经过的栅格,在建图时可以对雷达射线扫过miss的点进行概率更新。
bresenham贝汉明算法_第1张图片

本文仅考虑直线在第一象限,斜率大于0且小于等于1时的情况,其他情况读者可根据对称性推倒得出。
文末附有代码实现。

// 设起点为(x1, y1),终点为(x2, y2)。画起点(x1, y1)。

1.令x=x1,y=y1;
2.准备画下个点。x坐标+1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。
2.1.如果线段y=f(x)与直线x=x1+1交点的纵坐标大于M点(x+1,y+0.5)的纵坐标的话,下个点为U(x+1,y+1)
2.2.否则,下个点为B(x+1,y)
3.画点(U或者B).
4.跳回第2步.
5.结束.

bresenham贝汉明算法_第2张图片求解思路
设线段方程:y=kx+b(x1

从第一个点开始,我们有y1=f(x1)
下面求线段y=f(x)与x=x1+1的交点:
交点的纵坐标y=f(x1+1)=k(x1+1)+b
所以交点与M的纵坐标差值sub1 = f(x1+1)-(y1+0.5) = k(x1+1)+b - (y1+0.5) = k-0.5(k为斜率)。
则可得条件,当 sub1 = k-0.5>0时候,即下个点为U;反之,下个点为B.

接下来需要找到sub2与sub1的关系,即使用sub1表示sub2。

当sub1>0时,则
sub2 =[f(x1+2)]-[(y1+0.5)+1] =[f(x1+1)+k]-[(y1+0.5)+1]= sub1+k-1,这样就得到了sub2与sub1的关系,方便递归计算,方便代码实现。其中,
sub1 = f(x1+1)-(y1+0.5);
f(x1+2)=f(x1+1)+k;理解:当x增加1,y增加k(k为斜率)。

当sub1<0时,则
sub2 =[f(x1+2)]-[(y1+0.5)] =[f(x1+1)+k]-[(y1+0.5)]= sub1+k,其中
sub1 = f(x1+1)-(y1+0.5);
f(x1+2)=f(x1+1)+k;理解:当x增加1,y增加k(k为斜率)。

代码实现,其中代码中起点为(xa,ya),终点为(xb,yb)

// 直线在第一象限,斜率大于0且小于等于1时,贝汉明(bresenham)算法的实现
// 使用时需要输入x1,y1,x2,y2的坐标,例如:1  2  9  7
#include 
using namespace std;

int main()
{
        int xa,ya,xb,yb;  // 起点和终点的坐标
        cout << "请输入x1,y1,x2,y2坐标:" << endl;
        cin >> xa >>ya >> xb >> yb;

        float k = (float)(yb-ya)  / (xb-xa);  //斜率k
        cout << k << endl;
        if (k > 1 || k <= 0)
        {
                //cout << k << endl;
                cout << "直线斜率不满足大于0且小于等于1。" << endl;
                return 0;
        }

        int x = xa, y = ya;
        float sub = k - 0.5;
        cout << "sub = " << sub << endl;
        // 首先打印起点
        cout << x << "  " << y << endl;
        
        while(x<xb)
        {
                x++;
                if (sub > 0)
                {
                        sub += k - 1;
                        y++;
                }
                else
                {
                        sub += k;
                }
                cout << x << "  " << y << endl;
        }

        return 0;
}

你可能感兴趣的:(算法,几何学,概率论)