Javascript 中的 3D 三边测量
3D Trilateration in 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 处产生一个解,但函数却告诉我没有解。我对三边测量有什么误解还是函数有错误?
如有任何帮助,我们将不胜感激。
您找到的存储库似乎有问题。
特别是如果您查看此行 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 个非常接近正确答案的值。
真的,你的测试应该是一个特例;前两个球体的交点是一个点。如果这是预期的用例,您可能会考虑分叉回购并测试 刚好 接触球体。
是的,它实际上是库中的一个错误,感谢@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);
我正在尝试使用 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 处产生一个解,但函数却告诉我没有解。我对三边测量有什么误解还是函数有错误?
如有任何帮助,我们将不胜感激。
您找到的存储库似乎有问题。
特别是如果您查看此行 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 个非常接近正确答案的值。
真的,你的测试应该是一个特例;前两个球体的交点是一个点。如果这是预期的用例,您可能会考虑分叉回购并测试 刚好 接触球体。
是的,它实际上是库中的一个错误,感谢@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);