Лучший способ найти точку на круге, ближайшем к данной точке
Учитывая точку (pX, pY) и круг с известным центром (cX, cY) и радиусом (r), каково кратчайшее количество кода, которое вы можете найти, чтобы найти точку на ближайшем к круге (pX, pY)?
У меня есть некоторый код работы, но он включает преобразование круга в уравнение вида (x – cX) ^ 2 + (y – cY) ^ 2 = r ^ 2 (где r – радиус) и используя уравнение линии от точки (pX, pY) до (cX, cY) для создания квадратичного уравнения, которое нужно решить.
Как только я сглажу ошибки, они будут делать, но это похоже на неэлегантное решение.
- Для чего нужен пузырь?
- Линия пересечения двух плоскостей
- Алгоритм для выделения перекрывающихся прямоугольников?
- Что такое самоуверенное программное обеспечение?
- Сгенерировать список всех возможных перестановок строки
- Алгоритм генерации анаграмм
- Как проверить, пересекает ли сегмент линии прямоугольник?
- Вычислить наибольший прямоугольник во вращающемся прямоугольнике
- Что такое непрозрачное значение в C ++?
- Как вы находите точку на заданном перпендикулярном расстоянии от линии?
- Что такое оптимизация хвостового звонка?
- Как измерить сходство между двумя изображениями?
- Как работает переопределение переменных XOR?
где 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).
-
Самая короткая точка расстояния лежит на пересечении окружности и линии, проходящей через центр и входную точку. Также центральные, входные и выходные точки лежат на прямой линии
-
пусть центр будет (xc, yc) и кратчайшей от входа (xi, yi) be (x, y), то sqrt ((xc-x) ^ 2 + (yc-y) ^ 2) = r
-
поскольку центральные, входные и выходные точки лежат на прямой линии, наклон, рассчитанный между любыми из двух из этих точек, должен быть одинаковым.
(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).