弹跳棒跳的C++正弦波公式
Posted
技术标签:
【中文标题】弹跳棒跳的C++正弦波公式【英文标题】:C++ sin wave formula for pogo stick jumping 【发布时间】:2010-11-05 09:50:52 【问题描述】:我需要创建一个在屏幕上以弧形跳跃的弹簧杆。我在想最好的办法是把它移到一个罪波上。如果波的顶部为 1,地面为 0,波的底部为 -1,那么每次达到 0 时,我都会重置这些值以再次启动正弦波。因此,它不会跟随典型的正弦波(0、1、0、-1、0 等),而是会走 0、1、0、1、0 等。
不幸的是,我的数学很糟糕,我已经尝试了好几个小时来开发一个公式。目前,我只是在尝试制作一个正常的罪波,上半部分模拟弹簧棒的跳跃,似乎无法达到那么远。我最接近的是:
m_vel.x++;
float f = PI / 30 / 2;
m_vel.y = 200 * sin(f * m_vel.x);
m_vel.y = -m_vel.y;
我需要波浪非常窄,高点非常高。上面的公式在第一次迭代时开始正常,但随后波浪变宽,高点和低点彼此靠近。任何人都可以帮助数学菜鸟吗?
【问题讨论】:
您可能需要考虑使用parabola,因为这就是实际发生的情况。 如果你只想得到一个正弦波,所有的负波峰都被正波峰替换,你可以使用绝对值函数,如abs(sin(...))
。不过,从你问题的第二部分来看,我不确定这是否真的是你想要的。
我建议你试试 Cliffords 的回答,因为如果你一步一步做的话,它的实现非常简单。只需跟踪位置速度和重力。对于每一步,您将 x 和 y 速度添加到 x 和 y 位置 + 将重力添加到 y 速度。如果 (y
【参考方案1】:
不确定你的数学,你的物理需要复习一下! pogostick是projectile motion的一个例子,它的轨迹形成parabola,用quadratic equation描述。
但是,您应该坚持不正确的正弦模型:正弦波的“上半部分”(或正)部分从 0 到 pi 弧度。正弦仅代表 y 项(高度),您不应该在那里有 x 项,它只是确定每个点的水平步长。如果你有 200,那代表 pogo 棒将达到的最大高度:
height = max_height * sin( theta ) ;
其中 0
theta_step = pi / jump_distance ;
这样当你达到 pi 弧度时,你已经移动了 jump_distance。在跳跃的瞬时距离(以及图中的 x 值)将是:
distance = jump_distance / theta ;
【讨论】:
【参考方案2】:只取正弦波的绝对值。 所以消极的部分变成了积极的。
float f = abs( sin( <input here> ) );
【讨论】:
【参考方案3】:锤子有票:
double a = 100.0; // amplitude controls the height
double f = 10.0; // frequency controls the width
double t = 0.0; // time is the independent variable.
abs(a*sin(2.0*PI*f*t))
不要忘记正弦函数需要弧度,因此作为参数传入的值必须采用正确的单位。
【讨论】:
对不起,我在这里写Java。【参考方案4】:这是正弦波和抛物线波的新编写的参数代码。
#define _USE_MATH_DEFINES // need this to get M_PI defined under VS2008
#include <math.h>
[...]
// user parameters
float screen_width = 640.0f;
float number_of_cycles_per_screen = 2.0f;
float min_wave_value = 0.0f;
float max_wave_value = 1.0f;
// sinus wave characteristics
float half_amplitude = 0.5f*(max_wave_value-min_wave_value);
float offset = half_amplitude+min_wave_value;
float f0 = 2.0f*M_PI*number_of_cycles_per_screen/screen_width;
// compute sinus wave on the whole screen width
for (float x=0.0f;x<screen_width;x+=1.0f)
float sin_wave_value = half_amplitude*sin(f0*x)+offset;
// use the value here
// parabola
float amplitude = 0.5*(max_wave_value-min_wave_value);
float root1 = 0.0;
float root2 = 1.0f/number_of_cycles_per_screen;
// compute parabolic wave on the whole screen width
for (float x=0.0f;x<screen_width;x+=1.0f)
float xm = fmod(x,screen_width/number_of_cycles_per_screen)/screen_width;
float para_wave_value = -amplitude*(xm-root1)*(xm-root2);
// use the value here
【讨论】:
以上是关于弹跳棒跳的C++正弦波公式的主要内容,如果未能解决你的问题,请参考以下文章