2008-11-19 21 views
30

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 Puedes encontrar el punto en el círculo más cercano a (pX, pY)?La mejor manera de encontrar un punto en un círculo más cercano a un punto dado

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 del punto (pX, pY) a (cX, cY) para crear una ecuación cuadrática a resolver.

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

+0

esto es tarea de hecho –

+2

Era en realidad para un juego, pero obtuvo la solución, no obstante. –

Respuesta

58

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

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

donde | V | es la longitud de V.

OK, OK

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.

+0

Implementé el bit de matemáticas que publicó antes de escribir su código. Sin embargo, descubrí que necesitaba tener pX - vX, no pX + pY para obtener el lado más cercano. De todos modos, gracias por esto. Tengo curiosidad por ver si hay soluciones más cortas. –

+0

V/| V | es el vector unitario de C hacia P, entonces simplemente lo multipliqué por R y lo agregué a C. ¿No multiplicaría por -R para obtener el punto más alejado? –

+0

Veo mi error. Debería haber dicho C + V/| V | * R –

1

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

+0

x = r cos (...); y = r sin (...); Cuento 2 líneas de código. –

+0

Oh ... heh Totalmente evité usar el pensamiento trigonométrico pensando que sería más fácil sin él ... –

+0

¿Por qué evitarías usar trig en un problema de trigonometría? – mmcdole

7

Me gustaría hacer una línea desde el centro hasta el punto, y que Calc donde gráfica cruza el círculo oO yo no pienso tan difícil

+1

... o cruzaría el círculo, si está dentro del círculo. –

3

resolverlo matemáticamente primero, y luego se traducen en 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).

1

Trate el centro de la circular como su origen, convierta las coordenadas de (pX, pY) en coordenadas polares, (theta, r ') reemplace r' con la r del círculo original y conviértalo nuevamente en cartesiano coordenadas (y ajustar por el origen).

1

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évase 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 de forma cuadrática. 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 que cometí 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.

+0

Esto parece familiar. Un compañero de equipo en un concurso de programación usó esta solución y terminó con dos soluciones como esta. Habíamos terminado todas las otras preguntas, así que trabajamos juntas pero no pudimos encontrar una regla más cercana y más lejana. Yo di un puntapié a la fuerza bruta. No es tarea, es –

1

Forma 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).

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

  2. dejar ser el centro (xc, yc) y el punto más corta desde la entrada (xi, yi) ser (x, y), entonces sqrt ((xc-x)^2 + (yc-y)^2) = r

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

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

ecuaciones 4.solving 2 & 3 debe darnos el punto más corto.

Cuestiones relacionadas