Vous êtes sur la page 1sur 8

Informatique tronc commun – ITC1

Graphisme en Python - Application à


la matérialisation de terrains de
Informatique – 2 h
TP7 – ITC1 (synthèse) football et de tennis

Objet de l’étude et perspectives


Dans un travail de synthèse pour clôturer la première partie de l’ITC, nous allons appliquer les
notions de graphisme en langage Python au tracé du contour de terrains de football et de tennis dans
le but, à terme, d’y suivre la trajectoire du ballon ou de la balle. Pour y parvenir, nous allons d’abord
créer le tracé du terrain de football avec le module turtle, puis évoluer avec matplotlib.
L’étude évolue ensuite avec l’ajout des buts et se prolonge en gérant la position du ballon dans
l’espace proche du terrain dans les trois dimensions d’espace. La gestion de la sortie du ballon en
dehors du terrain est alors traitée. Pour aller plus loin, ceux qui le souhaitent pourraient s’intéresser à
l’évolution des traitements pour compléter le marquage minimal des contours par les lignes d’un terrain
réel et y gérer des trajectoires de ballons (comme dans l’exemple de tirs balistiques).
Pour ajouter des contraintes, ces activités peuvent être reprises avec un terrain de tennis en gérant
la présence du filet et la contrainte que cela impose aux trajectoires interrompues par la rencontre de
cet obstacle.

Outils utilisés
• De quoi prendre des notes personnelles : voir les détails dans les sections suivantes.
• Un ordinateur personnel (de bureau) disponible au lycée où à la maison.
• L’environnement de programmation EduPython.

Organisation
• Penser à prendre des notes personnelles en tenant compte des indications suivantes…
• Conserver une copie des documents fournis pour ce TP (via Moodle) et des documents
numériques qui auront été produits durant la séance (fichiers personnels, scripts, etc.).
• Conserver les notes informatiques produites (éditeur, documents textes, documents graphiques,
etc.), en les enregistrant, soit dans un dossier de votre espace de stockage personnel (souvent
c’est le lecteur H) associé à votre compte utilisateur au lycée (dénommé « compte Kwartz »), soit
sur la zone de stockage des documents personnels de votre espace Moodle.
• Gardez aussi toutes ses productions sur une clef de stockage (ou sur un espace de stockage en
ligne fiable) pour un travail personnel hors séance ou en cas d’impossibilité d’accéder aux
données du serveur. Cette pratique de la sauvegarde de données est très importante.
• Poursuivre les travaux en dehors de la séance en travaillant à son rythme.

Compte rendu
Garder l’ensemble de vos notes manuscrites avec le sujet du TD/TP même si un compte rendu de
vos travaux n’est pas demandé : remarques personnelles et apports présentés au tableau pour des
usages ultérieurs ou dans d’autres domaines d’application.

Documents de référence ou complémentaires


