Cours:Idees OOP : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m (Exercice 2)
m (Exercice 2)
Ligne 16 : Ligne 16 :
 
1°) Transformer le code ci-dessous en une classe Processing pour utilisation.
 
1°) Transformer le code ci-dessous en une classe Processing pour utilisation.
  
'''<u>Correction</u>''' :
+
'''<u>Indications</u>''' : on vous donne le code permettant un affichage d'un seul digit
<source lang=Java>
+
<source lang=c>
class Digit {
+
int[] val={63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
  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() {
+
void segment() {
    beginShape();
+
  beginShape();
    vertex(0,10);
+
  vertex(0,10);
    vertex(10,0);
+
  vertex(10,0);
    vertex(50,0);
+
  vertex(50,0);
    vertex(60,10);
+
  vertex(60,10);
    vertex(50,20);
+
  vertex(50,20);
    vertex(10,20);
+
  vertex(10,20);
  endShape(CLOSE);  
+
endShape(CLOSE);  
  }
+
}
  
void affiche7segs(int rouge,int vert, int bleu) {
+
void affiche7segs(int val,int rouge,int vert, int bleu) {
 
   pushMatrix(); // on désire laisser le repère inchangé
 
   pushMatrix(); // on désire laisser le repère inchangé
 
   noStroke();
 
   noStroke();
   translate(40+x,0+y);
+
   translate(40,0);
   if ((nb1digit & 1) == 1) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 1) == 1) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment a
 
   segment(); // segment a
 
   translate(-10,70);
 
   translate(-10,70);
   if ((nb1digit & 64) == 64) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 64) == 64) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment g
 
   segment(); // segment g
 
   translate(-10,70);
 
   translate(-10,70);
   if ((nb1digit & 8) == 8) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 8) == 8) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment d
 
   segment(); // segment d
 
   translate(15,-53);
 
   translate(15,-53);
 
   rotate(radians(100));
 
   rotate(radians(100));
   if ((nb1digit & 16) == 16) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 16) == 16) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment e
 
   segment(); // segment e
 
   translate(-70,0);
 
   translate(-70,0);
   if ((nb1digit & 32) == 32) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 32) == 32) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segtment f
 
   segment(); // segtment f
 
   translate(-12,-68);
 
   translate(-12,-68);
   if ((nb1digit & 2) == 2) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 2) == 2) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment b
 
   segment(); // segment b
 
   translate(72,0);
 
   translate(72,0);
   if ((nb1digit & 4) == 4) fill(rouge,vert,bleu); else fill(200);
+
   if ((val & 4) == 4) fill(rouge,vert,bleu); else fill(200);
 
   segment(); // segment c
 
   segment(); // segment c
 
   popMatrix(); // on récupère le repère initial
 
   popMatrix(); // on récupère le repère initial
}
 
 
 
}
 
}
 
</source>
 
</source>
Ligne 146 : Ligne 118 :
 
Le code [https://processing.org/examples/clock.html d'une horloge à aiguilles] est diponible sur Internet.
 
Le code [https://processing.org/examples/clock.html d'une horloge à aiguilles] est diponible sur Internet.
  
'''Indications''' : on vous donne le code permettant un affichage d'un seul digit
 
<source lang=c>
 
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
 
}
 
</source>
 
  
 
====Réponse à la question 1====
 
====Réponse à la question 1====

Version du 4 mars 2019 à 21:31

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

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);
}

Exercice3

Caractères matriciel et affichage LCD.

Voir aussi