Source code for geometry
import math
[docs]class Point:
    def __init__(self, x, y):
        """
        Default constructor.
        """
        self.x = x
        self.y = y
[docs]    def distance(self, point):
        """
        Compute the Euclidean distance to another point.
        """
        return distance(self, point)  
[docs]class Rectangle:
    def __init__(self, center, width, height):
        """
        Default constructor.
        """
        self.center = center
        self.width = width
        self.height = height
        self.vertices = list()
        self.vertices.append(Point(center.x - (width / 2), center.y - (height / 2)))
        self.vertices.append(Point(self.vertices[0].x + width, self.vertices[0].y))
        self.vertices.append(Point(self.vertices[0].x, self.vertices[0].y + height))
        self.vertices.append(Point(self.vertices[0].x + width, self.vertices[0].y + height))
[docs]    def update(self, center, width, height):
        """
        Update the position of the rectangle.
        """
        self.center = center
        self.width = width
        self.height = height
        self.vertices[0].x = center.x - (width / 2)
        self.vertices[0].y = center.y - (height / 2)
        self.vertices[1].x = self.vertices[0].x + width
        self.vertices[1].y = self.vertices[0].y
        self.vertices[2].x = self.vertices[0].x
        self.vertices[2].y = self.vertices[0].y + height
        self.vertices[3].x = self.vertices[0].x + width
        self.vertices[3].y = self.vertices[0].y + height 
[docs]    def top_left(self):
        """
        Return the top left point of the rectangle.
        """
        return self.vertices[0] 
[docs]    def bottom_right(self):
        """
        Return the bottom right point of the rectangle.
        """
        return self.vertices[3] 
[docs]    def area(self):
        """
        Computes the area of the rectangle.
        """
        return self.width * self.height 
[docs]    def contains(self, point):
        """
        Check if the point is contained within the rectangle.
        """
        if ((point.x >= self.vertices[0].x) and (point.x <= self.vertices[3].x)) \
                
and ((point.y >= self.vertices[0].y) and (point.y <= self.vertices[3].y)):
            return True
        return False 
[docs]    def overlap(self, other):
        """
        Check if two rectangles overlap by any margin.
        """
        for vertex in self.vertices:
            if other.contains(vertex):
                return True
        for vertex in other.vertices:
            if self.contains(vertex):
                return True
        overlap_x = False
        if ((self.top_left().x <= other.top_left().x) and (other.bottom_right().x <= self.bottom_right().x)) or \
                
((other.top_left().x <= self.top_left().x) and (self.bottom_right().x <= other.bottom_right().x)):
            overlap_x = True
        overlap_y = False
        if ((self.top_left().y <= other.top_left().y) and (other.bottom_right().y <= self.bottom_right().y)) or \
                
((other.top_left().y <= self.top_left().y) and (self.bottom_right().y <= other.bottom_right().y)):
            overlap_y = True
        if overlap_x and overlap_y:
            return True
        return False 
[docs]    def overlap_area(self, other):
        """
        Measure the area of the overlap between two rectangles.
        """
        return overlap_area(self, other)  
[docs]def distance(point_one, point_two):
    """
    Compute the Euclidean distance between two points.
    """
    return math.sqrt(math.pow(point_one.x - point_two.x, 2) + math.pow(point_one.y - point_two.y, 2)) 
[docs]def overlap_area(rectangle_one, rectangle_two):
    """
    Compute the area of the overlap between two rectangles.
    """
    inside_vertices = 0
    for vertex in rectangle_two.vertices:
        if rectangle_one.contains(vertex):
            inside_vertices = inside_vertices + 1
    width = 0
    height = 0
    if inside_vertices == 0 and rectangle_one.overlap(rectangle_two):
        width = min([rectangle_one.bottom_right().x - rectangle_one.top_left().x,
                     rectangle_two.bottom_right().x - rectangle_two.top_left().x])
        height = min([rectangle_one.bottom_right().y - rectangle_one.top_left().y,
                     rectangle_two.bottom_right().y - rectangle_two.top_left().y])
    elif inside_vertices == 1:
        width = min([rectangle_two.bottom_right().x - rectangle_one.top_left().x,
                     rectangle_one.bottom_right().x - rectangle_two.top_left().x])
        height = min([rectangle_two.bottom_right().y - rectangle_one.top_left().y,
                      rectangle_one.bottom_right().y - rectangle_two.top_left().y])
    elif inside_vertices == 2:
        width = min(
            [rectangle_two.bottom_right().x - rectangle_two.top_left().x,
             rectangle_two.bottom_right().x - rectangle_one.top_left().x,
             rectangle_one.bottom_right().x - rectangle_two.top_left().x]
        )
        height = min(
            [rectangle_two.bottom_right().y - rectangle_two.top_left().y,
             rectangle_two.bottom_right().y - rectangle_one.top_left().y,
             rectangle_one.bottom_right().y - rectangle_two.top_left().y]
        )
    elif inside_vertices == 4:
        width = rectangle_two.width
        height = rectangle_two.height
    return width * height