Annonce

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


#1 2014-03-08 07:07:34 détection obstacle

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

détection obstacle



Bonjour.

Comment dois-je faire pour détecter un obstacle dans le programme suivant.

Merci.

Code (P5) :

PVector deplacement,position,mur,obstacle;

void setup(){
  size(500,500);
  deplacement=new PVector(-2,3);
  position=new PVector(random(0,500),random(0,500));
 mur=new PVector(random(10,480),random(10,480));
 obstacle=new PVector(random(10,120),random(20,200));
}
void draw(){
   background(255);
   collision_mur();
   collision_obstacle();
     mouvement();
    display();
  
 
   
}
void collision_mur(){
  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_obstacle(){
 
  
}
    
void mouvement(){
 position.add(deplacement);  
}
 void display(){
  fill(255,0,0);
   rect(mur.x,mur.y,obstacle.x,obstacle.y);
     fill(0,255,0);
   ellipse(position.x,position.y,20,20);
}

Hors ligne

 

#2 2014-03-08 08:56:17 Re : détection obstacle

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

Re: détection obstacle



Voilà une piste, mais l'utilisation de classe faciliterais la vision de la programmation :

PVector deplacement, position, positionPrecedente, mur, obstacle;  
color c;

void setup() {  
  size(500, 500);  
  deplacement=new PVector(-2, 3);  
  position=new PVector(random(0, 500), random(0, 500)); 
  positionPrecedente = new PVector(position.x, position.y); 
  mur=new PVector(random(10, 480), random(10, 480));  
  obstacle=new PVector(200, 100);
}  
void draw() {  
  background(255);  
  mur.x = mouseX;
  mur.y = mouseY;
  collision_mur();  
  collision_obstacle();  
  mouvement();  
  display();
}  
void collision_mur() {  
  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_obstacle() {
  c = color(255, 0, 0);
  if ((position.x > mur.x) && (position.x < mur.x + obstacle.x) && (position.y > mur.y) && (position.y < mur.y + obstacle.y)) {
    c = color(225);
    if ((positionPrecedente.x > mur.x) && (positionPrecedente.x < mur.x + obstacle.x)) {
      deplacement.y *= -1;
    } 
    else {
      deplacement.x *= -1;
    }
  }
}  

void mouvement() {
  positionPrecedente = position.get();
  position.add(deplacement);
}  

void display() {  
  fill(c);  
  rect(mur.x, mur.y, obstacle.x, obstacle.y);  
  fill(0, 255, 0);  
  ellipse(position.x, position.y, 20, 20);
}

Hors ligne

 

#3 2014-03-09 06:34:32 Re : détection obstacle

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: détection obstacle



bonjour.

Je te remercie pour ton programme,mais je ne comprends pas à quoi sert exactement positionprécédende?.

Merci.

Hors ligne

 

#4 2014-03-09 08:32:38 Re : détection obstacle

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

Re: détection obstacle



Avec uniquement la variable position, nous ne pouvons tester que la présence de l'objet dans le mur. Il nous manque la précision de la face du mur qui est touchée.
Pour cela, nous introduisons la variable positionPrecedente qui va nous donner la direction du déplacement.

Le test est très simple, si la position précédente est dans la bande verticale définie par les côtés gauche et droit du mur. Alors la face franchie est soit celle du haut soit celle du bas, donc c'est le deplacement.y qui est modifié.
Sinon, c'est deplacement.x.

Elle est superflue, mais permet une meilleure lisibilité, nous pourrions écrire cela :

PVector deplacement, position, mur, obstacle;  
color c;

void setup() {  
  size(500, 500);  
  deplacement=new PVector(-2, 3);  
  position=new PVector(random(0, 500), random(0, 500)); 
  mur=new PVector(random(10, 480), random(10, 480));  
  obstacle=new PVector(200, 100);
}  
void draw() {  
  background(255);  
  mur.x = mouseX;
  mur.y = mouseY;
  collision_mur();  
  collision_obstacle(); 
  mouvement();   
  display();
}  
void collision_mur() {  
  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_obstacle() {
  c = color(255, 0, 0);
  if ((position.x > mur.x) && (position.x < mur.x + obstacle.x) && (position.y > mur.y) && (position.y < mur.y + obstacle.y)) {
    c = color(225);
    if (((position.x - deplacement.x)> mur.x) && ((position.x - deplacement.x)< mur.x + obstacle.x)) {
      deplacement.y *= -1;
    } 
    else {
      deplacement.x *= -1;
    }
  }
}  

void mouvement() {
  position.add(deplacement);
}  

void display() {  
  fill(c);  
  rect(mur.x, mur.y, obstacle.x, obstacle.y);  
  fill(0, 255, 0);  
  ellipse(position.x, position.y, 20, 20);
}

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025