Como mover um objeto em uma trajetória “infinito” ou “figura 8”?

28

Quando eu quero mover um objeto ao redor do ponto, eu faço:

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

Como fazer com que o ponto se mova na trajetória do sinal oito ou infinito?

Yevhen
fonte

Respostas:

61

Como observa Marton, existem várias curvas em "número de oito" que podem atender às suas necessidades. Talvez o mais simples seja o lemniscato de Gerono , que tem a parametrização:

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

e fica assim:

Animação Lemniscate of Gerono

No entanto, o lemniscato de Bernoulli pode ser visualmente mais agradável; possui uma parametrização muito semelhante ao lemniscato de Gerono, exceto que os dois eixos são dimensionados por um fator 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;

Se parece com isso:

Animação Lemniscate of Bernoulli

(Animações feitas com o Maple 13, compactadas com GIFsicle.)

Ilmari Karonen
fonte
Obrigado a todos pelo apoio, que me valeu meu primeiro distintivo dourado aqui no gamedev! :-)
Ilmari Karonen
1
+1 por não apenas postar os links, mas também as fórmulas e gráficos (com fontes).
método do lugar das raízes
2
Como é, essa deve ser a resposta aceita.
Brian H.
-1

Encontrei aleatoriamente outro usando esta fórmula:

x2=y2+0.1x2.8

Conforme plotado por Wolfram Alpha :

metade de um símbolo do infinito

user75095
fonte
Diferentemente das outras respostas, atualmente essa não é apresentada em forma paramétrica que nos permite avançar facilmente a posição ao longo do tempo t. Eu recomendo incluir uma descrição de como você usaria essa fórmula para posicionar um objeto em movimento ao longo do tempo.
DMGregory
-4

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

metade de um símbolo do infinito

O produto das distâncias de qualquer ponto nessa curva para (-1, 0) e (1,0) é constante e é igual a 1.

user111508
fonte
4
Essa resposta fornece uma fórmula para modelar essa curva, mas não um método para "mover um objeto" de forma que ela siga essa curva. Por favor, considere elaborar a resposta para indicar como você usaria essa matemática para mover um objeto em um jogo.
DMGregory