Cours:Idees OOP

De troyesGEII
Révision datée du 6 mars 2019 à 11:43 par SergeMoutou (discussion | contributions) (Réponse à la question 1)
Aller à : navigation, rechercher

Introduction aux objets avec Processing

Programmation orientée-objet (version sympathique) peut être lue en guise de cours.

Exercice 1

Refaire les exemples développés dans la Playlist Youtube de Daniel Shiffman. On commencera par la classe Bubble développée dans le troisième cours.

Préparation à l'exercice suivant

Processing : Les Objets peut être consulté pour un rappel sur les objets. Nous allons continuer avec les tableaux ou listes.

Les listes (ou tableaux) vous propose des tableaux sur types simples (ou presque).

Pour aller plus loin, les listes d'objets sont abordées avec « Programmation orientée-objet (version sympathique) » en y cherchant la section Liste d'objets.

Array Objects montre une autre syntaxe pour les boucles for.

Exercice 2

1°) Transformer le code ci-dessous en une classe Processing pour utilisation.

Indications : on vous donne le code permettant un affichage d'un seul digit

int[] val={63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};

void segment() {
  beginShape();
  vertex(0,10);
  vertex(10,0);
  vertex(50,0);
  vertex(60,10);
  vertex(50,20);
  vertex(10,20);
 endShape(CLOSE); 
}

void affiche7segs(int val,int rouge,int vert, int bleu) {
  pushMatrix(); // on désire laisser le repère inchangé
  noStroke();
  translate(40,0);
  if ((val & 1) == 1) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment a
  translate(-10,70);
  if ((val & 64) == 64) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment g
  translate(-10,70);
  if ((val & 8) == 8) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment d
  translate(15,-53);
  rotate(radians(100));
  if ((val & 16) == 16) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment e
  translate(-70,0);
  if ((val & 32) == 32) fill(rouge,vert,bleu); else fill(200);
  segment(); // segtment f
  translate(-12,-68);
  if ((val & 2) == 2) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment b
  translate(72,0);
  if ((val & 4) == 4) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment c
  popMatrix(); // on récupère le repère initial
}

2°) Faire fonctionner la correction de l'exercice 1. Puis réaliser l'affichage du compteur binaire de la correction sur deux digits

3°) Réaliser un affichage de 4 digits destiné à afficher l'heure et les minutes d'un réveil.

4°) Modifier la classe pour pouvoir changer la taille de chaque digit (!!! ANNULE !!!)

5°) Réaliser une classe "HHMMClass" de 2x2 digits séparés par deux points.

Indication : voici le début de la classe. Il ne vous reste qu'à positionner les ':' et probablement être capable de positionner cet ensemble de digits si vous voulez un jour afficher l'heure courante et l'heure réveil.

class HHMMClass {
  int posX,posY;
  int hh_mm;
  Digit[] digits = new Digit[4];
  HHMMClass() {
    posX=posY=0;
    hh_mm = 0x2340;
    for(int i=0;i<4;i++)
      digits[i]=new Digit(100*i,50);
  }
  void affiche() {
    for(int i=0;i<4;i++) {
      digits[3-i].put(hh_mm >> (4*i) & 0xF);
      digits[3-i].affiche7segs(255,0,0);
    }
  }
  void incrementHHMM() {
      (hh_mm)++;
      if ((hh_mm & 0x000F) > 0x0009)
        hh_mm += 0x0006;
      if ((hh_mm & 0x00F0) > 0x0050)
        hh_mm += 0x00A0;
      if ((hh_mm & 0x0F00) > 0x0900)
        hh_mm += 0x0600;
      if ((hh_mm & 0xFF00) > 0x2300)
        hh_mm = 0x0000;
  }
  void decrementHHMM() {
      (hh_mm)--;
      if ((hh_mm & 0x000F) == 0x000F)
      hh_mm -= 0x0006;
      if ((hh_mm & 0x00F0) == 0x00F0)
      hh_mm -= 0x00A0;
      if ((hh_mm & 0x0F00) == 0x0F00)
      hh_mm -= 0x0600;
      if ((hh_mm & 0xFFFF) > 0x2359)
      hh_mm = 0x2359;
  }
}

Faire vos propres essais avant de passer à la question suivante. L'utilisation de cette classe nécessite l'utilisation de la classe digit avec laquelle elle possède un lien fort.

6°) Utiliser cette classe pour afficher l'heure courante. On utilisera

Le code d'une horloge à aiguilles est diponible sur Internet.


Réponse à la question 1 (Exercice 2)

