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

看起来这是您找到的存储库的问题。

特别是如果您查看此行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 个非常接近正确答案的值。

真的,您的测试应该是一个特例;你的前两个球体的交点是一个点。如果这是一个预期的用例,您可能会考虑分叉存储库并测试几乎不接触球体。

于 2015-12-07T17:59:02.940 回答
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 回答