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