Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2017-09-16 12:13:01 Pas d'intersection entre rectangles

Allanhelp
nouveau membre
Date d'inscription: 2017-09-16
Messages: 3

Pas d'intersection entre rectangles



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

 

#2 2017-09-17 10:53:03 Re : Pas d'intersection entre rectangles

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Pas d'intersection entre rectangles



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

 

#3 2017-09-17 23:10:58 Re : Pas d'intersection entre rectangles

Allanhelp
nouveau membre
Date d'inscription: 2017-09-16
Messages: 3

Re: Pas d'intersection entre rectangles



Bonjour, déjà merci beaucoup big_smile
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

 

#4 2017-09-18 10:03:13 Re : Pas d'intersection entre rectangles

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Pas d'intersection entre rectangles



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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024