Cómo calcular (x, y) para un arco de longitud fija lejos de un punto de una circunferencia
-
29-09-2019 - |
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
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í.