n Se référer au diaporama de cours sur le graphisme et aux notes prises à cette occasion.
n Utiliser les sites de référence https://matplotlib.org (et utiliser les aide-mémoire
https://matplotlib.org/cheatsheets/ à conserver avec ses documents de référence) et
https://docs.python.org/3/library/turtle.html.
n Des informations complémentaires sont données dans le texte du sujet.V2024.38
I. Présentation
A l’aide des ressources graphiques du langage Python, nous allons préparer le contour d’un terrain
de football qui sera ensuite complété les cadres des buts. C’est donc une représentation en trois
dimensions (3D) qui est à établir. Pour effectuer les tracés, la zone proche des terrains est matérialisée
par un parallélépipède appelé « boite ». Les dimensions de cette boite seront obtenues en s’écartant de
20% environ des dimensions considérées dans chaque direction.
Les points dans le repère de représentation des terrains ont pour coordonnées (", $, %). L’abscisse
" est toujours suivant la plus grande dimension du terrain, la longueur notée '. L’ordonnée $
correspond à une évolution suivant la largeur notée ( et % est l’altitude.

II. Mise en œuvre progressive du terrain


Le terrain est un rectangle ' × ( dont les valeurs sont à affecter dans la partie « paramétrage » de
son script situé juste au-dessous de la zone des fonctions (toujours placée en tête de script à la suite
des lignes d’importation des modules). Pour tracer un contour, la fonction Python rectangleT()
utilisant le module turtle est à créer en se basant sur sa entête prototype est le suivant :
def rectangleT(P:tuple of float, L, l:float):
où P est un couple représentant le coin inférieur gauche du rectangle, L et l sa longueur et sa
largeur, en mètres.

Q.1 Rédiger un script de la fonction rectangleT() et la mettre en œuvre pour un terrain de


football uniquement en considérant les dimensions suivantes : '! = 100 m et (! = 64 m (afin
de distinguer les terrains, l’indice 1 est choisi pour le football et 2 pour le tennis).

Pour mettre en œuvre complètement le tracé, nous devons accéder à une description en 3D, mais
le module turtle ne le permet pas : c’est limité à des tracés 2D. Il est donc nécessaire d’utiliser des
fonctions plus adaptées disponibles avec matplotlib.

Q.2 Rédiger de manière préliminaire un nouveau script en 2D de la fonction rectangleM() en


utilisant matplotlib dans le contexte de la question Q.1.
Remarque : il est conseillé de tracer au brouillon une esquisse du rectangle pour bien établir
la succession des coordonnées permettant de tracer le contour. Pour information, le terme
général pour dénommer une telle ligne est « polyligne » .
Tester cette fonction à partir d’un point à fixer soi-même en assurant la présence de l’origine
du repère sur le tracé. La boîte sera définie en considérant un bord de 20% supérieur aux
dimensions du terrain. Le coefficient de bords sera défini par : bordCoeff = .2.
Remarque : utiliser les fonctions xlim() , ylim(). Consulter la documentation en ligne.

Nous allons maintenant utiliser des ressources plus avancées de matplotlib pour travailler en
3D. Jusqu’à maintenant, c’est le mode impératif qui a été utilisé pour les tracés : plot() le tracé, puis
les enrichissements (grid, title, xlim, legend, etc) et show() pour faire apparaitre le résultat.
Il est même possible de sauvegarder ses tracés avec la fonction savefig('graphique.png').
Nous allons maintenant utiliser le mode orienté « objet » qui consiste à créer un objet graphique
Python qui est séparé en deux parties :
1. la figure correspond à une unité de visualisation. Une figure peut être ouverte dans une
fenêtre avec fig.show() ou enregistrée dans un fichier avec fig.savefig() ;
2. le système d’axes correspond à une unité d'information ; il est formé d’un repère, d’une
origine et affiche des éléments en fonction de coordonnées pour les graphiques
« classiques ».
Un exemple est donné ci-après.

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 3 / 8 – TP
1 fig = plt.figure()
2 ax = fig.add_subplot()
3 ax.plot([2, 3, 0, 7])
4 ax.grid()
5 ax.set_title("C'est un essai pour voir…")

La première ligne créé l’objet graphique fig avec la fonction figure(). Ceci déclare un
conteneur graphique duquel est extrait le système d’axes ax avec add_subplot(). Puis le tracé est
complété avec plot() qui agit sur ax et un quadrillage est ajouté à ax avec grid(). Enfin un titre
avec set_title() qui remplace la fonction avec title(). En général, cette syntaxe set_xxx où
xxx est le nom de la fonction est d’usage avec les usages orientés objet. Pour terminer, l’instruction
show() n’est plus présente.
C’est de cette manière que nous allons maintenant gérer les tracés graphiques.

La fonction de création d’un rectangle va être adaptée en plongeant le tracé dans un espace 3D.
Cette fonction sera nommée rectangle(). P est alors un triplet ("" , $" , %" ).

Q.3 En s’inspirant des acquis précédents, rédiger un script permettant le tracé du terrain de football
dans le plan % = %" = 0 à l’aide de la fonction plotPlayGround() sans argument.
L’origine du repère sera toujours : ("" , $" , %" ) = (0, 0, 0) et la boîte de tracé sera aussi
générée. Pour commencer, initialiser le graphique avec cette ligne :
ax = plt.figure(figsize=(8, 8),
layout='constrained').add_subplot(projection='3d') # Sur 1 ligne
Remarque : utiliser maintenant les fonctions set_xlim, set_ylim et set_zlim.
Tester ce script, puis, pour ceux qui sont les plus avancés, ajuster les couleurs des tracés.
Compléter la construction avec un rectangle situé à l’altitude maximale paramétrable hmax
(20 m) en s’assurant de toujours laisser apparaître l’origine sur le tracé.

III. Simulation du ballon par un point


Pour envisager d’étudier les mouvements du ballon, nous allons le matérialiser par un point placé
dans la boîte du tracé.

Q.4 Rédiger une ligne de script qui permet d’afficher le ballon au point 3("# , $# , %# ) avec des
coordonnées choisies de manière à éprouver le tracé par plusieurs essais quand le point est
dans la boite ou pas. Le ballon sera marqué par un cercle coloré en rouge : directive de
plot() :'ro' (Cf. annexe).

Q.5 Compléter le script précédent pour afficher la ligne de projection du point du ballon dans le
plan % = 0 en traits interrompus bleus : directives de plot() :'--b' (Cf. annexe).

Nous allons maintenant mettre en œuvre une procédure permettant de contrôler si le ballon est
dans la zone de jeu, c’est-à-dire dans le cylindre à base rectangulaire délimité par le rectangle du
terrain et de hauteur hmax déjà affectée.
Pour effectuer ce contrôle, nous allons créer la fonction dont l’entête prototype est le suivant :
def isInPlayGround(x, y, z:float) -> bool:
où x, y et z sont les coordonnées du point (le ballon) et qui renvoie la valeur de vérité suivant
que le ballon est dans le cylindre précédent ou pas.

Q.6 Rédiger un script de la fonction isInPlayGround() en utilisant les paramètres du terrain


contenus dans des variables globales de même nom : Lf, lf, hmax et bordCoeff. Pour
rappel, la valeur minimale de z est zéro. Écrire d’abord les inégalités liant paramètres et
cordonnées avant de coder les conditions correspondantes.
Mettre en œuvre cette fonction pour quelques points d’essais dans et hors de la zone valide.

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 4 / 8 – TP
Ces tests manuels peuvent paraître un peu lourds et fastidieux. Nous allons donc automatiser cela.
Nous allons générer des points de coordonnées aléatoires (x, y, z) pris dans la boîte avec la
fonction pointGen(), puis appliquer ce triplet à isInPlayGround(). En fonction du résultat, le point
« ballon » sera dessiné en vert s’il est dans la zone du jeu et en rouge s’il n’y est pas.

Q.7 Rédiger un script de la fonction pointGen() dont l’entête prototype est le suivant :
def pointGen() -> tuple of 3 float:
où tuple est un triplet représentant les coordonnées du point généré. Les points générés devront
être situés dans la boîte de travail.
Mettre en œuvre cette fonction pour générer quelques points d’essais dans et hors de la zone
valide.

Q.8 Dans le corps du programme (hors zone de fonction car il n’y en a aucune à construire),
rédiger une portion de script permettant de générer une cinquantaine de points aléatoires et de
les placer sur le graphe en utilisant la méthode précédente, mais dans la couleur de leur
statut : en vert si le point est dans la zone du jeu et en rouge sinon.

IV. Des pistes « pour aller plus loin »


En fonction des affinités et des goûts de chacun, des pistes pour prolonger l’étude sont proposées.
1. Ajouter le marquage des lignes de séparation intérieures en utilisant la Figure 1.
90-120m

16 ,5m

Surface de
réparation

5, 5m

But
7, 3m x 2,4m

11 m 9, 15m 40 ,3m
9, 15m
Point de
Penalty
45-90m
5, 5m

11 m

1m

Figure 1 – Terrain de Football et dimensions.


2. Dessiner les buts (fonction plotGoal()) en cherchant les dimension sur le web.
3. Tracer la trajectoire du ballon, d’abord rectiligne, puis issue de l’équation d’un tir balistique
comme ceux étudiés en physique du point. Vérifier alors la portée maximale quand
l’inclinaison du tir est de 45°.

Reprendre enfin toute cette étude pour tracer un terrain de tennis, y placer un filet, générer des
points représentant des balles et générer des trajectoires pour lesquelles :
• les points d’impact des balles sur le sol sont matérialisées par une couleur ;
• les points d’impact des balles sur le filet sont matérialisées par une autre couleur ;
• etc., suivant les goûts et les idées.

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 5 / 8 – TP
Guide des tracés obtenus (ou à obtenir)
Tracés obtenus

Question Q.1 Question Q.2


Question Q.1 Question Q.2

Question Q.3 Question Q.4, étape 1


Question Q.3 Question Q.4, étape 1

Question Q.4, autre étape Question Q.5, autre étape (buts ajoutés)
Question Q.4, autre étape Question Q.5, autre étape (buts ajoutés)

Question Q.8, dernière étape

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 6 / 8 – TP
Annexe
Éléments de graphisme en Python
Extrait de la documentation de matplotlib.pyplot
— Avec quelques exemples illustratifs —

Des extraits de la documentation du module pyplot de la bibliothèque matplotlib dédiée aux


tracés et à la mise en forme de graphiques sont présentés dans ce document.
Les préfixes de module ne sont pas indiqués.

Importer le module matplotlib.pyplot


Pour charge le module en mémoire, deux modes d’importation sont proposés :
import matplotlib.pyplot as plt # Première méthode
from matplotlib import pyplot as plt # Seconde méthode

L’alias plt remplace le préfixe matplotlib.pyplot nécessaire à chaque appel de fonction.

Fonction plot (généralités)


plt.plot(*args, **kwargs) # Extrait générique de la documentation

Cette fonction permet de tracer des lignes entre deux points et/ou des marqueurs sur les points. Ils
peuvent être placés dans deux listes x et y de même taille qui sont des arguments la fonction (un dans
l’énumération *args des arguments en nombre quelconque, séparés par des virgules comme le veut
la syntaxe Python). Chaque point a pour coordonnées x[i] et y[i] où i est l’indice du point dans la
liste. Voici quelques exemple :
>>> plot(x, y) # plot x and y using default line style and color
>>> plot(x, y, 'bo') # plot x and y using blue circle markers
>>> plot(y) # plot y using x as index array 0..N-1
>>> plot(y, 'r+') # ditto, but with red plusses

Un certain nombre de groupes de formatage (fmt) de x, y peut être précisé comme dans cet exemple :
a.plot(x1, y1, 'g^', x2, y2, 'g-')

Les différentes possibilités apparaissent à la dernière page de l’annexe (au dos).

Fonctions supplémentaires courantes pour la mise en forme du tracé


En plus de la fonction plot, le module matplotlib.pyplot propose diverses fonctions dédiées
à la mise en forme des graphiques. En voici quelques-unes :
• xlabel(s) : écrit le contenu de la chaîne s comme étiquette des abscisses ;
• ylabel(s) : écrit le contenu de la chaîne s comme étiquette des ordonnées;
• title(s) : écrit le contenu de la chaîne s comme titre du graphique ;
• legend(L) : donne une légende au graphique.
• L doit être une liste de chaînes : L[0] est la légende de la première courbe, L[1] de la
deuxième, etc.
• grid() : ajoute un quadrillage au graphique.

Affichage du graphique
Les graphiques utilisent la fonction plot() pour préparer le tracé, après quoi il est nécessaire de le
concrétiser en le déclenchant grâce à la fonction show() utilisée sans argument (Voir exemples).

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 7 / 8 – TP
Exemples : script à gauche, résultat à droite
import matplotlib.pyplot as plt

plt.plot([1, 4, 3, 5])
plt.ylabel('des nombres')
plt.show()

import matplotlib.pyplot as plt


plt.plot([1, 4, 3, 5])
plt.ylabel('des nombres')
plt.grid() # ou plt.grid(True)
plt.title('Et avec un titre')
plt.text(1.5,2, 'Texte en superposition'
, color='blue', fontsize=18)
plt.show()

import matplotlib.pyplot as plt


x = [i for i in range(10)]
y = [2*j*(10-j) for j in range(10)]
plt.plot(x, y)
plt.plot(x, y, 'bo') # blue circle markers
plt.plot(y) # plot y using x as
# index array 0..N-1
plt.show()

Définitions graphiques orientées objet


Dans une définition orientée « objet » un objet graphique Python séparé en deux parties est créé :
1. la figure correspond à une unité de visualisation. Une figure peut être ouverte dans une
fenêtre avec fig.show() ou enregistrée dans un fichier avec fig.savefig() ;
2. le système d’axes correspond à une unité d'information ; il est formé d’un repère, d’une
origine et affiche des éléments en fonction de coordonnées pour les graphiques
« classiques ».
Pour gérer les tracés, il est nécessaire d’appliquer des fonctions à la figure (fig) ou au repère,
souvent noté ax.
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot()
ax.plot([2, 3, 0, 7])
ax.grid()
ax.set_title("Définition objet")

CC Graphisme en Python - Application à la matérialisation de terrains de football et de tennis (2024ITC1_TP07_Terrains_FootballTennis.docx)


BY NC SA © YC – février 24 – V2024.2 8 / 8 – TP

Vous aimerez peut-être aussi