Bonjour, voici un code qui affiche 15 rectangles avec intersection, j'aimerai savoir comment faire pour pouvoir générer des rectangles random sans intersections:
size(1000,1000); int x=0, y=0, l=0, h=0, nmbrect=0; background(0); while (nmbrect!=15) { x = (int)random(width); y = (int)random(height); l = (int)random(10,width/2); h = (int)random(10,height/2); if (x+l<width && y+h<height) { fill(color(random(255), random(255),random(255)); rect(x,y,l,h); nmbrect++; } }
Hors ligne
Bonjour,
Afin de vérifier si les rectangles ne se chevauchent, il faut stocker les coordonnées et tailles des différents rectangles pour vérifier à la création d'un nouveau rectangle, il n'y ai pas d'intersection avec les plus anciens.
Pour cela j'ai construit une classe qui fait cela.
Ensuite, à la création d'un nouveau rectangle, je vérifie qu'il ne crois pas un autre avec l'algorithme du croisement sur chaque axes.
Voici ma proposition :
ArrayList<rectangleIsole> rectangles; int nombreRectangles; void setup() { size(1000, 1000); rectangles = new ArrayList<rectangleIsole>(); nombreRectangles = 15; for (int i = 0; i < nombreRectangles; i++) { rectangles.add(new rectangleIsole(rectangles)); } } void draw() { background(0); for (rectangleIsole r : rectangles) { r.affichage(); } } class rectangleIsole { PVector position, taille; color couleur; rectangleIsole(ArrayList<rectangleIsole> raat) { boolean intersection; int x, y, l, h; do { intersection = false; x = (int)random(width); y = (int)random(height); l = (int)random(10, width/2); h = (int)random(10, height/2); for (rectangleIsole r : raat) { int maxGauche = max(x, (int)r.position.x); int minDroit = min(x + l, int(r.position.x + r.taille.x)); int maxBas = max(y, (int)r.position.y); int minHaut = min(y + h, int(r.position.y + r.taille.y)); if ((maxGauche <= minDroit) && (maxBas <= minHaut)) { intersection = true; } } } while (intersection); position = new PVector(x, y); taille = new PVector(l, h); couleur = color(random(255), random(255), random(255)); } void affichage() { fill(couleur); noStroke(); rect(position.x, position.y, taille.x, taille.y); } }
Si tu as des questions, n'hésite pas.
Hors ligne
Bonjour, déjà merci beaucoup
J'aimerai juste savoir comment, par exemple, éviter que 2 rectangles se touchent, sans utiliser de classe pour mieux comprendre.
J'aimerai aussi savoir si les rectangles reste dans la taille de la fenêtre graphique choisi, ou s'ils dépassent?
Hors ligne
Bonjour,
L'utilisation des classes est très pédagogique, dans Processing tout est classe.
Algorithme d'intersection de deux rectangles :
maxGauche = max(x1, x2);
minDroit = min(x1 + l1, x2 + l2);
maxBas = max(y1, y2);
minHaut = min(y1 + h1, y2 + h2);
intersection = (maxGauche <= minDroit) && (maxBas <= minHaut)
J'ai repris strictement ta proposition de placement des rectangles.
Pour savoir s'ils sont tous dans la fenêtre, il faut restreindre la largeur et la hauteur en fonction de la place disponible.
x = (int)random(width - 10); y = (int)random(height - 10); l = (int)random(10, min(width/2, width - x)); h = (int)random(10, min(height/2, height - y));
Dernière modification par Mushussu (2017-09-18 10:15:53)
Hors ligne
Pages: 1