2010-11-05 13 views
9

He pasado tantas horas en esto que puedo sentir que mi cordura se desliza lentamente. Por lo tanto, cualquier ayuda sería realmente apreciada. Trataré de ser lo más breve posible.Cómo calcular (x, y) para una longitud de arco fija lejos de un punto en una circunferencia

Tengo un círculo en un plano 2D. Sé las coordenadas cartesianas para su punto central (C) y el radio (R).

Mi confusión proviene de este problema. Cuando se le proporciona un punto en el plano fuera del círculo; Puedo calcular el punto (P) en la circunferencia del círculo más cercano a ese punto.

Lo que quiero hacer es determinar las coordenadas (x, y) de 2 puntos en la circunferencia. Vamos a llamarlos P1 y P2. P1 y P2 son dos extremos de un arco. El arco es de una longitud fija (X). P es el punto medio entre P1 y P2. Como tal, la longitud del arco de P a P1 & P a P2 son ambos X/2.

En resumen: dado C, R, P, X; Necesito calcular P1 y P2.

Estoy tratando de codificar esto en C++, pero cualquier sugerencia o pseudocódigo sería genial.

EDIT: X es una longitud de arco, no una línea recta entre P1 y P2

+19

¿Qué tal algunos de los ejemplos de los siguientes: http://www.codeproject.com/KB/recipes/Wykobi.aspx Son muy eficientes y algo elegantes, busque "Punto más cercano en el círculo de puntos externos" y "Segmentos de línea tangente del círculo" –

Respuesta

4

en un círculo, un ángulo theta corresponde a una longitud de arco de theta * R, es decir, su arco se subtienden un ángulo de theta = X/R. Así que si se inicia con su punto de

P = C + R * (sin(u), cos(u)) 

continuación, sólo tiene que ir hacia arriba/abajo por theta/2:

P1 = C + R * (sin(u + theta/2), cos(u + theta/2)) 

y

P2 = C + R * (sin(u - theta/2), cos(u - theta/2)) 
3

un arco que abarca un ángulo de θ (en radianes) tiene una longitud de arco de θR. Entonces, quieres un medio ángulo de θ = X/(2R). Luego debe tomar el vector (P -C), rotarlo en ángulos de ± θ, y volver a agregarlo en C para obtener P1 y P2. Para girar un vector en un ángulo, multiplíquelo por rotation matrix.

Así, en pseudocódigo, se vería así:

θ = X/(2R) 
A = 2x2 rotation matrix corresponding to a rotation by θ radians 
A' = transpose of A 
P1 = C + A * (P - C) 
P2 = C - A' * (P - C) 
0

Hay algunas cosas que podrían ayudar. No voy a escribir el código, pero imagino que la solución se basará en triángulos. Considere:

Cualquier radio tiene la misma longitud.

Por lo tanto, el triángulo dibujado desde P1-P1-C es isósceles.

Cualquier tangente es perpendicular al radio.

Me sería difícil probarlo aquí y ahora, pero si extiende las líneas de C a P1/P2 a la tangente que cruza el círculo en C-> P también forma un isósceles.

Debería ser fácil de entender desde allí.

Cuestiones relacionadas