diff --git a/DIRECTORY.md b/DIRECTORY.md index f0a34a553..c8b9a9d3b 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -457,6 +457,7 @@ ## Geometry * [Geometry](geometry/geometry.py) + * [Shoelace](geometry/shoelace.py) ## Graphics * [Bezier Curve](graphics/bezier_curve.py) diff --git a/geometry/shoelace.py b/geometry/shoelace.py new file mode 100644 index 000000000..a00f116b4 --- /dev/null +++ b/geometry/shoelace.py @@ -0,0 +1,30 @@ +def area_of_polygon(xs: list[float], ys: list[float]) -> float: + """ + Compute the area of a polygon. The polygon has to be planar and simple + (not self-intersecting). The vertices have to be ordered in the + counter-clockwise direction. + https://en.wikipedia.org/wiki/Shoelace_formula + + Args: + xs: list of x coordinates of the polygon vertices in counter-clockwise order + ys: list of y coordinates of the polygon vertices in counter-clockwise order + Returns: + area of the polygon + + >>> from math import isclose + >>> xs = [1, 3, 7, 4, 8] + >>> ys = [6, 1, 2, 4, 5] + >>> isclose(area_of_polygon(xs, ys), 16.5) + True + """ + + return 0.5 * sum( + (ys[i] + ys[(i + 1) % len(ys)]) * (xs[i] - xs[(i + 1) % len(xs)]) + for i in range(len(xs)) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod()