una tiene sacar puntos punto ordenada los hallar encontrar ecuacion dentro cuantos con como circunferencia abscisas algorithm language-agnostic geometry

algorithm - tiene - La mejor forma de encontrar un punto en un círculo más cercano a un punto determinado



puntos de una circunferencia (8)

Haría una línea desde el centro hasta el punto, y calculo donde ese gráfico cruza el círculo oO pienso que no es tan difícil

Dado un punto (pX, pY) y un círculo con un centro conocido (cX, cY) y radio (r), ¿cuál es la cantidad más corta de código que se puede encontrar para encontrar el punto en el círculo más cercano a (pX, pY)?

Tengo algún tipo de código funcionando, pero implica convertir el círculo en una ecuación de la forma (x - cX) ^ 2 + (y - cY) ^ 2 = r ^ 2 (donde r es el radio) y usando la ecuación de la línea desde el punto (pX, pY) hasta (cX, cY) para crear una ecuación cuadrática a resolver.

Una vez que elimine los errores, lo hará, pero parece una solución poco elegante.


Resuélvelo matemáticamente primero, luego traduce al código. Recuerde que la línea más corta entre un punto y el borde de un círculo también pasará por su centro (según lo indicado por @litb).


Trate el centro de la circular como su origen, convierta las coordenadas de (pX, pY) a coordenadas polares, (theta, r '') reemplace r'' con la r del círculo original y convierta de nuevo a coordenadas cartesianas ( y ajustar por el origen).


Trig funciona, multiplica por r y agrega pX o pY según corresponda.


Una manera fácil de pensar en términos de una imagen y fácil de convertir en código: tome el vector (pX - cX, pY - cY) desde el centro hasta el punto. Dividir por su longitud sqrt (blah blah blah), multiplicar por radio. Agregue esto a (cX, cY).


Usted pidió el código más corto, así que aquí está. En cuatro líneas se puede hacer, aunque todavía hay un cuadrático. He considerado el punto de estar fuera del círculo. No he considerado lo que sucede si el punto está directamente encima o debajo del centro del círculo, es decir, 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] Obtenga una ecuación para una línea que conecta el punto y el centro del círculo.

2] Muévete a lo largo de la línea una distancia de un radio desde el centro para encontrar el punto en el círculo. Es decir: radio = a ^ 2 + b ^ 2 que es: r = ((cY-Y) + (cX-X)) ^ (1/2)

3] Resuelve cuadraticamente. X = quadratic_solver (r = ((cY-Y) + (cX-X)) ^ (1/2), X) que si lo sustituyes en Y = m * X + b, obtienes ese infierno.

4] X e Y son sus resultados en el círculo.

Estoy bastante seguro de haber cometido un error en alguna parte, por favor deje un comentario si alguien encuentra algo. Por supuesto que es degenerado, una respuesta está más lejos de su punto y la otra es la más cercana.


donde P es el punto, C es el centro, y R es el radio, en un lenguaje "mathy" adecuado:

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

donde | V | es la longitud de V.

BIEN BIEN

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;

fácil de extender a> 2 dimensiones.


  1. El punto de distancia más corto se encuentra en la intersección de la circunferencia y la línea que pasa por el centro y el punto de entrada. También el centro, los puntos de entrada y salida se encuentran en una línea recta

  2. deje que el centro sea (xc, yc) y el punto más corto de la entrada (xi, yi) be (x, y) luego sqrt ((xc-x) ^ 2 + (yc-y) ^ 2) = r

  3. dado que el centro, los puntos de entrada y salida se encuentran en una línea recta, la pendiente calculada entre cualquiera de estos dos puntos debe ser la misma.

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

4.solving ecuaciones 2 y 3 debería darnos el punto más corto.