diff options
Diffstat (limited to 'circrect.py')
-rw-r--r-- | circrect.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/circrect.py b/circrect.py new file mode 100644 index 0000000..e85ed77 --- /dev/null +++ b/circrect.py @@ -0,0 +1,40 @@ +from numbers import Number + +def clamp(low: Number, high: Number, num: Number) -> Number: + """Limit range of ``num`` between ``low`` and ``high``""" + return max(low, min(high, num)) + +def circrect(a: Number, b: tuple[Number, Number], c: tuple[Number, Number]) -> Number: + """ + Calculate the area of the overlap between a circle with radius ``a`` and a + rectangle defined by opposing corner points ``b`` and ``c``. + + Args: + a: circle radius + b: first corner coordinate of rectangle + c: second corner coordinate of rectangle (opposite of b) + + Returns: + Overlap area (square units) + """ + + # normalize input variables + a = abs(a) + b, c = ( + (min(b[0], c[0]), min(b[1], c[1])), + (max(b[0], c[0]), max(b[1], c[1])), + ) + b = (clamp(-a, a, b[0]), clamp(-a, a, b[1])) + c = (clamp(-a, a, c[0]), clamp(-a, a, c[1])) + + return 0 + +if __name__ == "__main__": + print( + circrect(1, (-1, -1), (1, 1)), # pi + circrect(1, (1, 1), (-1, -1)), # pi + circrect(-1, (-1, -1), (1, 1)), # pi + circrect(2, (10, 10), (11, 11)), # 0 + circrect(10, (0, 0), (1, 1)), # 1 + ) + |