voici une syntaxe pour la programmation des arrayList pour comparer tes virus.
for ( int i =0 ; i < cerclesArrayList.size() ; i++ ) {
CercleClass cercle_i = (CercleClass) cerclesArrayList.get(i);
for ( int j =i+1 ; j < cerclesArrayList.size() ; j++ ) {
CercleClass cercle_j = (CercleClass) cerclesArrayList.get(j);
float distance = dist(cercle_i.x,cercle_i.y,cercle_j.x,cercle_j.y);
if ( distance < (cercle_i.diametre + cercle_j.diametre)/2 ) {
cercle_i.couleur = color(255,0,0);
cercle_j.couleur = color(255,0,0);
}
}
}
Hors ligne
Le sujet des collisions à déjà été traité sur le forum :
http://codelab.fr/4540
http://codelab.fr/4505
Tu reconnaîtras certain protagonistes.
Hors ligne
Ah oui, je reconnais les intervenants
J'étudie le 1er code de fabrice54 et je me mets à étudier les autres cas.
Mon professeur de maths m'a dit qu'il pourrait m'aider à maitriser les équations différentielles, qui ne sont plus étudiées au lycée... Mais que sur la propagation, ça va être compliqué, et ce sera selon mes capacités.
Dernière modification par alexis51151 (2014-10-08 13:19:34)
Hors ligne
Bonjour.
Un code plus simple.
ArrayList<Balle> maBalle; int nbBalle=10; void setup() { size(500, 500); smooth(); maBalle = new ArrayList<Balle>(); for (int i=0; i<nbBalle; i++) { maBalle.add(new Balle()); } } void draw() { background(255); for(int i = 0; i < maBalle.size(); i++) { Balle b = maBalle.get(i); b.rebond(); b.deplacement(); } for(int i=0;i<maBalle.size();i++){ Balle pi=maBalle.get(i); for(int j=i+1;j<maBalle.size();j++){ Balle pj=maBalle.get(j); maBalle.get(i).collision(maBalle.get(j)); } } } void mousePressed(){ maBalle.add(new Balle()); } class Balle { PVector position; PVector deplacement; PVector diametre; color couleur; Balle() { position=new PVector(random(0,width),random(0,height)); deplacement=new PVector(random(-2,2),random(-2,2)); diametre=new PVector(30,30); couleur=color(random(0,255),random(0,255),random(0,255)); } void deplacement(){ position.add(deplacement); } void rebond() { //detection des murs if (position.x < 0 ||position. x >= width) { deplacement.x=deplacement.x*-1; } if (position.y < 0 ||position. y >= height) { deplacement.y=deplacement.y*-1; } } void collision(Balle j){ float distance=position.dist(j.position); if(distance<20){ print(distance," "); } else{ fill(255,0,255); } ellipse(position.x,position.y,diametre.x,diametre.y); } }
Hors ligne
J'ai réfléchis sur la contamination, et j'ai complétement compris l'idée de vérifier pour chaque "balle" au départ la distance vis-à-vis des autres avec 2 boucles, ça devrait donc être fait rapidement!
PS : J'ai commencé mon programme collision, j'ai un résultat intéressant, mais il y a une erreur. Je vais la rechercher et je vous montre les résultats.
Dernière modification par alexis51151 (2014-10-12 12:48:22)
Hors ligne
Tu verras dans le dernier programme que je t'ais fais parvenir il y a des erreurs.C'est au niveau de la syntaxe.Je pense que c'est quelque chose comme ça" maBalle.(get i).couleur=color(0,255,0)"ceci est pour le changement de couleur après collision.D'autre part la ligne " maBalle.get(i).collision(maBalle.get(j)); "dois être douteuse cette ligne permet de passer au sous_programme collision mais je n'en connais pas trop la syntaxe ;car je n'ais pas trouvez d'exemple de programme arrayList avec des vecteurs .
Hors ligne
J'ai réussi à faire ça, mais j'ai dû me tromper à un endroit...
void comparer() { for (int i=0; i < infected.size(); i++) { Infection ip = infected.get(i); for (int j=1; j < infected.size(); j++) { Infection je = infected.get(j); if (dist(ip.position.x,ip.position.y,je.position.x,je.position.y) < 20) { ip.couleur = color(255,0,0); } } } }
PS : L'arborescence de mon programme était ainsi : je prends un objet dans le tableau, je le compare à tous les autres objets présents dans le tableau, ainsi que leur distance. Si elle est inférieure à 20 (la moitié du cercle), et qu'il se touche donc, le deuxième objet (donc ici je) devient rouge.
Cependant, lorsque j'utilise l'objet je et que je veux lui donner la couleur rouge, ça ne fonctionne pas contrairement à "ip.couleur" donc j'ai laissé celui-là.
Je pense que mon erreur se situe au niveau du fait que je le fais avec chacun des objets. Donc, si un a déjà été traité, il se retrouve traité une fois encore, ce qui fait qu'à la fin, je me retrouve avec un unique point blanc qui devient rouge en contact avec un autre rouge.
Je pense que la solution serait d'utiliser la fonction que fabrice m'a mis dans l'autre exemple, mais était parti sur cette méthode, j'aurais souhaité l'optimiser ainsi.
Peut-être dois-je réguler la comparaison ?
(le void comparer a bien été placé dans draw).
Dernière modification par alexis51151 (2014-10-13 15:56:45)
Hors ligne
C'est bien tu avances.
Pour optimiser ton code et pour éviter les redondances, la deuxième boucle, il faut la faire partir de i + 1. Tout ceux d'avant ont déjà été traités.
De plus, comme tu utilises des PVector pour les positions, il est préférables d'utiliser les méthodes de cette classe. Il y'a la méthode PVector.dist() qui donne la distance entre deux vecteurs.
Pour les collisions, on peut introduire une variable booléenne dans la classe. Si il y a collision alors elle devient vraie.
La gestion de la couleur ne vient qu'au moment de l'affichage avec le choix de la couleur de remplissage.
Il faut bien par contre la remettre à false avant le nouveau tour de la boucle principale.
void comparer() { for (int i = 0; i < infected.size () - 1; i++) { Infection ip = infected.get(i); for (int j = i + 1; j < infected.size (); j++) { Infection je = infected.get(j); if (PVector.dist(ip.position, je.position) < 20) { ip.bing = true; je.bing = true; } } } } class Balle { boolean bing; Balle() { bing = false; } void afficher() { if (bing) { fill(255, 0, 0); } else { fill(couleur); } ellipse(position.x, position.y, 2 * rayon, 2 * rayon); bing = false; } }
Dernière modification par Mushussu (2014-10-14 09:23:21)
Hors ligne
Boonjour.
Je viens de voir les corrections que Mushussu a apportez à ton programme ;maintenant tous devrais fonctionner parfaitement bien.Comme tu utilise les vecteurs c'est cette ligne qu'il faut écrire pour calculer la distance entre deux vecteurs" if (PVector.dist(ip.position, je.position.x) < 20) {"c'est celle là que je ne savais pas comment en écrire la syntaxe merci à Mushussu.
Hors ligne
Re.
Je te fais parvenir une version qui fonctionne dont tu pourras t'inspirer avec les corrections apportées par Mushussu.
Par contre j'ai fais une petite modif sur la ligne dont j'ai parlez précédemment ((PVector.dist(ip.position, je.position.x) < 20) ) car je n'ai pas pu faire fonctionner cette ligne; en me basant sur cet exemple j'ai écris"float distance=pi.position.dist(pj.position);"ceci a l'air de fonctionner correctement.
ArrayList<Balle> maBalle; int nbBalle=10; void setup() { size(500, 500); smooth(); maBalle = new ArrayList<Balle>(); for (int i=0; i<nbBalle; i++) { maBalle.add(new Balle()); } } void draw() { background(255); for(int i = 0; i < maBalle.size(); i++) { Balle b = maBalle.get(i); b.rebond(); b.deplacement(); b.comparer(); b.display(); } } void mousePressed(){ maBalle.add(new Balle()); } class Balle { PVector position; PVector deplacement; PVector diametre; color couleur; boolean bing; Balle() { position=new PVector(random(0,width),random(0,height)); deplacement=new PVector(random(-2,2),random(-3,3)); diametre=new PVector(30,30); couleur=color(0); bing=false; } void deplacement(){ position.add(deplacement); } void rebond() { //detection des murs if (position.x < 0 ||position. x >= width) { deplacement.x=deplacement.x*-1; } if (position.y < 0 ||position. y >= height) { deplacement.y=deplacement.y*-1; } } void comparer(){ for(int i=0;i<maBalle.size();i++){ Balle pi=maBalle.get(i); for(int j=i+1;j<maBalle.size();j++){ Balle pj=maBalle.get(j); float distance=pi.position.dist(pj.position); if(distance<20){ pi.bing=true; pj.bing=true; } } } } void display(){ if (bing) { fill(255, 0, 0); } else { fill(couleur); } ellipse(position.x,position.y,diametre.x,diametre.y); } }
Hors ligne
J'avais fait une petite erreur d'inattention comme le code n'était pas complet :
if (PVector.dist(ip.position, je.position) < 20) {
Hors ligne
Bonjour .
j'avais fini par trouver le petit problème;mais j'avais déjà écris la ligne;car pour trouver la syntaxe c’était pas simple,je voulais mettre des get() partout ;c'est quant j'ai vu ton exemple que j'ai compris qu'il fallait mettre ip et je.Bien que j'avais écris des lignes comme celle-ci"maBalle.get(i).collision(maBalle.get(j)); "dans la sous programme collision j'obtenais bien une distance entre deux balles;mais pour les croisements cela ne fonctionnait pas.Merci pour les corrections.
Hors ligne
J'ai utilisé un boolean comme recommandé, mais je n'ai pas encore le résultat escompté. Je vais travailler sur un code pour que la balle devienne rouge uniquement si celle qui la touche est rouge. Je vous tiens au courant.
Hors ligne
D'accord, je comprend la contagion, dans ce que je proposais, c'était pour indiquer une collision. Tu peux créer une variable booléenne contamine :
boolean contamine;
Quand une boule "heurte" une autre si elle est contaminée alors elle devient contaminée.
Hors ligne
Oui, j'avais justement rajouté une booléenne sur le modèle de bing avec cet effet, reste à faire une syntaxe viable.
Je vais m'y atteler.
Hors ligne