4

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 で解が得られるはずのばかばかしいほど単純な例のように思えますが、関数は解がないことを示しています。三辺測量について何か誤解しているのでしょうか、それとも関数にエラーがありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

4

はい、実際にはライブラリのバグでした。見つけてくれた@logidelicと追跡してくれた@dtuduryに感謝します。

ゼロに近い場合は値をゼロにすることで修正しました。

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

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

z = Math.sqrt(b);
于 2016-07-28T09:51:45.657 に答える
4

見つけたリポジトリに問題があるようです。

具体的には、この行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 つの値が得られます。

本当にあなたのテストは特別なケースでなければなりません。最初の 2 つの球体の交点は 1 点です。これが予想されるユースケースである場合は、レポをフォークして、球体にかろうじて接触するかどうかをテストすることを検討してください。

于 2015-12-07T17:59:02.940 に答える