Pregunta

He pasado muchas horas en esto puedo sentir mi cordura deslizarse lentamente. Por lo que cualquier ayuda sería muy apreciado verdad. Voy a tratar de ser lo más breve posible.

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

Mi confusión se deriva de este problema. Cuando se proporciona con un punto en el exterior plano 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) las coordenadas de 2 puntos en la circunferencia. Llamémosles P1 y P2. P1 y P2 son dos extremos de un arco. El arco es de una longitud fija (X). P es el punto a medio camino 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 código de esto en C ++, pero cualquier sugerencia o pseudo-código sería grande.

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

¿Fue útil?

Solución

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 comienzo con su punto

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

A 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))

Otros consejos

un arco que subtiende un ángulo de ? (en radianes) tiene una longitud de arco de theta r. Por lo tanto, usted quiere un semi-ángulo de ? = X / (2R). A continuación, deberá tomar el vector (P -C), girarlo por ángulos de ± ?, y añadir de nuevo en C para obtener P1 y P2. Para rotar un vector por un ángulo, se multiplica por un rotación matriz .

Por lo tanto, 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)

Hay algunas cosas que podrían ayudar. No va a escribir el código, pero me imagino que la solución va a ser sobre la base de triángulos. Considere lo siguiente:

Cualquier radio es la misma longitud.

Así, el triángulo dibujado desde P1-P1-C es isósceles.

Cualquier tangente es perpendicular al radio.

Me sería muy difícil para probarlo a cabo aquí y ahora, pero si extiende las líneas de C a través de P1 / P2 a la tangente que se cruza con el círculo en C-> P también formar una isósceles.

Debe ser fácil de averiguar a partir de ahí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top