1

画面を弧を描いてジャンプするポゴスティックを作成する必要があります。これを行う最良の方法は、正弦波で動かすことだと私は考えていました。波の上部が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;

波はかなり狭く、ハイポイントはかなり高くする必要があります。上記の式は、最初の反復では問題なく開始されますが、その後、波が広くなり、高点と低点が互いに接近します。誰かが数学の初心者を助けることができますか?

4

4 に答える 4

6

あなたの数学についてはよくわかりません、あなたの物理学はいくつかのブラッシュアップが必要です!ホッピングは発射体の動きの例であり、その軌道は放物線を形成します。これは2次方程式で表されます。

ただし、誤った正弦波モデルを維持する必要があります。正弦波の「上半分」(または正の)部分は、0からpiラジアンまで実行されます。サインはy項(高さ)のみを表します。x項は必要ありません。これは、各ポイントの水平方向のステップを決定するだけです。200がある場合、これはポゴスティックが到達する最大の高さを表します。

height = max_height * sin( theta ) ;

ここで、0 <= theta <= piであり、時間の経過とともに増分されます。増分のサイズは、前進速度または合計ジャンプ距離によって決まります。

theta_step = pi / jump_distance ;

円周率ラジアンに到達するまでに、jump_distanceで移動するようにします。ジャンプ中の瞬間距離(したがって、プロットのx値)は次のようになります。

 distance = jump_distance / theta ;
于 2010-11-05T10:21:35.540 に答える
2

正弦波の絶対値を取るだけです。したがって、負の部分は正になります。

float f = abs( sin( <input here> ) );
于 2010-11-05T10:16:04.350 に答える
1

Hammeriteにはチケットがあります:

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)) 

サイン関数にはラジアンが必要であるため、パラメーターとして渡す値は正しい単位である必要があることを忘れないでください。

于 2010-11-05T10:16:06.927 に答える
0

これは、正弦波と放物線波の両方について新しく作成されたパラメトリックコードです。

#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
}
于 2010-11-05T10:29:01.340 に答える