2D Trilateration问题

时间:2014-03-28 16:46:06

标签: c# algorithm trilateration

我一直在阅读Trilateration via its page on Wikipedia,我试图制作自己的2D版本。但是,我遇到了一些问题,我希望有更好掌握数学的人可以帮助我。

我在Unity中使用C#。

我的场景由屏幕中央的3个球体组成。球体1始终位于标记0,0,0。在这些球体旁边,我有一个立方体,我想要移动到3个球体的交叉点。

到目前为止,这是我的代码:

public GameObject sphere1, sphere2, sphere3;
float x, y;
float P1, P2, P3;
public GameObject cube;

// Update is called once per frame
void Update () 
{
    P1 = ( sphere1.transform.position.x * sphere1.transform.position.x) + ( sphere1.transform.position.y * sphere1.transform.position.y);

    P2 = ((sphere1.transform.position.x - sphere2.transform.position.x) *(sphere1.transform.position.x - sphere2.transform.position.x)) + sphere1.transform.position.y;

    P3 = ((sphere1.transform.position.x - sphere3.transform.position.x) *(sphere1.transform.position.x - sphere3.transform.position.x)) + 
        ((sphere1.transform.position.y - sphere3.transform.position.y) *(sphere1.transform.position.y - sphere3.transform.position.y));

    x = (P1 * P1) - (P2 * P2);
    y = ((P1 * P1) - (P3 * P3)) + (sphere3.transform.position.x * sphere3.transform.position.x) + ((sphere3.transform.position.y * sphere3.transform.position.y) / 2 * sphere3.transform.position.y);

    cube.transform.position = new Vector3(x, y, 0);

}

P1,P2和P3是我对维基页面中以下数学公式的解释:

enter image description here

enter image description here

enter image description here

我的X和Y公式如下:

enter image description here

enter image description here

当我挂起所有这些时,我得到以下调试日志:

P1: 0
P2: 0.0989904
P3: 0.4478847
X is: -0.0097991Y is: 0.247284 // X and Y of cube

然而,当我运行我的代码时,立方体不会进入交叉点,它只是移动到球体1的中心。当我移动球体1和球体2时,我的立方体确实移动了,但是经常在完全不同的轴上。当我移动球体3时,它似乎对程序没有任何影响。

我是否正确设置了三角测量?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

你不明白维基的公式。第一组方程用于导出你在这里显示的第二组方程从中,而不是导出r1,r2和r3的值然后将它们放入第二组方程式,就像你一样。

你正在以错误的方式计算r1,r2和r3。 根据你的代码,r1总是等于0,它应该等于球体1的半径,而不是它的坐标的平方和。 r2 - 球体2的半径和球体3的r3--半径也是如此。

此外,根据Wiki,sphere1的中心始终为(0,0,0),sphere2的中心位于x轴的某处 - 坐标为(d,0,0),其中d为某个值。所以,你的代码应该看起来像这样:

public GameObject sphere1, sphere2, sphere3;
float x, y;
float r1, r2, r3;
public GameObject cube;

void Update () 
{
    r1 = sphere1.transform.localscale.x * sphere1.GetComponent<SphereCollider>().radius;

    r2 = sphere2.transform.localscale.x * sphere2.GetComponent<SphereCollider>().radius;

    r3 = sphere3.transform.localscale.x * sphere3.GetComponent<SphereCollider>().radius;

    x = (r1 * r1 - r2 * r2 + sphere2.transform.position.x * sphere2.transform.position.x)/(2*sphere2.transform.position.x);
    y = ((r1 * r1 - r3 * r3 + sphere3.transform.position.x * sphere3.transform.position.x + sphere3.transform.position.y * sphere3.transform.position.y) /( 2 * sphere3.transform.position.y)) - (x * sphere3.transform.position.x)/sphere3.transform.position.y;

    cube.transform.position = new Vector3(x, y, 0);

}

答案 1 :(得分:1)

作为最后的步骤,您应该通过将 ex * x ey * y 添加到您的点 p1 来计算结果坐标。< / p>

result = p1 + e*ex + y*ey;