Javascript 中的 3D 三边测量

3D Trilateration in Javascript

我正在尝试使用 https://github.com/gheja/trilateration.js 在 Javascript 中进行 3D 三边测量,它似乎可以正常工作。然而,某些简单的情况应该产生解决方案,但它们没有。例如:

var p1 = {x:69, y:0,  r:69, z:0}
var p2 = {x:0,  y:50, r:50, z:0};
var p3 = {x:0,  y:80, r:80, z:0};
trilaterate(p1, p2, p3, false)

这似乎是一个简单得可笑的例子,应该在 x:0,y:0 处产生一个解,但函数却告诉我没有解。我对三边测量有什么误解还是函数有错误?

如有任何帮助,我们将不胜感激。

您找到的存储库似乎有问题。

特别是如果您查看此行 https://github.com/gheja/trilateration.js/blob/master/trilateration.js#L111 并注销它用于计算的值 z = Math.sqrt(sqr(p1.r) - sqr(x) - sqr(y));:

sqr(p1.r): 4761
-sqr(x) - sqr(y): -4761.000000000017
sqr(p1.r) - sqr(x) - sqr(y): -0.000000000017
z: Math.sqrt(-0.000000000017)
therefore: z: NaN

这只是花车的一个特性 (Is floating point math broken?)。如果您更改参数的顺序 (trilaterate(p1, p3, p2, false)),您会得到 2 个非常接近正确答案的值。

真的,你的测试应该是一个特例;前两个球体的交点是一个点。如果这是预期的用例,您可能会考虑分叉回购并测试 刚好 接触球体。

是的,它实际上是库中的一个错误,感谢@logidelic 找到它并感谢@dtudury 跟踪它。

I have fixed it now 如果值接近于零,则将其归零:

b = sqr(p1.r) - sqr(x) - sqr(y);

if (Math.abs(b) < 0.0000000001)
{
    b = 0;
}

z = Math.sqrt(b);