Voici la définition de classe qui est un peu différente de celle présentée en cours.

 
class Digit {
   private int[] val={63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
   int nb1digit;
   int x,y;
   Digit(){
     nb1digit = val[0];
     x=0;y=0;
   }
   Digit(int nb){
     x=0;y=0;
     if (nb < 16)
       nb1digit = val[nb];
     else
       nb1digit=64; // affichage tiret en cas d'erreur
   }
   
   Digit(int xd, int yd){
     nb1digit = val[0];
     x=xd;y=yd;
   }
   
   void put(int nb) {
     if (nb < 16)
       nb1digit = val[nb];
     else
       nb1digit=64; // affichage tiret en cas d'erreur
   }

  private void segment() {
    beginShape();
    vertex(0,10);
    vertex(10,0);
    vertex(50,0);
    vertex(60,10);
    vertex(50,20);
    vertex(10,20);
   endShape(CLOSE); 
  }

void affiche7segs(int rouge,int vert, int bleu) {
  pushMatrix(); // on désire laisser le repère inchangé
  noStroke();
  translate(40+x,0+y);
  if ((nb1digit & 1) == 1) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment a
  translate(-10,70);
  if ((nb1digit & 64) == 64) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment g
  translate(-10,70);
  if ((nb1digit & 8) == 8) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment d
  translate(15,-53);
  rotate(radians(100));
  if ((nb1digit & 16) == 16) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment e
  translate(-70,0);
  if ((nb1digit & 32) == 32) fill(rouge,vert,bleu); else fill(200);
  segment(); // segtment f
  translate(-12,-68);
  if ((nb1digit & 2) == 2) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment b
  translate(72,0);
  if ((nb1digit & 4) == 4) fill(rouge,vert,bleu); else fill(200);
  segment(); // segment c
  popMatrix(); // on récupère le repère initial
}

}

Et voici maintenant un exemple de programme d'utilisation :

Digit digitpoids0;

void setup() {  
  digitpoids0 = new Digit(50,50);
  frameRate(1); 
  size(480, 400);
}

int i=0;

void draw() {  
  i = (++i %16);
  digitpoids0.put(i);
  digitpoids0.affiche7segs(255,0,0);
}

Réponse à la question 6 (Exercice 2)

Voici la nouvelle classe HHMMClass :

class HHMMClass {
  int posX,posY;
  int hh_mm;
  Digit[] digits = new Digit[4];
  HHMMClass() {
    posX=posY=0;
    hh_mm = 0x950;
    for(int i=0;i<4;i++) {
      if (i < 2)
        digits[i]=new Digit(100*i,50);
      else
        digits[i]=new Digit(100*(i+1),50);
    }
  }
  void affiche() {
    for(int i=0;i<4;i++) {
      digits[3-i].put(hh_mm >> (4*i) & 0xF);
      digits[3-i].affiche7segs(255,0,0);
    }
    if ((second() % 2) == 1)
      fill(255,0,0);
    else 
      fill(200);
      
    ellipse(260,100,20,20);
    ellipse(255,150,20,20);
  }
  
  void updateHHMM() {
    int temp;
    temp = hour();
    hh_mm = ((temp/10) << 12)+((temp%10)<<8);
    temp = minute();
    hh_mm += ((temp/10) << 4)+(temp%10);
  }
  void incrementHHMM() {
      (hh_mm)++;
      if ((hh_mm & 0x000F) > 0x0009)
        hh_mm += 0x0006;
      if ((hh_mm & 0x00F0) > 0x0050)
        hh_mm += 0x00A0;
      if ((hh_mm & 0x0F00) > 0x0900)
        hh_mm += 0x0600;
      if ((hh_mm & 0xFF00) > 0x2300)
        hh_mm = 0x0000;
  }
  void decrementHHMM() {
      (hh_mm)--;
      if ((hh_mm & 0x000F) == 0x000F)
      hh_mm -= 0x0006;
      if ((hh_mm & 0x00F0) == 0x00F0)
      hh_mm -= 0x00A0;
      if ((hh_mm & 0x0F00) == 0x0F00)
      hh_mm -= 0x0600;
      if ((hh_mm & 0xFFFF) > 0x2359)
      hh_mm = 0x2359;
  }
}

La classe Digit n'a pas changée.

Et voici maintenant le programme principal :

HHMMClass heureC;
void setup() {
  heureC = new HHMMClass();
  frameRate(10);
  size(520,400);
}

void draw() {
  heureC.updateHHMM();
  heureC.affiche();
}

Exercice3

Caractères matriciel et affichage LCD.

Voir aussi