Первое, что нужно понять, как структурированное, это не может не нарушать инкапсуляцию. Каждая функция пересечения должна знать внутреннюю работу двух разных объектов.
Второе, что нужно понять, это то, что это проблема n ^ 2, или, точнее, n * (n + 1) / 2. Каждый раз, когда вы добавляете новую фигуру, вы должны добавить функцию пересечения для каждой из предыдущих n фигур. Очевидно, это не масштабируется, поэтому вы обратились за помощью.
В реальном мире способ решения этой проблемы состоит в том, чтобы придумать меньшее количество классов, которые могут выступать в качестве надмножества некоторых фигур. Например, ваша Точка, Линия, Прямоугольник и Треугольник могут быть выражены как набор отрезков линии; Ваш Круг может быть Дугой, которая покрывает 360 градусов. Если точность не требуется, вы можете аппроксимировать каждую отдельную фигуру в виде набора кривых Безье и иметь единственный метод Intersect, который знает коллекцию.