¿Cómo encontrar un punto final de un arco dado otro punto final, radio y dirección del arco?

Dado un arco arbitrario, donde conoce los siguientes valores: punto final (x1, y1), radio (r) y dirección del arco (por ejemplo, en sentido horario o antihorario de principio a fin), ¿cómo puedo calcular el otro punto final del arco (y Digo punto final porque pienso en un arco como un segmento de línea curvo, que se encuentra en la circunferencia del círculo y tiene dos puntos finales).

Aunque así es como interpreto el problema y tal vez no lo estoy pensando correctamente.

EDITAR: Sí, conozco el punto de origen y la longitud del arco. Lo siento, olvidé mencionar. Además, ese círculo estaría en un plano cartesiano 2D (ejes x e y). Lo siento, falta mi terminología matemática.

Además, no estoy tratando de hacer trampa en la tarea ni nada. Este es un problema legítimo para un gráfico SVG que estoy tratando de crear usando JavaScript y he hecho todo lo posible pero necesito ayuda.

Gracias de antemano.

¿Qué pasa con el centro (el radio no es suficiente, pero teniendo el centro y un punto final se puede calcular r )?
Sin saber algo como la longitud del arco o el ángulo por el que pasa, no puedes determinar el punto final de algún arco. Por ejemplo, el círculo unitario desde el punto ( 1 , 0 ) . Entonces ( 0 , 1 ) y ( 1 , 0 ) ambos pueden considerarse la misma dirección, están en el mismo radio, pero los puntos finales son diferentes...

Respuestas (1)

¡Bienvenido a Math.SE! Aquí está mi boceto para el caso de la dirección de las manecillas del reloj: el punto inicial es A , el punto final que desea es B , y C es el radio de la circunferencia sobre la que se encuentra el arco.Agujas del reloj

Usaré ángulos polares: puedes ver la descripción en Wikipedia . También se utilizarán las fórmulas para la conversión de polar a cartesiano (en el mismo artículo de wiki).

En la foto, θ es el ángulo polar de la dirección en la que la curva parte del punto A . Dado que cualquier radio de un círculo es perpendicular al círculo, el ángulo polar del vector C A es θ + π / 2 . El largo de C A es r . Por lo tanto, sus coordenadas cartesianas son

C A = ( r porque ( θ + π / 2 ) , r pecado ( θ + π / 2 ) ) = ( r pecado ( θ ) , r porque ( θ ) )
A continuación, necesitamos las coordenadas del vector C B . Su longitud también es r . Desde A C B es L / r radianes, el ángulo polar de C B es θ + π / 2 L / r . Convertir a cartesiano:
C B = ( r porque ( θ + π / 2 L / r ) , r pecado ( θ + π / 2 L / r ) ) = ( r pecado ( θ L / r ) , r porque ( θ L / r ) )
Finalmente, A B = C B C A , cuyos rendimientos
A B = ( r pecado ( θ L / r ) + r pecado ( θ ) , r porque ( θ L / r ) r porque ( θ ) )

Estos se pueden reescribir usando algunas identidades trigonométricas, pero no creo que ganaría nada. Como control de cordura, considere lo que sucede cuando L = 0 : el vector es cero, por lo tanto B es lo mismo que A . Aparte, si r la curva se convierte en un segmento de línea recta, pero averiguar el límite es un ejercicio de cálculo.:-)


Si la curva se dobla en sentido antihorario, las señales serán diferentes en algunos lugares. Es decir, el ángulo polar de C A será θ π / 2 , por eso

C A = ( r pecado ( θ ) , r porque ( θ ) )
El ángulo polar de C B será θ π / 2 + L / r , por eso
C B = ( r pecado ( θ + L / r ) , r porque ( θ + L / r ) )
La conclusión en este caso es
A B = ( r pecado ( θ + L / r ) r pecado ( θ ) , r porque ( θ + L / r ) + r porque ( θ ) )


Más tarde: una solución más simple para el caso cuando C es dado. Primero, calcule el vector C A y conviértalo a coordenadas polares usando estas fórmulas . Luego aumente o disminuya el ángulo en L / r , dependiendo de la elección en sentido antihorario/horario.

Como quería JavaScript, hice un jsfiddle y también copié el código a continuación. Los parámetros son las coordenadas de A y C, así como la longitud del arco y la dirección. el radio r se calcula dentro de la función.

function findB(Ax, Ay, Cx, Cy, L, clockwise) {
    var r = Math.sqrt(Math.pow(Ax - Cx, 2) + Math.pow(Ay - Cy, 2));
    var angle = Math.atan2(Ay - Cy, Ax - Cx);
    if (clockwise) {
        angle = angle - L / r;
    }
    else {
        angle = angle + L / r;
    }
    var Bx = Cx + r * Math.cos(angle);
    var By = Cy + r * Math.sin(angle);
    return [Bx, By];
}
document.write(findB(0, 1, 1, 0, 1, true));
5PM Gracias por su elaborada respuesta. Lo siento, no lo reconozco. Me desvié aquí. Tengo una pregunta para ti sobre el ángulo θ. No entiendo de su diagrama a dónde pertenece.
Lo siento, para elaborar: Mira, en mi problema, tengo el punto de origen del círculo (C), su radio (r), un punto a lo largo de su circunferencia (A), una longitud de un arco a lo largo de la circunferencia (L) y A es uno de sus puntos finales. Dada toda esta información, necesito encontrar el punto B y el ángulo que SÍ sé es <ACB. Sin embargo, no estoy seguro de su respuesta si θ es este mismo ángulo. ¿Crees que podrías mostrarme un problema de muestra que se resuelve con tus fórmulas? Además, ¿el ángulo está en radianes? Supongo que sí, ya que se le agrega PI / 2 en ciertos lugares.
@RicardoCardoza Fíjate en la parte " A C B es L / r radianes" en mi solución. Sí, mido los ángulos en radianes. // No, θ es el ángulo que introduje para indicar la dirección en la que el arco sale del punto A . Si ya tienes C , entonces no hay necesidad de introducir θ . La solución se vuelve mucho más simple: la agregaré al final de la respuesta.
5PM: Muchas gracias por su ayuda. ¡Tus ecuaciones funcionaron totalmente! Tu magia matemática me ayudó totalmente con esta parte crucial. ¿Puedo enviarte una tarjeta de Starbucks o algo así? Traté de buscar una manera de enviarle un correo electrónico privado en math.stackexchange pero no pude encontrarlo. ¿Debo publicar mi correo electrónico para que pueda enviarme un correo electrónico?
@RicardoCardoza No te preocupes por eso; puedes enviarme 10 puntos de reputación haciendo clic en la flecha "hacia arriba" junto a mi publicación, y estamos a mano. :)
Servirá. Solo tengo que obtener 15 puntos de reputación para poder votar tu publicación. ja ja.