Area of Intersection between Two Circles

2020-02-02 07:45发布

Given two circles:

  • C1 at (x1, y1) with radius1
  • C2 at (x2, y2) with radius2

How do you calculate the area of their intersection? All standard math functions (sin, cos, etc.) are available, of course.

标签: math geometry
4条回答
爷、活的狠高调
2楼-- · 2020-02-02 08:19

You might want to check out this analytical solution and apply the formula with your input values.

Another Formula given here -

Area = r^2*(q - sin(q))  where q = 2*acos(c/2r),
where c = distance between centers and r is the common radius.
查看更多
爷的心禁止访问
3楼-- · 2020-02-02 08:28

Okay, using the Wolfram link and Misnomer's cue to look at equation 14, I have derived the following Java solution using the variables I listed and the distance between the centers (which can trivially be derived from them):

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;
查看更多
仙女界的扛把子
4楼-- · 2020-02-02 08:37

Here is a JavaScript function that does exactly what Chris was after:

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;
}

However, this method will return NaN if one circle is completely inside the other, or they are not touching at all. A slightly different version that doesn't fail in these conditions is as follows:

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;
  }
}

I wrote this function by reading the information found at the Math Forum. I found this clearer than the Wolfram MathWorld explanation.

查看更多
三岁会撩人
5楼-- · 2020-02-02 08:39

Here here i was making character generation tool, based on circle intersections... you may find it useful.

with dynamically provided circles:

    C: {
        C1: {id: 'C1',x:105,y:357,r:100,color:'red'},
        C2: {id: 'C2',x:137,y:281,r:50, color:'lime'},
        C3: {id: 'C3',x:212,y:270,r:75, color:'#00BCD4'}
    },

Check FULL fiddle... FIDDLE

查看更多
登录 后发表回答