我一直在阅读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是我对维基页面中以下数学公式的解释:
我的X和Y公式如下:
当我挂起所有这些时,我得到以下调试日志:
P1: 0
P2: 0.0989904
P3: 0.4478847
X is: -0.0097991Y is: 0.247284 // X and Y of cube
然而,当我运行我的代码时,立方体不会进入交叉点,它只是移动到球体1的中心。当我移动球体1和球体2时,我的立方体确实移动了,但是经常在完全不同的轴上。当我移动球体3时,它似乎对程序没有任何影响。
我是否正确设置了三角测量?我错过了什么吗?
答案 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;