def intersetion(self, other) -> Union[(Point, None)]:
    if isinstance(other, Circle):
        c1 = self.center
        c2 = other.center
        m = Geometry.slope(c1, c2)
        theta = cmath.atan(m)
        d = Geometry.distance(c1, c2)
        if (d == (self.radius + other.radius)):
            'Two circles are touching each other'
            x = (c1.x + (self.radius * cmath.cos(theta)))
            y = (c1.y + (self.radius * cmath.sin(theta)))
            return Point(x, y)
        elif (d < (self.radius + other.radius)):
            'Two circles intersect'
            r1 = self.radius
            r2 = other.radius
            theta = cmath.asin((r2 / d))
            x = (c1.x + (r1 * cmath.cos(theta)))
            y = (c1.y + (r1 * cmath.sin(theta)))
            p1 = Point(x, y)
            l = Line.construct(c1, c2)
            p2 = l.image(p1)
            return (p1, p2)
        else:
            return None
    else:
        raise ValueError('Can only intersect with another circle')
def intersetion(self, other) -> Union[(Point, None)]:
    if isinstance(other, Circle):
        c1 = self.center
        c2 = other.center
        m = Geometry.slope(c1, c2)
        theta = cmath.atan(m)
        d = Geometry.distance(c1, c2)
        if (d == (self.radius + other.radius)):
            'Two circles are touching each other'
            x = (c1.x + (self.radius * cmath.cos(theta)))
            y = (c1.y + (self.radius * cmath.sin(theta)))
            return Point(x, y)
        elif (d < (self.radius + other.radius)):
            'Two circles intersect'
            r1 = self.radius
            r2 = other.radius
            theta = cmath.asin((r2 / d))
            x = (c1.x + (r1 * cmath.cos(theta)))
            y = (c1.y + (r1 * cmath.sin(theta)))
            p1 = Point(x, y)
            l = Line.construct(c1, c2)
            p2 = l.image(p1)
            return (p1, p2)
        else:
            return None
    else:
        raise ValueError('Can only intersect with another circle')