Je veux déplacer une particule en spirale à une vitesse constante. Notez que ce n'est pas une vitesse angulaire constante. Cela s'avère assez difficile, et je vais passer en revue ma méthode jusqu'à présent ci-dessous.
La spirale en question est une spirale archimédienne classique avec l'équation polaire r = ϑ
et les équations paramétriques x = t*cos(t), y = t*sin(t)
. Cela ressemble à ceci:
Je veux déplacer une particule autour de la spirale, donc naïvement, je peux simplement donner la position des particules comme la valeur de t, et la vitesse comme l'augmentation de t. De cette façon, la particule se déplace autour de la spirale à une vitesse angulaire constante. Cependant, cela signifie que plus on s'éloigne du centre, plus sa vitesse (non angulaire) devient rapide.
Donc, au lieu d'avoir ma vitesse dans l'augmentation de t, je veux ma vitesse comme l'augmentation de la longueur de l'arc. Obtenir la longueur d'arc d'une spirale est le premier défi, mais étant donné que la spirale d'Archimède que j'utilise n'est pas trop folle, la fonction de longueur d'arc est , où a = 1
. Cela me permet de convertir les valeurs thêta en longueur d'arc, mais c'est exactement le contraire de ce dont j'ai besoin. J'ai donc besoin de trouver l'inverse de la fonction de longueur d'arc, et à cet obstacle, Wolfram-Alpha m'a échoué.
Est-il donc possible de trouver l'inverse de la fonction de longueur d'arc? La fonction est un mappage un à un, si vous excluez les valeurs négatives de thêta.
Merci,
Laurie
la source
Réponses:
Compliquons votre spirale:
être
dans votre cas f (t): = t, dans le mien f (t): = 1 (donc je rembourse mes complications avec des simplifications :)
Si vous voulez aller à une certaine vitesse dans cette spirale dégénérée (un cercle), vous devez savoir combien de temps dure votre spirale dans un tour afin que vous puissiez dire combien de tours par seconde font pour être sûr que votre point voyage avec la vitesse désirée .
Nous savons maintenant que chaque tour complet dans un cercle est long de 2 · π · r : 2 · π · 1 dans notre cas; si ω est la vitesse de révolution (en tours par seconde) la vitesse V sera V = 2 · π · 1 · ω ou d'une manière plus générale:
si r est le rayon général; cela nous dit que:
si r est fonction de t on peut dire:
dans mon cas "compliqué" cela peut être réécrit comme suit:
dans votre cas "simplifié" la réponse est:
Vous connaissez votre vitesse constante V souhaitée, vous savez: 2, π et t est votre variable: vous savez tout et vous êtes prêt à partir!
l'approximation du cercle pour le voisinage infinitésimal de la spirale en t
[AVERTISSEMENT]
Il ne s'agit pas d'un traitement mathématique rigoureux: il ne prend pas en compte la contribution du différentiel de f ni ne dit quels types de fonctions ne peuvent pas être utilisés.
la source
Si cela ne vous dérange pas une hypothèse qui devient assez précise assez rapidement, cette solution simple fonctionne assez bien:
C'est paramétrique dans le temps, ce qui est assez pratique. Cependant, pour obtenir cela, je devais supposer que la motion était à peu près circulaire - c'est-à-dire. la vitesse linéaire instantanée est proportionnelle au rayon multiplié par la vitesse angulaire:
Pour montrer que la solution fonctionne, branchez-la sur
d{theta} / d{time}
:À
{time}=1
, cela place un point à distancesqrt(2)
de l'origine. Après cela, l'approximation s'améliore considérablement: la séparation (linéaire, pas le long du chemin) entre les points suivants est de 1,13, 1,08, 1,06. Après 100 points, la séparation est inférieure à 1,0023.la source
En cherchant une solution de calcul de l'angle qui correspond à une certaine longueur d'arc, je suis tombé sur cette question et la réponse actuelle. Malheureusement, ni cette réponse ni aucune autre ressource que j'ai trouvée sur le Web n'ont pu être directement utilisées pour une implémentation.
De toute évidence, le calcul de l'inverse de la fonction de longueur d'arc (qui était également fourni dans la question) est très difficile. Mais une approximation de cet inverse en utilisant la méthode itérative de Newton est possible. Ce qui suit est une classe qui propose principalement deux méthodes:
computeArcLength(double alpha, double angleRad)
: Calcule la longueur d'arc d'un point sur la spirale d'Archimède oùalpha
est la distance entre les virages successifs etangleRad
l'angle en radianscomputeAngle(double alpha, double arcLength, double epsilon)
: Calcule l'angle auquel le point pour la longueur d'arc donnée est situé sur la spirale d'Archimède, oùalpha
est la distance entre les virages successifs, etepsilon
est le seuil d'approximation pour l'itération de NewtonLe code est implémenté ici en Java, mais ces méthodes de base doivent être assez indépendantes du langage:
Un exemple de la façon de l'utiliser pour l'objectif décrit dans la question est donné dans cet extrait: il génère un certain nombre de points sur la spirale, avec une distance souhaitée (longueur d'arc!) Entre les points:
La distance de longueur d'arc réelle des points calculés est imprimée, et on peut voir qu'ils sont en fait équidistants, avec la distance de longueur d'arc souhaitée.
la source
Je lutte aussi avec ça.
Ce que je fais, c'est maintenir la vitesse constante et changer la direction de l'objet.
Si je fais est si l'angle (en degrés) est égal à la distance de l'origine, multiplié par une constante, j'obtiens une belle spirale archimédienne parfaite. les constantes plus grandes obtiennent moins d'espace entre les lignes. Le seul problème est que si la vitesse est trop élevée, elle saute la piste et gâche. les spirales plus serrées nécessitent donc une vitesse plus lente pour tracer de manière fiable.
direction = ((spiral_factor*(current_distance) mod 360);
Où current_distance est le rayon dessiné de l'emplacement au point d'apparition en pixels, saisi par une fonction de moteur qui me le donne.
Ce qui me fait monter le mur, c'est l'inverse. placer l'objet à L'EXTÉRIEUR et le faire tracer la spirale archimédienne INTÉRIEURE. Déplacer la particule dans l'autre sens ne fonctionne pas. qui fait simplement pivoter la spirale de 180 degrés. inverser la direction en donne une dans le sens horaire.
la source