diff --git a/DIRECTORY.md b/DIRECTORY.md
index f0a34a553946..c8b9a9d3b465 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 000000000000..daefbce36848
--- /dev/null
+++ b/geometry/shoelace.py
@@ -0,0 +1,33 @@
+from typing import List
+
+
+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
+        ys: list of y coordinates of the polygon vertices
+    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()