2015-12-03 88 views
3

我正在尝试使用https://github.com/gheja/trilateration.js在3D中进行三边测量,它似乎在工作。但是,某些简单的案例应该是提供解决方案,但不是。例如:使用Javascript进行三维测量

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

任何帮助,将不胜感激。

+0

您是否尝试过用他们的例子:https://github.com/gheja/trilateration.js/blob/master/example.html ? – Ricardo

+0

我已经尝试过它,它的工作原理。正如我在这个问题中提到的,我已经尝试了一些例子(一些来自真实世界的数据)并且有些似乎有效。我只是想了解为什么我的问题中的简单示例不起作用。我猜想要么是我不了解三边测量,要么三边测量.js函数使用的算法有问题。 – logidelic

+0

看看这个问题从堆栈溢出:http://stackoverflow.com/questions/16176656/trilateration-and-locating-the-point-xyz – Ricardo

回答

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); 
+1

请在此处发布您的代码。 –

+0

感谢@TomWuyts,增加了源代码。 –

2

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

特别是如果你看一下这条线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个非常接近正确答案的值。

真的,你的测试应该是一个特例;你的前两个球体的交点是一个点。如果这是一个预期用例,您可以考虑分割回购和测试只需触摸范围