Area of intersection between circle and rectangle

后端 未结 7 845
陌清茗
陌清茗 2020-12-13 19:35

I\'m looking for a fast way to determine the area of intersection between a rectangle and a circle (I need to do millions of these calculations).

A specific property

7条回答
  •  盖世英雄少女心
    2020-12-13 20:07

    I hope its not bad form to post an answer to such an old question. I looked over the above solutions and worked out an algorithm which is similar to Daniels first answer, but a good bit tighter.

    In short, assume the full area is in the rectangle, subtract off the four segments in the external half planes, then add any the areas in the four external quadrants, discarding trivial cases along the way.

    pseudocde (my actual code is only ~12 lines..)

    find the signed (negative out) normalized distance from the circle center
    to each of the infinitely extended rectangle edge lines,
    ie.
    d_1=(xcenter-xleft)/r
    d_2=(ycenter-ybottom)/r
    etc
    
    for convenience order 1,2,3,4 around the edge. If the rectangle is not
    aligned with the cartesian coordinates this step is more complicated but
    the remainder of the algorithm is the same
    
    If ANY d_i <=- 1 return 0
    
    if ALL d_i >=  1 return Pi r^2
    
    this leave only one remaining fully outside case: circle center in
    an external quadrant, and distance to corner greater than circle radius:
    
    for each adjacent i,j (ie. i,j=1,2;2,3;3,4;4,1)
         if d_i<=0 and d_j <= 0 and d_i^2+d_j^2 > 1 return 0
    
    now begin with full circle area  and subtract any areas in the
    four external half planes
    
    Area= Pi r^2
    for each  d_i>-1
         a_i=arcsin( d_i )  #save a_i for next step
         Area -= r^2/2 (Pi - 2 a_i - sin(2 a_i)) 
    
    At this point note we have double counted areas in the four external
    quadrants, so add back in:
    
    for each adjacent i,j
       if  d_i < 1 and   d_j < 1  and d_i^2+d_j^2 < 1
           Area += r^2/4 (Pi- 2 a_i - 2 a_j -sin(2 a_i) -sin(2 a_j) + 4 sin(a_i) sin(a_j))
    
    return Area
    

    Incidentally, that last formula for the area of a circle contained in a plane quadrant is readily derived as the sum of a circular segment, two right triangles and a rectangle.

    Enjoy.

提交回复
热议问题