如何定义三个圆的交集?

时间:2011-04-22 22:13:19

标签: javascript formula

鉴于三个圆的中心点和半径,你如何定义交叉区域?

到目前为止我所拥有的是:

var point1 = {x: -3, y: 0};
var point2 = {x: 3, y: 0};
var point3 = {x: 0, y: -3};

var r1 = 5;
var r2 = 5;
var r3 = 5;

var area = returnIntersectionArea(point1, point2, point3, r1, r2, r3);

此外,如果两个碰撞但不碰撞第三个,则该函数应返回null。 如果没有碰撞,则应返回null。

2 个答案:

答案 0 :(得分:3)

This article描述了如何找到两个圆圈之间的交点区域。结果很容易扩展到三个圈子。

------------- ------------- EDIT 好吧,问题不容易扩展到三个圈子,我在这个问题上找到了博士论文。假设三个圆相交如下所示,可以找到近似解(我认为)。在我们尝试之前,我们必须检查三个圆圈是否确实相交,如下所示。如果说一个圆在另一个圆内,第三个圆与它们相交,问题就会发生很大变化。

three circles

设p,S2和S3表示三个圆的面积,X1,X2和X3表示每对圆之间的交点面积(指数在顺时针方向上增加)。正如我们已经建立的那样,有确切的公式。考虑以下线性方程组:

A + D + F + G = A + D + X1 = S1

B + D + E + G = B + D + X3 = S2

B + E + D + G = B + E + X2 = S3

这是不确定的,但可以使用最小二乘法找到近似解。我没有在数字上尝试过,但我会尽快回复你:D 如果最小二乘解决方案看似错误,我们也应该施加一些限制,例如:如果任何一对圆之间的交点小于圆的面积,则该区域。 评论很感激。

西蒙的PS +1指出我不应该把事情看作是轻松的

答案 1 :(得分:1)

解决此问题的一种方法是通过Monte Carlo模拟:

function returnIntersectionArea(point1, point2, point3, r1, r2, r3) {

  // determine bounding rectangle
  var left   = Math.min(point1.x - r1, point2.x - r2, point3.x - r3);
  var right  = Math.max(point1.x + r1, point2.x + r2, point3.x + r3);
  var top    = Math.min(point1.y - r1, point2.y - r2, point3.y - r3);
  var bottom = Math.max(point1.y + r1, point2.y + r2, point3.y + r3);

  // area of bounding rectangle
  var rectArea = (right - left) * (bottom - top);

  var iterations = 10000;
  var pts = 0;
  for (int i=0; i<iterations; i++) {

    // random point coordinates
    var x = left + Math.rand() * (right - left);
    var y = top  + Math.rand() * (bottom - top);

        // check if it is inside all the three circles (the intersecting area)
    if (Math.sqrt(Math.pow(x - point1.x, 2) + Math.pow(y - point1.y, 2)) <= r1 &&
        Math.sqrt(Math.pow(x - point2.x, 2) + Math.pow(y - point2.y, 2)) <= r2 &&
        Math.sqrt(Math.pow(x - point3.x, 2) + Math.pow(y - point3.y, 2)) <= r3)
      pts++;
  }

  // the ratio of points inside the intersecting area will converge to the ratio
  // of the area of the bounding rectangle and the intersection
  return pts / iterations * rectArea;
}

通过增加迭代次数,可以将解决方案提高到任意精度(在浮点范围内),但解决方案的速度可能会变慢。显然,选择紧密的边界框对于实现良好的收敛非常重要。

相关问题