Exercice O1 / Un peu de géométrie
*O1.1 / ☆ Créez un objet
Point qui a comme attributs ses coordonnées
X et
Y, puis une
méthode permettant d'afficher l'objet.
Créez deux instances de cet objet et affichez-les.
Correction Remarque : [Afficher]
Pour créer la méthode d'affichage vous pouvez redéfinir la méthode __str__ qui est appelée via la fonction print( ).
*O1.2 / ☆ Créez une méthode qui test l'égalité entre l'instance point et un autre point. Testez cette fonctionnalité.
Correction Remarque - Méthode : [Afficher]
Pour
créer cette méthode vous pouvez surcharger, i.e. ici redéfinir
la méthode __eq__ qui est appelée via le test ==.
Remarque - Test : [Afficher]
Vous pouvez tester vos méthodes à l'aide de assert. Voici une syntaxe pour tester une égalité : assert A == B. Si l'égalité est fausse, une erreur est renvoyée.
*O1.3 / ★ Créez un objet
Segment qui a comme attributs ses
deux points aux extrémités (A et B pour le segment [AB]), puis :

- gérez l'affichage des instances,
- créez une méthode
Pcenter qui renvoie le centre du segment (i.e. le point C pour l'instance [AB]),
- créez une méthode
bisect qui renvoie les deux segments moitiés (i.e.[AC] et [CB] pour l'instance [AB]),
- créez une méthode qui test l'égalité entre deux segments.
Correction *O1.4 / ☆ Complétez la classe
Segment avec une méthode qui
calcule la longueur du segment.
Soient A = Point(1,5), B = Point(-5,3), C = Point(1,0), et D = Point(0.2,36).
Affichez la longueur des segments [AB], [BC] et [CD].
Correction Aide : [Afficher]
*O1.5 / ★ Modifiez la méthode bisect de la classe pour qu'elle puisse découper un segment en plusieurs segments (rajoutez un paramètre n, égal à 2 par défaut et correspondant au nombre de segments voulus). Correction
Aide : [Afficher]
*O1.6 / ★☆ Créez une méthode tri_equ qui à partir de l'instance segment renvoie deux segments qui forment un triangle équilatéral avec le segment. Correction
Aide : [Afficher]
A partir de l'image ci-contre, vous pouvez retrouver les formules suivantes :

*O1.7 / ★ Créez une fonction affiche qui prend en paramètre une liste L de segments et qui affiche les segments de la liste à l'aide de matplotlib.pyplot. Correction
*O1.8 / ★☆ Créez une fonction Koch qui affiche des flocons de Koch à l'aide des classes créées précédemment. Correction
Explication : Les flocons de Koch sont obtenus de la manière suivante :
- on crée un segment E,
- on le divise en trois segments,
- on crée un triangle équilatéral à partir du deuxième segment,
- on efface le segment correspondant à la base du triangle,
- on recommence cette procédure sur tous les segments existants, autant de fois qu'on le souhaite. (Soit n ce nombre figurant en paramètre de la fonction Koch)
Exercice O2 / Automates cellulaires

O2.1 / ★ Un plateau de jeu est un quadrillage de plusieurs cellules caractérisées par un état (vivant ou mort) et par leur positions (x,y) sur le plateau ci-contre.
Un plateau de jeu a une taille variable, mais quoi qu'il arrive la cellule en bas à gauche du tableau est celle de position (0,0).
Créez deux classes Board et Cell respectant ce contexte. Faites attention à bien ranger l'ensemble des cellules d'un plateau en attribut du plateau ! Correction
Aide : [Afficher]
Dans la classe Board, vous pouvez créer une méthode pour remplir l'attribut qui rassemble toutes les cellules du plateau.
O2.2 / ★ Pour chacune de ces classes, définissez la méthode __str__ (i.e. l'appel à la fonction print). Voici les exigences :
- print( ) pour une instance Board doit au moins afficher l'état de chacune des cellules de Board,
- print( ) pour une instance Cell doit afficher chacune de ses caractéristiques.
Un exemple a été mis ci-contre. Correction
O2.3 / ☆ Créez une méthode dans la classe Cell qui permet d'inverser son état, puis créez une méthode dans la classe Board qui prend en paramètre une liste de cellules et qui change l'état de chacune de ces cellules. Correction
O2.4 / ★ Voici les deux étapes de cette partie :
- Créez une méthode dans la classe Board qui prend en paramètre une cellule et qui renvoie la liste des cellules voisines à celle-ci.
- Créez une méthode plot dans la classe Board qui permet d'afficher dans un graphique les cellules vivantes. Correction
Voici par exemple l'affichage du plateau créé ainsi :
b = Board()
b.changeCells([[5,3],[4,4],[6,4],[4,5],[5,5],[6,5],[4,6],[6,6],[5,7]])
Il s'agit du motif de la floraison
.
O2.5 / ★ A l'aide des classes créées précédemment, implémentez le jeu de la vie en créant une méthode stepLife dans la classe Board qui réalise un incrément du jeu de la vie.
"À chaque étape, l'évolution d'une cellule est entièrement déterminée par l'état de ses huit voisines de la façon suivante :
- Une cellule morte possédant exactement trois voisines vivantes devient vivante (elle naît).
- Une cellule vivante possédant deux ou trois voisines vivantes le reste, sinon elle meurt." wikipédia
Pour plus de précisions voici un site assez claire à ce sujet :
cypris.frVous trouverez ci-contre ce que j'ai obtenu avec l'exemple de l'exercice précédent.
Correction
O2.6 / ★ A l'aide des classes créées précédemment, implémenté une variante du jeu de la vie (cf.exercice O2.5) en créant une méthode stepHighLife dans la classe Board qui réalise un incrément de HighLife.
Une cellule morte possédant exactement 3 ou 6 voisine vivante naît.
Une cellule vivante possédant deux ou trois voisines vivantes le reste, sinon meurt.
Cette variante ressemble énormément au jeu de la vie. Ce qui implique des fonctionnement quasiment identique pour de simple motifs tel que le réplicateur.
Vous trouverez ci-contre ce que j'ai obtenu avec le motif du réplicateur :
b = Board(xMax=30,yMax=30)
b.changeCells([[11,11],[11,12],[11,13],[12,14],[13,15],[14,15],[15,15],[15,14],[15,13],[14,12],[13,11],[12,11]])