Domanda

Ho bisogno di creare un trampolo a molla che salta attraverso lo schermo in archi. Stavo pensando il modo migliore per farlo sarebbe quello di spostarlo su un'onda peccato. Se la parte superiore dell'onda è 1, il terreno è 0 e la parte inferiore dell'onda è -1, allora ogni volta che colpisce 0 vorrei ripristinare i valori per avviare il peccato onda di nuovo. Così, invece di seguire l'onda tipica sin (0, 1, 0, -1, 0, ecc) sarebbe andata 0, 1, 0, 1, 0, ecc

Purtroppo la mia matematica è abbastanza terribile e ho cercato per ore per sviluppare una formula. Al momento mi sto solo cercando di fare una normale onda peccato in cui la metà superiore emula un salto pogo stick, non riesco nemmeno a arrivare così lontano. Il più vicino che ho è:

m_vel.x++;
float f = PI / 30 / 2;
m_vel.y = 200 * sin(f * m_vel.x);
m_vel.y = -m_vel.y;

Ho bisogno delle onde di essere piuttosto stretta, e il punto più alto di essere abbastanza alta. La formula sopra inizia fuori ok per la prima iterazione, ma poi le onde si allargano e l'alto e punti bassi vicino a uno sull'altro. Chiunque può aiutare una matematica niubbo fuori?

È stato utile?

Soluzione

Non sei sicuro della matematica, la fisica ha bisogno di qualche tuo spazzolatura in su! Il bastone pogo è un esempio di proiettile movimento e le sue forme di traiettoria un parabola , che viene descritto da un quadratica equazione .

Tuttavia si deve persistere con il modello errato sinusoidale : La "metà superiore" (o positiva) parte di un corre sinusoidali da 0 a radianti pi. Il seno rappresenta solo il termine y (altezza), non si dovrebbe avere una durata x lì, che semplicemente determina la fase orizzontale per ogni punto. Dove hai 200, che rappresenta l'altezza massima del bastone di pogo raggiungerà:

height = max_height * sin( theta ) ;

0 <= theta <= pi, e viene incrementato nel tempo. La dimensione dell'incremento sarà determinata dalla velocità di avanzamento, o la distanza totale salto.

theta_step = pi / jump_distance ;

in modo che nel momento in cui avete raggiunto radianti pi, si è spostato da jump_distance. Durante la distanza istantanea salto (e quindi il valore x in una trama) sarà:

 distance = jump_distance / theta ;

Altri suggerimenti

Basta prendere il valore assoluto di un'onda peccato. Così le parti che sono negativi si trasformano positivo.

float f = abs( sin( <input here> ) );

Hammerite ha il biglietto:

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

Non dimenticare che la funzione seno richiede radianti, per cui il valore si passa come un parametro deve essere nelle unità giuste.

Ecco il codice parametrico fresco scritto sia un'onda sinusale e un'onda parabolica.

#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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top