Рассчитать круг с учетом 3 баллов (объяснение кода) - PullRequest
0 голосов
/ 25 октября 2018

При поиске кода для вычисления круга из 3-х точек он приводит меня к следующему коду:

def circleRadius(b, c, d):
  temp = c[0]**2 + c[1]**2
  bc = (b[0]**2 + b[1]**2 - temp) / 2
  cd = (temp - d[0]**2 - d[1]**2) / 2
  det = (b[0] - c[0]) * (c[1] - d[1]) - (c[0] - d[0]) * (b[1] - c[1])

  if abs(det) < 1.0e-10:
    return None

  # Center of circle
  cx = (bc*(c[1] - d[1]) - cd*(b[1] - c[1])) / det
  cy = ((b[0] - c[0]) * cd - (c[0] - d[0]) * bc) / det

  radius = ((cx - b[0])**2 + (cy - b[1])**2)**.5

  return radius

На основе Stackoverflow и Dr.Math ,Код работает отлично, но я не понимаю, как код соответствует объяснению, приведенному на Dr.Math .

Может кто-нибудь помочь мне понять, почему код работает и какие шагиреализованы в переменных?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Не совсем ответ, я показываю здесь альтернативный метод.

Пусть p, q, r будут тремя точками.Мы переводим их так, чтобы p дошло до источника.В векторе, q-= p, r-= p.

Теперь уравнение точки по началу координат равно

2.xc.x + 2.yc.y = x² + y²

, где xc, yc - координаты центра.

Подставляя координаты p, q, мы получаем систему 2x2

xc.xp + yc.yp = xp² + yp²
xc.xq + yc.yq = xq² + yq²

Код, который реализует это, приведен ниже

# Translate to the origin
xq-= xp
yq-= yp
q2= xp * xp + yp * yp
xr-= xq
yr-= yq
r2= xr * xr + yr * yr

# Solve for the center coordinates
d= 2 * (xp * yq - xq * yp)
xc= (p2 * yq - q2 * yp) / d
yc= (p2 * xp - q2 * xq) / d

# Radius
r= math.sqrt(xc * xc + yc * yc)

# Untranslate
xc+= xp
yc+= yp
0 голосов
/ 25 октября 2018

Код, который вы видите, представляет собой «упрощенную» и лаконичную формулу процедуры, описанной на странице доктора Математики.

Давайте рассмотрим ее поэтапно.

  1. Для простоты и соблюдения математических обозначений пусть points будут точки на треугольнике.[b - это точка 1, c - это точка 2, а d - это точка 3]

  2. Для такого треугольника площадь определяется как:

    area

    Эта переменная det в функции равна 2 * площади треугольника.

    if abs(det) < 1.0e-10: проверяет коллинеарность.Если область близка к нулю, указанные точки коллинеарны, т. Е. Являются точками на одной линии.

  3. Найдите наклоны линий L1, L2, проходящих через точки b, c &c, d

    slope

  4. Найти уравнения для линий L3 , L4 , которые представляют собой перпендикулярные биссектрисылинии s L1 и L2 соответственно.bisectors1 bisectors2

  5. Найдите пересечение линий L3 и L4 , которые являются ничем иным, как центром круга.

    intersection

Сделайте все замены, и вы увидите, что все это собралось вместе.

Вычислить радиус круга, найдя евклидово расстояние между центром и одной из трех точек.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...