Как я могу переместить объект по траектории «бесконечность» или «цифра 8»?

28

Когда я хочу переместить объект вокруг точки, я делаю:

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

Как заставить точку двигаться на восьмой или бесконечной траектории?

Евгений
источник

Ответы:

24

Некоторые возможности:

Лемнискат Бернулли

Лемнискат Героно

Лемнискат Бута

Кривая ватта

Мартон
источник
2
Ответы должны быть самодостаточными, внешние ссылки могут когда-нибудь умереть и сделают этот ответ бесполезным. Вы должны процитировать важные биты из ссылок, которые вы предоставили.
Брайан Х.
61

Как отмечает Мартон, есть несколько кривых «восьмерка», которые могут соответствовать вашим потребностям. Возможно, самым простым является лемнискат Героно , который имеет параметризацию:

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

и выглядит так:

Анимация лемниската героно

Однако лемнискат Бернулли может быть визуально более приятным; он имеет параметризацию, очень похожую на лемнискату Героно, за исключением того, что обе оси масштабируются с коэффициентом 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;

Это выглядит так:

Анимация Лемниската Бернулли

(Анимации, сделанные с помощью Maple 13, сжатые с помощью GIFsicle.)

Илмари Каронен
источник
Спасибо всем за вашу поддержку, которая принесла мне мой первый золотой значок здесь на gamedev! :-)
Илмари Каронен
1
+1 за размещение не только ссылок, но и формул и графики (с источниками).
rootlocus
2
Как есть, это должен быть принятый ответ.
Брайан Х.
-1

Я случайно нашел другой, используя эту формулу:

x2=y2+0.1x2.8

По графику Вольфрама Альфа :

половина символа бесконечности

user75095
источник
В отличие от других ответов, этот в настоящее время не представлен в параметрической форме, что позволяет нам легко продвигать позицию вперед с течением времени t. Я бы рекомендовал включить описание того, как вы будете использовать эту формулу для позиционирования движущегося объекта во времени.
DMGregory
-4

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

половина символа бесконечности

Произведение расстояний от любой точки на этой кривой до (-1, 0) и (1,0) является постоянным и равно 1.

user111508
источник
4
Этот ответ предоставляет формулу, моделирующую такую ​​кривую, но не метод «перемещения объекта» таким образом, чтобы он следовал этой кривой. Пожалуйста, подумайте над уточнением ответа, чтобы указать, как вы будете использовать эту математику для перемещения объекта в игре.
DMGregory