Quiero mover una partícula en espiral a una velocidad constante. Tenga en cuenta que esa no es una velocidad angular constante. Esto está resultando bastante difícil, y pasaré por mi método hasta ahora a continuación.
La espiral en cuestión es una espiral clásica de Arquímedes con la ecuación polar r = ϑ
y las ecuaciones paramétricas x = t*cos(t), y = t*sin(t)
. Esto se ve así:
Quiero mover una partícula alrededor de la espiral, tan ingenuamente, solo puedo dar la posición de la partícula como el valor de t, y la velocidad como el aumento de t. De esa manera, la partícula se mueve alrededor de la espiral a una velocidad angular constante. Sin embargo, esto significa que cuanto más se aleja del centro, más rápida se vuelve su velocidad (no angular).
Entonces, en lugar de tener mi velocidad en el aumento de t, quiero mi velocidad como el aumento en la longitud del arco. Obtener la longitud del arco de una espiral es el primer desafío, pero debido al hecho de que la espiral de Arquímedes que estoy usando no es una locura, la función de longitud del arco es dónde a = 1
. Esto me permite convertir los valores theta a la longitud del arco, pero eso es exactamente lo contrario de lo que necesito. Así que necesito encontrar el inverso de la función de longitud de arco, y en ese obstáculo, Wolfram-Alpha me ha fallado.
Entonces, ¿es posible encontrar la inversa de la función de longitud de arco? La función es un mapeo uno a uno, si excluye los valores negativos de theta.
Gracias,
Laurie
fuente
Respuestas:
Vamos a complicar tu espiral:
ser
en su caso f (t): = t, en el mío f (t): = 1 (así que pago mis complicaciones con simplificaciones :)
Si desea ir a cierta velocidad en esta espiral degenerada (un círculo), debe saber cuánto dura su espiral en una ronda para poder decir cuántas rondas por segundo hace para asegurarse de que su punto viaja con la velocidad deseada .
Ahora sabemos que cada ronda completa en un círculo es 2 · π · r de largo: 2 · π · 1 en nuestro caso; si ω es la velocidad de revolución (en rondas por segundo) la velocidad V será V = 2 · π · 1 · ω o de una manera más general:
si r es el radio general; esto nos dice que:
si r es una función de t podemos decir:
en mi caso "complicado" esto se puede reescribir de la siguiente manera:
en su caso "simplificado" la respuesta es:
Conoces tu velocidad constante deseada V, sabes: 2, π y t es tu variable: ¡lo sabes todo y estás listo para comenzar!
la aproximación circular para la vecindad infinitesimal de la espiral en t
[DESCARGO DE RESPONSABILIDAD]
Esto no pretende ser un tratamiento matemático riguroso: no tiene en cuenta la contribución del diferencial de f ni dice qué tipos de funciones no se pueden utilizar.
fuente
Si no le importa una suposición que se vuelve bastante precisa con bastante rapidez, esta solución simple funciona bastante bien:
Esto es paramétrico en el tiempo, lo cual es bastante útil. Sin embargo, para obtener esto, necesitaba suponer que el movimiento es aproximadamente circular, es decir. La velocidad lineal instantánea es proporcional al radio multiplicado por la velocidad angular:
Para mostrar que la solución funciona, conéctela a
d{theta} / d{time}
:En
{time}=1
, esto coloca un punto a distanciasqrt(2)
del origen. Después de esto, la aproximación mejora significativamente: la separación (lineal, no a lo largo del camino) entre los puntos subsiguientes es 1.13, 1.08, 1.06. Después de 100 puntos, la separación es inferior a 1.0023.fuente
Mientras buscaba una solución para calcular el ángulo que corresponde a una cierta longitud de arco, me topé con esta pregunta y la respuesta actual. Desafortunadamente, ni esta respuesta ni ningún otro recurso que encontré en la web podrían usarse directamente para una implementación.
Obviamente, calcular la inversa de la función de longitud de arco (que también se proporcionó en la pregunta) es muy difícil. Pero es posible una aproximación de este inverso utilizando el método iterativo de Newton. La siguiente es una clase que ofrece principalmente dos métodos:
computeArcLength(double alpha, double angleRad)
: Calcula la longitud del arco de un punto en la espiral de Arquímedes dondealpha
es la distancia entre giros sucesivos yangleRad
el ángulo en radianescomputeAngle(double alpha, double arcLength, double epsilon)
: Calcula el ángulo en el que el punto para la longitud de arco dada se encuentra en la Espiral de Arquímedes, dondealpha
está la distancia entre giros sucesivos yepsilon
es el umbral de aproximación para la iteración de NewtonEl código se implementa aquí en Java, pero estos métodos principales deberían ser bastante independientes del lenguaje:
En este fragmento se proporciona un ejemplo de cómo usar esto para el objetivo descrito en la pregunta: genera un cierto número de puntos en la espiral, con una distancia deseada (¡longitud del arco!) Entre los puntos:
Se imprime la distancia real de la longitud del arco de los puntos calculados, y se puede ver que de hecho son equidistantes, con la distancia deseada de la longitud del arco.
fuente
Estoy luchando con esto también.
Lo que estoy haciendo es mantener constante la velocidad y cambiar la dirección del objeto.
Si hago es que el ángulo (en grados) es igual a la distancia desde el origen, multiplicado por una constante, obtengo una espiral arquímedeca perfecta y agradable. Las constantes más grandes obtienen menos espacio entre las líneas. El único problema es si la velocidad es demasiado alta, entonces salta la pista y se equivoca. así que las espirales más apretadas requieren una velocidad más lenta para trazar de manera confiable.
direction = ((spiral_factor*(current_distance) mod 360);
Donde current_distance es el radio dibujado desde la ubicación hasta el punto de generación en píxeles, agarrado por una función del motor que me lo da.
Lo que me está volviendo loco es lo contrario. colocando el objeto en el EXTERIOR y haciéndolo trazar la espiral de Arquímedes HACIA ADENTRO. Mover la partícula de la manera opuesta no funciona. eso solo gira la espiral 180 grados. invertir la dirección da una en sentido horario.
fuente