Fino a questo momento abbiamo simulato un universo con la sola legge del moto rettilineo uniforme. E' arrivato il momento di includere anche l'accelerazione nei nostri modelli!
Il nostro scopo è di simulare un oggetto che cade verso il basso di moto accelerato uniforme, rimbalzando sulle pareti con urti perfettamente elastici.
Inseriamo le due componenti dell'accelerazione come due ulteriori variabili, ax e ay.
// dichiarazione delle variabili
float x, y; // due componenti per la posizione
float vx, vy; // due componenti per la velocità
float ax, ay; // due componenti per l'accelerazione
float t, dt; // il tempo e l'incremento di tempo
float r = 20; // raggio dell'oggetto
Inizializziamo i valori di ax e ay nella funzione di setup
void setup()
{
size(800, 600);
t = 0; // il contatore del tempo comincia da zero
dt = 1; // il delta-t viene inizializzato ad 1
x = 100; // x e y della posizione iniziale
y = 200;
vx = 1; // componenti x e y del vettore velocità
vy = 0.3;
ax = 0.0; // componenti dell'accelerazione
ay = 0.1;
}
A questo punto basta usare le componenti dell'accelerazione nelle equazioni del moto, nella funzione movimento.
void movimento()
{
vx = vx + ax * dt; // aggiorno il valore della velocità
vy = vy + ay * dt; // usando le componenti dell'accelerazione
x = x + vx * dt; // aggiorno la posizione usando i nuovi
y = y + vy * dt; // valori della velocità
t += dt; // incremento il tempo
}
Il gioco è fatto!
Ecco il codice sorgente completo dopo l'aggiunta dell'accelerazione.
// dichiarazione delle variabili
float x, y; // due componenti per la posizione
float vx, vy; // due componenti per la velocità
float ax, ay; // due componenti per l'accelerazione
float t, dt; // il tempo e l'incremento di tempo
float r = 20; // raggio dell'oggetto
void setup()
{
size(800, 600);
t = 0; // il contatore del tempo comincia da zero
dt = 1; // il delta-t viene inizializzato ad 1
x = 100; // x e y della posizione iniziale
y = 200;
vx = 1; // componenti x e y del vettore velocità
vy = 0.3;
ax = 0.0; // componenti dell'accelerazione
ay = 0.1;
}
void draw()
{
//background(255);
grafica();
movimento();
rimbalzo();
}
void grafica()
{
fill(255, 0, 0);
ellipse(x, y, 2*r, 2*r); // disegno l'ellisse
textSize(15);
text("t: " + t, 10, 25); // visualizzo il valore del tempo
}
void movimento()
{
vx = vx + ax * dt; // aggiorno il valore della velocità
vy = vy + ay * dt; // usando le componenti dell'accelerazione
x = x + vx * dt; // aggiorno la posizione usando i nuovi
y = y + vy * dt; // valori della velocità
t += dt; // incremento il tempo
}
void rimbalzo()
{
if (x + r > width) // sto urtando la parete destra
{
vx = -vx;
x = width - r;
}
if (x - r < 0) // sto urtando la parete sinistra
{
vx = -vx;
x = r;
}
if (y + r > height) // sto urtando la parete inferiore
{
vy = -vy;
y = height - r;
}
if (y - r < 0) // sto urtando la parete superiore
{
vy = -vy;
y = r;
}
}