【问题标题】:3D Trilateration in JavascriptJavascript 中的 3D 三边测量
【发布时间】:2016-03-07 11:56:02
【问题描述】:

我正在尝试使用 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 处产生一个解,但函数却告诉我没有解。我对三边测量有误解还是函数有错误?

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过使用他们的示例:github.com/gheja/trilateration.js/blob/master/example.html
  • 我试过了,效果很好。正如我在问题中提到的那样,我尝试了一些示例(一些来自真实世界的数据)并且一些似乎有效。我只是想了解为什么我在问题中的简单示例不起作用。我想要么是我不了解三边测量,要么是 trilateration.js 函数使用的算法有问题。
  • 看看 Stack Overflow 上的这个问题:stackoverflow.com/questions/16176656/…
  • 还有这个 Octave 代码,您可以尝试将其作为测试/验证方法运行:github.com/lin4r/trilat

标签: javascript trilateration


【解决方案1】:

是的,它实际上是库中的一个错误,感谢 @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);

【讨论】:

    【解决方案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 个非常接近正确答案的值。

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

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2013-10-25
      相关资源
      最近更新 更多