Лучший способ найти точку на круге, ближайшем к данной точке

Учитывая точку (pX, pY) и круг с известным центром (cX, cY) и радиусом (r), каково кратчайшее количество кода, которое вы можете найти, чтобы найти точку на ближайшем к круге (pX, pY)?

У меня есть некоторый код работы, но он включает преобразование круга в уравнение вида (x – cX) ^ 2 + (y – cY) ^ 2 = r ^ 2 (где r – радиус) и используя уравнение линии от точки (pX, pY) до (cX, cY) для создания квадратичного уравнения, которое нужно решить.

Как только я сглажу ошибки, они будут делать, но это похоже на неэлегантное решение.

где P – точка, C – центр, а R – радиус на подходящем «математическом» языке:

V = (P - C); Answer = C + V / |V| * R; 

где | V | длина V.

ЛАДНО ЛАДНО

 double vX = pX - cX; double vY = pY - cY; double magV = sqrt(vX*vX + vY*vY); double aX = cX + vX / magV * R; double aY = cY + vY / magV * R; 

легко расширяется до> 2 размеров.

я бы сделал линию от центра до точки и вычислил, где этот граф пересекает круг oO, я думаю, что это не так сложно

Сначала разрешите его математически, а затем переведите в код. Помните, что кратчайшая линия между точкой и краем круга также пройдет через ее центр (как указано в @litb).

  1. Самая короткая точка расстояния лежит на пересечении окружности и линии, проходящей через центр и входную точку. Также центральные, входные и выходные точки лежат на прямой линии

  2. пусть центр будет (xc, yc) и кратчайшей от входа (xi, yi) be (x, y), то sqrt ((xc-x) ^ 2 + (yc-y) ^ 2) = r

  3. поскольку центральные, входные и выходные точки лежат на прямой линии, наклон, рассчитанный между любыми из двух из этих точек, должен быть одинаковым.

(yc-yi) / (xc-xi) = (y-yc) / (x-xc)

4. Составляющие уравнения 2 и 3 должны дать нам кратчайшую точку.

Trig, умножьте на r и добавьте pX или pY, если это необходимо.

Обратимся к центру круга как к вашему происхождению, преобразуем координаты (pX, pY) в полярные координаты (theta, r ‘) заменим r’ на исходный круг r и вернемся к декартовым координатам ( и отрегулируйте исходное положение).

Вы попросили кратчайший код, так что вот оно. В четырех строках это можно сделать, хотя по-прежнему существует квадратичная. Я считал, что точка вне круга. Я не думал о том, что произойдет, если точка находится непосредственно над или ниже центра круга, то есть cX = pX.

 m=(cY-pY)/(cX-pX); //slope b=cY-m*cX; //or Py-m*Px. Now you have a line in the form y=m*x+b X=( (2mcY)*((-2*m*cY)^2-4*(cY^2+cX^2-b^2-2*b*cY-r^2)*(-1-m^2))^(1/2) )/(2*(cY^2+cX^2-b^2-2*bc*Yr^2)); Y=mX+b; 

1] Получить уравнение для линии, соединяющей точку и центр окружности.

2] Двигайтесь вдоль линии на расстояние одного радиуса от центра, чтобы найти точку на круге. То есть: радиус = a ^ 2 + b ^ 2, который равен: r = ((cY-Y) + (cX-X)) ^ (1/2)

3] Решите квадратично. X = quadratic_solver (r = ((cY-Y) + (cX-X)) ^ (1/2), X), который, если вы замените в Y = m * X + b, вы получите этот ад выше.

4] X и Y – ваши результаты на круге.

Я уверен, что где-то я сделал ошибку, пожалуйста, оставьте комментарий, если кто-нибудь найдет что-то. Конечно, он вырожден, один ответ наиболее далек от вашей точки, а другой ближе всего.

Легкий способ подумать об этом с точки зрения картины и легко превратиться в код: взять вектор (pX – cX, pY – cY) от центра к точке. Разделите его длиной sqrt (blah blah blah), умножьте на радиус. Добавьте это в (cX, cY).

  • Сбита ли математика с плавающей запятой?
  • Как определить тип кредитной карты на основе номера?
  • Изучение теории сбора мусора
  • Что такое lambda?
  • Как найти пару с k-й наибольшей суммой?
  • Сортировать по:
  • Является ли двойным действительно неподходящим для денег?
  • Что такое композиция, относящаяся к объектно-ориентированному дизайну?
  • Уравнение для тестирования, если точка находится внутри круга
  • Алгоритм естественной сортировки
  • Болт-коллаж - обнаружение и обработка
  • Давайте будем гением компьютера.