2015-12-03 39 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個非常接近正確答案的值。

真的,你的測試應該是一個特例;你的前兩個球體的交點是一個點。如果這是一個預期用例,您可以考慮分割回購和測試只需觸摸範圍