【问题标题】:Finding the area where several circles intersect and the center point of the intersection找到几个圆相交的区域和相交的中心点
【发布时间】:2015-08-30 23:35:12
【问题描述】:

我在室内有 3 个信号接收器,A、B、C,用于检测客户是否站在上面显示的橙色高亮区域。

  • A:检测到距离 A 点 7 米,X、Y 坐标为 12,10
  • B:检测到距离 B POINT 5 米,X、Y 坐标为 5,6
  • C:检测到距离 C POINT 3 米,X、Y 坐标为 8,3

所以,现在我们只有 3 个圆,如果我们有更多的点,那么这个区域会更准确。

问题:如何找到上图中的高亮区域坐标,并找到该区域的中心点(图中的绿点)。其实我用的是VB.NET,应该用什么数学公式?

【问题讨论】:

  • 您正在寻找三边测量的算法。这些都有大量文档记录,您的搜索引擎会为您提供有用的资源。
  • @HighPerformanceMark 三边测量仅适用于 3 个圆圈?怎么样我有4圈?这个算法也可以用吗?
  • 你确定这是问题的正确表述吗?如果数据至多距离 A 7 米,至多距离 B 5 米且至多,则您需要标记区域的中心点i> 距离 C 3 米。如果测量的距离不是上限而是常规估计值,那么使用三边测量确实会更好。

标签: math gps geometry


【解决方案1】:

我经常发现要获得精确的几何精确答案可能会导致过多的努力。因此,我建议使用给定步长的网格(例如 10 厘米)对所有区域进行采样。对于每个坐标检查它是否在所有圆圈中,如果是,则将该位置列出。最后从列表中获得平均位置。

伪代码:

left = min(A.x-A.r, B.x-B.r, C.x-C.r);
top = min(A.y-A.r, B.y-B.r, C.y-C.r);
right = max(A.x+A.r, B.x+B.r, C.x+C.r);
bottom = max(A.y+A.r, B.y+B.r, C.y+C.r);

for (x=left; x<=right; x+=0.1)
    for (y=top; y<=bottom; y+=0.1)
        if (A.inCircle(x,y) && B.inCircle(x,y) && C.inCircle(x,y)) list.add([x,y]);      

return list.getAveragePos();

请注意,只有考虑最小圆的网格才能大大加快速度。

【讨论】:

  • 能解释一下什么是 A.r 吗?解释所有定义。谢谢!
  • A.x, A.y 是圆心坐标,A.r 是半径。 inCircle() 检查点是否在圆内(只需查看距中心的距离是否小于/等于其半径)还有另一种方法,可能处理的点数量较少。您只能检查位于圆形周边上的点,而不是处理整个区域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多