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产生一个解决方案,但是这个函数告诉我没有解决方案。 我误解了一些关于三边测量的内容,或者在函数中有错误吗?

任何帮助,将不胜感激。


是的,这实际上是图书馆中的一个错误,感谢@logidelic找到它并@dtudury进行跟踪。

我现在通过调零值来修复它,如果它接近于零:

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

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

z = Math.sqrt(b);

它看起来像是你找到的回购问题。

特别是如果你看这行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

这只是浮点数的一个特性(浮点数学是否被破坏?)。 如果你改变参数的顺序( trilaterate(p1, p3, p2, false) ),你会得到2个非常接近正确答案的值。

真的,你的测试应该是一个特例。 你的前两个球体的交点是一个点。 如果这是一个预期的用例,您可以考虑分销回收和测试几乎不触及的领域。

链接地址: http://www.djcxy.com/p/85021.html

上一篇: 3D Trilateration in Javascript

下一篇: Trilateration Issue