如何在“无限”或“图8”轨迹中移动对象?


28

当我想围绕点移动对象时,我会做:

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

如何使点在八或无限符号轨迹上移动?

Answers:



61

正如Marton所指出的,可能有几种“八位数的曲线”可以满足您的需求。也许最简单的是Geronolemniscate,它具有参数化:

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

看起来像这样:

Gerono的动画

但是,伯努利双子座在视觉上可能更令人愉悦。它的参数化与Gerono的lemniscate非常相似,除了两个轴的缩放比例为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上的第一个金牌!:-)
Ilmari Karonen 2012年

1
+1不仅用于发布链接,而且还用于发布公式和图形(带有源)。
rootlocus 2012年

2
照原样,这应该是公认的答案。
Brian H.

-1

我使用此公式随机找到了另一个:

x2=y2+0.1x2.8

Wolfram Alpha所示

无限符号的一半


与其他答案不同,该答案目前未以参数形式显示,这使我们可以轻松地随时间向前推进位置t。我建议对如何随时间使用此公式定位移动对象进行描述。
DMGregory

-4

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

无限符号的一半

从该曲线上任意点到(-1,0)再到(1,0)的距离的乘积是常数,等于1。


4
该答案提供了对此类曲线进行建模的公式,但没有提供以遵循该曲线的方式“移动对象”的方法。请考虑详细说明答案,以指示如何使用此数学运算来移动游戏中的对象。
DMGregory
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.