/* UTF-8 * * © Jacques Duma * 14 mai 2009 * * Tir à la Cible avec Trajectoire Parabolique */ // couleurs des éléments de la simulation // le vecteur vitesse color vitesse = color(0, 127, 0); // vert // le position antérieurs de la balle color traces = color(100, 150, 100); // gris-vert // la balle color balle = color(127, 0, 0); // rouge sombre // Accélération float G = 9.81; // vecteur vitesse initial float vx0 = 40; float vy0 = 80; // Mouvement de la Balle // temps et le pas t + dt float t; float dt = 0.25; // coordonnées de la balle float x, y; // position initiale de la balle int xDepartBalle, yDepartBalle; // mémorisation des traces de la balle float[] xTracesBalle = new float[500]; float[] yTracesBalle = new float[500]; int nombreDeTraces; // === dessinerLaBalle : DESSIN (appelée dans draw) === void dessinerLaBalle() { noStroke(); if (! initEnCours) { fill(traces); // les points déjà vus for (int k = 0; k < nombreDeTraces; k++) { ellipse(xTracesBalle[k], yTracesBalle[k], 6, 6); } } calculerPositionBalle(); // le vitesseeur vitesse stroke(vitesse); line(x, y, x + vx(), y + vy()); // la balle noStroke(); fill(balle); ellipse(x, y, 8, 8); } // ================ calculerPositionBalle ================ void calculerPositionBalle() { // &équations du mouvement, calcul du point Balle(t) x = xDepartBalle + vx0 * t; y = yDepartBalle + 0.5 * G * t * t - vy0 * t; if (y > height || x > width || x < 0) { // désactive le JEU si la balle sort de la fenêtre (sauf vers le haut) jeuActif = false; } if (sqrt((x - xCible) * (x - xCible) + (y - yCible) * (y - yCible)) < rCible) { // désactive le JEU si la balle touche la cible bravo = true; jeuActif = false; } // Si le JEU est encore actif on mémorise la nouvelle position if (jeuActif && ! initEnCours) { xTracesBalle[nombreDeTraces] = x; yTracesBalle[nombreDeTraces] = y; nombreDeTraces++; } } // ================ vecteur vitesse ================ // abscisse float vx() { return vx0; } // ordonnées float vy() { return G * t - vy0; } // ================ afficherInformations ================ void afficherInformations() { String message; // calcule les coordonnées de la balle et du vecteur vitesse // et affiche les informations au bas de la fenêtre int xx = int(x - x0); int yy = int(y0 - y); int vxx = int(vx()); int vyy = int(-vy()); float vv = sqrt(vxx * vxx + vyy * vyy); int dd = int(180 * asin(vyy / vv) / PI); if (vxx < 0) dd = 180 - dd; if (dd > 180) dd = dd - 360; // affiche les informations if (! initEnCours) { message = "Étape n° " + nombreDeTraces; drawEtiquette(message, 5, height - 5, LEFT, BOTTOM, policeStandard, traces); } message = "Balle : (" + xx + ", " + yy + ")"; drawEtiquette(message, width / 3, height - 5, CENTER, BOTTOM, policeStandard, balle); message = "Vitesse : v = (" + vxx + ", " + vyy + ") "; message += "|v| = " + int(vv) + " angle(v) = " + dd + "°"; drawEtiquette(message, width - 35, height - 5, RIGHT, BOTTOM, policeStandard, vitesse); } // ===== raz ===== Remise à Zéro void raz() { effacerTraces(); t = 0; // temps initial calculerPositionBalle(); } // ===== effacerTraces ===== oublier les traces void effacerTraces() { nombreDeTraces = 0; }