Comment déplacer un objet dans une trajectoire «infini» ou «figure 8»?

28

Quand je veux déplacer un objet autour d'un point, je fais:

    point.x *= cosf(timer.timeElapsed);
    point.y *= sinf(timer.timeElapsed);

Comment faire bouger le point sur une trajectoire de signe à huit ou à l'infini?

Yevhen
la source

Réponses:

61

Comme le note Marton, il existe plusieurs courbes "figure de huit" qui pourraient répondre à vos besoins. Le plus simple est peut-être le lemniscate de Gerono , qui a la paramétrisation:

x = cos(t);
y = sin(2*t) / 2;

et ressemble à ceci:

Animation Lemniscate de Gerono

Cependant, le lemniscate de Bernoulli peut être visuellement plus agréable; il a une paramétrisation très similaire à la lemniscate de Gerono, sauf que les deux axes sont mis à l'échelle par un facteur de 1/(sin(t)^2 + 1) = 2/(3 - cos(2*t)):

scale = 2 / (3 - cos(2*t));
x = scale * cos(t);
y = scale * sin(2*t) / 2;

Cela ressemble à ceci:

Animation Lemniscate de Bernoulli

(Animations faites avec Maple 13, compressées avec GIFsicle.)

Ilmari Karonen
la source
Merci à tous pour votre soutien, qui m'a valu mon premier badge en or ici sur gamedev! :-)
Ilmari Karonen
1
+1 pour publier non seulement les liens, mais aussi les formules et les graphiques (avec les sources).
rootlocus
2
En l'état, cela devrait être la réponse acceptée.
Brian H.
-1

J'en ai trouvé un autre au hasard en utilisant cette formule:

x2=y2+0.1x2.8

Comme l'a tracé Wolfram Alpha :

la moitié d'un symbole de l'infini

user75095
la source
Contrairement aux autres réponses, celle-ci n'est actuellement pas présentée sous une forme paramétrique qui nous permet d'avancer facilement la position dans le temps t. Je recommanderais d'inclure une description de la façon dont vous utiliseriez cette formule pour positionner un objet en mouvement dans le temps.
DMGregory
-4

((x+1)2+y2)((x1)2+y2)=1

la moitié d'un symbole de l'infini

Le produit des distances de tout point de cette courbe à (-1, 0) et à (1,0) est constant et égal à 1.

user111508
la source
4
Cette réponse fournit une formule modélisant une telle courbe, mais pas une méthode pour "déplacer un objet" de telle manière qu'il suive cette courbe. Veuillez envisager de développer la réponse pour indiquer comment vous utiliseriez ces calculs pour déplacer un objet dans un jeu.
DMGregory