Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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;

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

  • пусть центр будет (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 должны дать нам кратчайшую точку.

Ответ 5

Триг-функции, умножьте на r и добавьте pX или pY, если необходимо.

Ответ 6

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

Ответ 7

Вы запросили кратчайший код, так что вот оно. В четырех строках это можно сделать, хотя по-прежнему существует квадратичная. Я считал, что точка вне круга. Я не думал о том, что произойдет, если точка находится непосредственно над или ниже центра круга, то есть 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*Y-r^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 - ваши результаты на круге.

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

Ответ 8

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