当前位置: 首页 > 知识库问答 >
问题:

二维三边测量问题

朱令
2023-03-14

我一直在通过维基百科上的页面阅读三边测量,并试图制作一个我自己的二维版本。然而,我遇到了一些问题,我希望对数学有更好理解的人能帮我解决。

我是和C#一起做这件事的。

我的场景包括屏幕中央的3个球体。球体1总是在标记0,0,0。在这些球体旁边,我有一个立方体,我想移动到3个球体的交叉点。

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

html" target="_blank">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时,它似乎对程序没有任何影响。

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

共有2个答案

百里沛
2023-03-14

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

result = p1 + e*ex + y*ey;
濮阳繁
2023-03-14

你没有理解维基的公式。第一组方程是用来推导你在这里展示的第二组方程,而不是像你一样推导r1、r2和r3的值,然后把它们放入第二组方程。

您计算r1、r2和r3的方法错误。根据你的代码r1总是等于0,当它应该等于球体1的半径,而不是它坐标的平方和。这同样适用于r2-球体2的半径,以及r3-球体3的半径。

此外,根据维基百科,球体1的中心总是(0,0,0),球体2的中心位于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);

}
 类似资料:
  • 我试图实现三维点之间的三元组。我最终尝试使用这个库三元组。我使用了下面给出的例子,并尝试执行它。下面是代码 那么现在我应该期望什么类型的输出。我得到了一些奇怪的输出,我无法理解它本身。 所以,请让我知道,如果我做错了什么,或者它是真实的数据,我应该解析,并用于其他一些计算。

  • 如我所知,三次分割是寻找三个球体交汇区域中心的过程。我在c中写了三边测量法,我取了方程式,它是维基百科中三边测量中心和二维三边测量的细节 举一个如下的例子: 例1:p1(5,10),p2(15,10),p3(10,20),r1=9,r2=7,r3=8,答案是(11.6,13.8),这是逻辑答案。 但当像下面的例子一样的情况下,答案就像一个垃圾数字,我从计算中确定,但在这种情况下,我不知道原因! E

  • 我试图用Javascript使用https://github.com/gheja/trilateration.js而且它似乎在起作用。然而,某些简单的情况应该产生解决方案,但事实并非如此。例如: 这似乎是一个简单得可笑的例子,应该在x:0,y:0产生一个解,但是函数告诉我没有解。我是否对三边测量有误解,或者函数中是否存在错误? 任何帮助都将不胜感激。

  • 我正在使用wifi三边测量技术开发室内导航应用程序, 我有3个接入点我得到了lat 我需要转换每个lat 加上如果我得到x,y不可能转换成它的拉特 谢啦

  • 我目前正在研究一个程序,利用RSSI来确定基于信号强度的位置。有人知道三边化的工作java示例在哪里吗?我在网上找不到。 该程序基本上需要3个距离,这是从RSSI得出的距离,然后是三个点的经纬度,然后使用2维三边测量确定用户的位置(我现在忽略了每个信标的高度)。 我在这里看到了一个Python,但我对Python的了解还不足以理解它。

  • 该类表示的是一个三维向量(3D vector)。 一个三维向量表示的是一个有顺序的、三个为一组的数字组合(标记为x、y和z), 可被用来表示很多事物,例如: 一个位于三维空间中的点。 一个在三维空间中的方向与长度的定义。在three.js中,长度总是从(0, 0, 0)到(x, y, z)的 Euclidean distance(欧几里德距离,即直线距离), 方向也是从(0, 0, 0)到(x,