首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不断缩放3个圆,直到它们相交

不断缩放3个圆,直到它们相交
EN

Stack Overflow用户
提问于 2019-05-23 19:06:13
回答 1查看 464关注 0票数 0

我已经用Python语言实现了trilateration定位算法,到目前为止,由于计算的距离受到信号干扰的影响,所以结果看起来很不对劲,所以看起来是这样的:

当它看起来像这样的时候:

因此,我在考虑使用一个恒定因子同时缩放这些圆,直到它们都在一点相交(这将是最优的),或者直到它们的相互距离之和最小。给定2D空间中三个圆的XY坐标,以及它们与参考点(其中一个圆的圆心)之间的FSPL-computed距离,该函数应返回使误差最小的最佳缩放因子。它应该是这样的:

代码语言:javascript
复制
def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
  # some magic here
  return scalingConstant

find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)

我不是一个数学家,所以我不知道这个逻辑是否有意义,但如果有人有什么评论或更好的想法,请分享它们。这会有很大的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 22:36:00

让圆具有带坐标的中心:

并让相应的半径,你已经计算,是:

分别使用。所以看起来你是在寻找要点

以及具有以下属性的比例因子:

同样,我们需要找到一个点

在三个圆的公共交点所在的平面上,我们需要求解这个系统。

很明显,上面的系统和系统之前编写的属性是等价的。

为了简化问题,将系统中的每个等式的两边平方:

根据毕达哥拉斯定理,写下

这就是为什么,在显式公式中,上面的三个平方方程组实际上是二次方程组:

在将项从每个等式的右侧移动到左侧后,它变成:

展开每个方程中的所有平方差并重新排序项:

为了简化这个系统,从第一个方程中减去第二个方程,然后从第二个方程中减去第三个方程,并保留其中一个二次方程,假设保留第一个二次方程:

找到这个系统的解决方案的想法如下:

为了简化符号和表达式,我们可以使用一些线性代数中的符号。定义以下2乘2矩阵和2乘1列向量:

当我们将后一个矩阵方程乘以M的逆矩阵时:

让我们也用矩阵表示法来写

最后,在用适当的比例因子缩放之后,寻找三个圆的交点的算法可以表示如下:

注意到,对于z,二次方程有两个解。我选择的减号是第一个交点,只要三个圆在每个圆的外部,并且初始半径不相交。还有第二个交点,它对应于z的加号解决方案。如果您有来自第四个塔的信息,那么您将能够选择正确的点,甚至可能能够完全线性化问题。但是,仅使用这些可用的数据,您就有两种解决方案。

我用下面的hand示例测试了算法:

代码语言:javascript
复制
x1 = 0;  y1 = 0;  r1 = sqrt(13)/3;
x2 = 5;  y2 = 1;  r2 = sqrt(13)/3;
x3 = 3;  y3 = 7;  r3 = sqrt(17)/3;

它会输出正确的位置

代码语言:javascript
复制
x = 2;  y = 3;  

和比例因子k = 3

我用Matlab/Octave实现了它,因为我对那里的线性代数很熟悉:

代码语言:javascript
复制
function [xy, k] = location_scaled(x1, y1, r1, x2, y2, r2, x3, y3, r3)

        M = 2*[x2 - x1  y2 - y1; 
               x3 - x2  y3 - y2];
        A = [r1^2 - r2^2; 
             r2^2 - r3^2];
        B = [x2^2 + y2^2 - x1^2 - y1^2; 
             x3^2 + y3^2 - x2^2 - y2^2];
        A = M\A;
        B = M\B;

        a = A'*A;
        b = 2*B'*A - 2*[x1  y1]*A - r1^2;
        c = [x1 y1]*[x1; y1] - 2*[x1  y1]*B + B'*B;

        k = (- b - sqrt(b^2 - 4*a*c)) / (2*a);

        xy = k*A + B;
        k = sqrt(k);

end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56273884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档