1

我一直在通过 Wikipedia 上的页面阅读三边测量,并尝试制作自己的 2D 版本。但是,我遇到了一些问题,我希望能更好地掌握数学的人可以帮助我。

我正在使用 C# 在 Unity 中执行此操作。

我的场景由屏幕中心的 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 是我对 wiki 页面中以下数学公式的解释:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我的 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 时,它似乎对程序完全没有影响。

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

4

2 回答 2

2

你不明白wiki的公式。第一组方程用于导出您在此处显示的第二组方程而不是导出 r1、r2 和 r3 的值,然后像您一样将它们放入第二组方程。

您以错误的方式计算 r1、r2 和 r3。根据您的代码,当它应该等于球体 1 的半径时,r1 始终等于 0,而不是其坐标的平方和。r2 - 球体 2 的半径和 r3 - 球体 3 的半径也是如此。

此外,根据 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);

}
于 2015-02-24T14:34:49.283 回答
1

作为最后的步骤,您应该通过将向量ex*xey*y添加到您的点p1来计算结果坐标。

result = p1 + e*ex + y*ey;
于 2014-05-26T17:45:38.347 回答