两个圆圈之间的交叉区域

Chr*_*ord 13 math geometry

给出两个圆圈:

  • C1 at(x1,y1)withradius1
  • C2在(x2,y2)有radius2

你如何计算他们的交叉区域?当然,所有标准数学函数(sin,cos等)都可用.

Chr*_*ord 27

好吧,使用Wolfram链接和Misnomer的提示来查看等式14,我使用我列出的变量和中心之间的距离(可以简单地从它们派生)推导出以下Java解决方案:

Double r = radius1;
Double R = radius2;
Double d = distance;
if(R < r){
    // swap
    r = radius2;
    R = radius1;
}
Double part1 = r*r*Math.acos((d*d + r*r - R*R)/(2*d*r));
Double part2 = R*R*Math.acos((d*d + R*R - r*r)/(2*d*R));
Double part3 = 0.5*Math.sqrt((-d+r+R)*(d+r-R)*(d-r+R)*(d+r+R));

Double intersectionArea = part1 + part2 - part3;
Run Code Online (Sandbox Code Playgroud)

  • 此外,可能值得在错误条件和它们的含义周围添加解释性注释(和代码).例如,If(表达式在sqrt中)<0或负数,或-1 <(acos中的表达式)> 1 (2认同)

Sco*_*ley 22

这是一个完全符合Chris之后的JavaScript函数:

function areaOfIntersection(x0, y0, r0, x1, y1, r1)
{
  var rr0 = r0 * r0;
  var rr1 = r1 * r1;
  var d = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
  var phi = (Math.acos((rr0 + (d * d) - rr1) / (2 * r0 * d))) * 2;
  var theta = (Math.acos((rr1 + (d * d) - rr0) / (2 * r1 * d))) * 2;
  var area1 = 0.5 * theta * rr1 - 0.5 * rr1 * Math.sin(theta);
  var area2 = 0.5 * phi * rr0 - 0.5 * rr0 * Math.sin(phi);
  return area1 + area2;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果一个圆圈完全位于另一个圆圈内,或者它们根本不接触,则此方法将返回NaN.在这些条件下不会失败的略有不同的版本如下:

function areaOfIntersection(x0, y0, r0, x1, y1, r1)
{
  var rr0 = r0 * r0;
  var rr1 = r1 * r1;
  var d = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));

  // Circles do not overlap
  if (d > r1 + r0)
  {
    return 0;
  }

  // Circle1 is completely inside circle0
  else if (d <= Math.abs(r0 - r1) && r0 >= r1)
  {
    // Return area of circle1
    return Math.PI * rr1;
  }

  // Circle0 is completely inside circle1
  else if (d <= Math.abs(r0 - r1) && r0 < r1)
  {
    // Return area of circle0
    return Math.PI * rr0;
  }

  // Circles partially overlap
  else
  {
    var phi = (Math.acos((rr0 + (d * d) - rr1) / (2 * r0 * d))) * 2;
    var theta = (Math.acos((rr1 + (d * d) - rr0) / (2 * r1 * d))) * 2;
    var area1 = 0.5 * theta * rr1 - 0.5 * rr1 * Math.sin(theta);
    var area2 = 0.5 * phi * rr0 - 0.5 * rr0 * Math.sin(phi);

    // Return area of intersection
    return area1 + area2;
  }
}
Run Code Online (Sandbox Code Playgroud)

我通过阅读数学论坛上的信息来编写这个函数.我发现这比Wolfram MathWorld解释更清晰.


Vis*_*hal 11

您可能想要查看此分析解决方案并将公式与您的输入值一起应用.

这里给出另一个公式-

Area = r^2*(q - sin(q))  where q = 2*acos(c/2r),
where c = distance between centers and r is the common radius.
Run Code Online (Sandbox Code Playgroud)