@@ -9279,7 +9279,7 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
92799279
92809280! No overlap
92819281
9282- IF ((X2 < X0-RAD) .OR. (X1 > X0+RAD) .OR. (Y2 < Y0-RAD) .OR. (Y1 > Y0+RAD)) THEN
9282+ IF ((X2 <= X0-RAD) .OR. (X1 >= X0+RAD) .OR. (Y2 <= Y0-RAD) .OR. (Y1 >= Y0+RAD)) THEN
92839283 CIRCLE_CELL_INTERSECTION_AREA = 0._EB
92849284 RETURN
92859285ENDIF
@@ -9295,9 +9295,52 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
92959295IF (RC <= R2) FC=IBSET(FC,3)
92969296
92979297SELECT CASE(FC)
9298- ! Grid cell surrounds the circle: area of circle
9299- CASE (0)
9298+ ! No corners either full area or circle minus one or more chords
9299+ CASE (0)
9300+ ! First four cases are more than half the cirlce outside the rectangle.
9301+ ! Can only have one edge where this is the case without having a corner inside. This edge makes a chord.
9302+ ! Intersection area is the circle area minus the area of the chord.
9303+ IF (X2 <= X0 .AND. X2 > X0-RAD) THEN
9304+ THETA = 2._EB*ACOS((X0-X2)/RAD)
9305+ CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9306+ RETURN
9307+ ENDIF
9308+ IF (Y2 <= Y0 .AND. Y2 > Y0-RAD) THEN
9309+ THETA = 2._EB*ACOS((Y0-Y2)/RAD)
9310+ CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9311+ RETURN
9312+ ENDIF
9313+ IF (X1 >= X0 .AND. X1 < X0+RAD) THEN
9314+ THETA = 2._EB*ACOS((X1-X0)/RAD)
9315+ CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9316+ RETURN
9317+ ENDIF
9318+ IF (Y1 >= Y0 .AND. Y1 < Y0+RAD) THEN
9319+ THETA = 2._EB*ACOS((X1-X0)/RAD)
9320+ CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9321+ RETURN
9322+ ENDIF
9323+ ! Remaining cases is where one or more rectangle edges are inside but the corners are outside
9324+ ! With no corner inside each internal edge is a chord
9325+ ! Intersection area is the circe area minus the area of each chord
93009326 CIRCLE_CELL_INTERSECTION_AREA = PI*R2
9327+ IF (X1 > X0 - RAD) THEN
9328+ THETA = 2._EB*ACOS((X0-X1)/RAD)
9329+ CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9330+ ENDIF
9331+ IF (Y1 > Y0 - RAD) THEN
9332+ THETA = 2._EB*ACOS((Y0-Y1)/RAD)
9333+ CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9334+ ENDIF
9335+ IF (X2 < X0 + RAD) THEN
9336+ THETA = 2._EB*ACOS((X2-X0)/RAD)
9337+ CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9338+ ENDIF
9339+ IF (Y2 < Y0 + RAD) THEN
9340+ THETA = 2._EB*ACOS((Y2-Y0)/RAD)
9341+ CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9342+ ENDIF
9343+ RETURN
93019344 ! One corner in the circle: chord + area of triangle
93029345 CASE(1,2,4,8)
93039346 SELECT CASE(FC)
0 commit comments