В python как получить точку пересечения трех или более кругов с ошибкой или без нее - PullRequest
2 голосов
/ 06 марта 2020

Учитывая три круга как

(x - x1)**2 + (y - y1)**2 = r1**2
(x - x2)**2 + (y - y2)**2 = r2**2
(x - x3)**2 + (y - y3)**2 = r3**2

Как найти в python (x, y) точку пересечения трех кругов? Точнее, как это может быть устойчивым, даже если три круга не пересекаются точно в одной точке, но ни в одной?

Я пытался использовать наименьшее количество квадратов из scipy , но Я не уверен, что он работает должным образом, поскольку даже когда круги фактически пересекаются в одной точке, это дает другой результат.

def intersectionPoint(p1,p2,p3):

    x1, y1, dist_1 = (p1[0], p1[1], p1[2])
    x2, y2, dist_2 = (p2[0], p2[1], p2[2])
    x3, y3, dist_3 = (p3[0], p3[1], p3[2])

    def eq(g):
        x, y, r = g

        return (
            (x - x1)**2 + (y - y1)**2 - (dist_1 - r )**2,
            (x - x2)**2 + (y - y2)**2 - (dist_2 - r )**2,
            (x - x3)**2 + (y - y3)**2 - (dist_3 - r )**2)

    guess = (100, 100, 0)

    ans = scipy.optimize.least_squares(eq, guess)

    return ans
ans = intersectionPoint((0,0,9962),(7228,0,9784),(4463,3109,6251))

1 Ответ

1 голос
/ 06 марта 2020

Хотя использование least_squares для решения этой проблемы возможно, есть несколько вещей, которые необходимо изменить в коде.

  • Функция eq должна принимать только точку ( x, y) в качестве параметра, поскольку вы ищете точку пересечения.

  • Возвращаемое значение должно быть (x - x1)**2 + (y - y1)**2 - dist_1**2 для каждого круга (это квадрат расстояния до круга) .

  • Вызов least_squares должен быть выполнен с некоторыми дополнительными параметрами, чтобы избежать ложных срабатываний, а именно ftol=None, xtol=None. Пожалуйста, обратитесь к документам , чтобы понять роль этих параметров. Они избегают прерывания путем изменения функции стоимости и изменения независимых переменных.

  • Я бы изменил предположение на точку на первом круге, чтобы алгоритм начинался с соответствующий регион, guess = (x1, y1 + dist_1)

Конечно, не забудьте проверить атрибут success, чтобы проверить, сходится ли алгоритм!

Код становится:

from scipy.optimize import least_squares

def intersectionPoint(p1,p2,p3):

    x1, y1, dist_1 = (p1[0], p1[1], p1[2])
    x2, y2, dist_2 = (p2[0], p2[1], p2[2])
    x3, y3, dist_3 = (p3[0], p3[1], p3[2])

    def eq(g):
        x, y = g

        return (
            (x - x1)**2 + (y - y1)**2 - dist_1**2,
            (x - x2)**2 + (y - y2)**2 - dist_2**2,
            (x - x3)**2 + (y - y3)**2 - dist_3**2)

    guess = (x1, y1 + dist_1)

    ans = least_squares(eq, guess, ftol=None, xtol=None)

    return ans

ans = intersectionPoint((0,0,1),(2,0,1),(1,-1,1))
...