三点定位

代码

// 三点定位
function ThreePointOrientation(A, B, C) {
    var a = [A, B, C];
    var delta = -1;
    var intersects = [];
    intersect(A, B);
    checkPoint(C);
    return intersects;

    // 计算两个圆的交点
    function intersect(AP, BP) {
        var a, b, c;
        var x_1, x_2, y_1, y_2;
        var delta = -1;
        var x1 = AP.x,
            y1 = AP.y,
            r1 = AP.d;
        var x2 = BP.x,
            y2 = BP.y,
            r2 = BP.d;
        if(y1 != y2) {
            var A = (x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 + r2 * r2 - r1 * r1) / (2 * (y1 - y2));
            var B = (x1 - x2) / (y1 - y2);
            a = 1 + B * B;
            b = -2 * (x1 + (A - y1) * B);
            c = x1 * x1 + (A - y1) * (A - y1) - r1 * r1;
            delta = b * b - 4 * a * c;
            if(delta > 0) {

                x_1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                x_2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                y_1 = A - B * x_1;
                y_2 = A - B * x_2;
            } else if(delta == 0) {
                x_1 = x_2 = -b / (2 * a);
                y_1 = y_2 = A - B * x_1;
            } else {
                console.log("两个圆不相交");
                return null;
            }
        } else if(x1 != x2) {
            //当y1=y2时,x的两个解相等
            x_1 = x_2 = (x1 * x1 - x2 * x2 + r2 * r2 - r1 * r1) / (2 * (x1 - x2));

            a = 1;
            b = -2 * y1;
            c = y1 * y1 - r1 * r1 + (x_1 - x1) * (x_1 - x1);

            delta = b * b - 4 * a * c;

            if(delta > 0) {
                y_1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                y_2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
            } else if(delta == 0) {
                y_1 = y_2 = -b / (2 * a);
            } else {
                console.log("两个圆不相交");
                return null;
            }
        } else {
            console.log("无解");
            return null;
        }
        var intersect1 = Point.createNew(x_1.toFixed(2)*1, y_1.toFixed(2)*1);
        var intersect2 = Point.createNew(x_2.toFixed(2)*1, y_2.toFixed(2)*1);
        intersects.push(intersect1);
        if(delta != 0) {
            intersects.push(intersect2);
        }
    }

    // 将两个圆的交点代入第三个圆计算三个圆的交点
    function checkPoint(a) {
        var temp = [];
        for(let i = 0; i < intersects.length; i++) {
            var d1 = Math.sqrt(Math.pow(intersects[i].x - a.x, 2) + Math.pow(intersects[i].y - a.y, 2));
            d1 = d1.toFixed(2)*1;
            if(d1 == a.d) {
                temp.push(intersects[i]);
            }
        }
        intersects = temp.concat();
    }
}

测试

var a = {x:135,y:58.4,d:36.59};
var b = {x:135,y:146.4,d:85.16};
var v = {x:135,y:210.4,d:145.88};
var calPoint = ThreePointOrientation(a, b, c);
console.log(calPoint);

备注

特殊情况下会定位出两个点,若要确定单个点,只需要再多加一个点定位即可

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
三点定位是一种利用三个已知点的位置信息来确定目标点位置的算法。在Matlab中,可以通过下述步骤实现三点定位算法。 首先,需要定义三个已知点的位置信息。可以通过给定的三个点的坐标(或者其它位置信息)来表示它们在二维或者三维空间中的位置。假设这三个已知点的位置信息分别为(x1, y1, z1),(x2, y2, z2)和(x3, y3, z3)。 接下来,根据三点定位的原理,我们可以通过计算目标点到每个已知点的距离来确定目标点的位置。在Matlab中,可以使用欧氏距离公式来计算目标点到已知点的距离,即: d1 = sqrt((x - x1)^2 + (y - y1)^2 + (z - z1)^2) d2 = sqrt((x - x2)^2 + (y - y2)^2 + (z - z2)^2) d3 = sqrt((x - x3)^2 + (y - y3)^2 + (z - z3)^2) 然后,根据三个已知点的位置与目标点的距离关系,可以建立一个方程组来求解目标点的位置。具体来说,如果设目标点的位置为(x, y, z),则有: d1 = sqrt((x - x1)^2 + (y - y1)^2 + (z - z1)^2) d2 = sqrt((x - x2)^2 + (y - y2)^2 + (z - z2)^2) d3 = sqrt((x - x3)^2 + (y - y3)^2 + (z - z3)^2) 利用Matlab的求解方程组的函数,可以得到(x, y, z)的解,即目标点的位置。 最后,可以将得到的目标点的位置在Matlab中进行可视化展示,以便更好地理解和分析三点定位算法的结果。 总之,通过定义已知点的位置信息,计算目标点到已知点的距离,并利用求解方程组得到目标点的位置,可以在Matlab中实现三点定位算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo的心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值