summaryrefslogtreecommitdiff
path: root/circrect.py
diff options
context:
space:
mode:
Diffstat (limited to 'circrect.py')
-rw-r--r--circrect.py40
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
+ )
+