Épreuve pratique NSI

Sujet n° 9 · Session 2026 · 1 heure

Estimer le temps d'une impression 3D

Des objets 3D décrits par leurs sommets et leurs faces, comme dans un fichier OBJ. Le candidat calcule des distances, repère les arêtes, estime un temps d'impression, puis comprend pourquoi un agrandissement laisse l'objet inchangé.

  • Programmation objet
  • Plusieurs modules
  • Distance euclidienne
  • Références et objets partagés
  • Débogage

Mise en situationSommets et faces

Le format OBJ décrit un objet 3D en listant ses sommets (des points de l'espace) et ses faces (les surfaces qui relient ces points). Dans ce sujet, on ne considère que des coordonnées entières, et l'unité est le millimètre.

Trois classes, chacune dans son propre module, représentent ces informations : Sommet (fichier Sommet.py) pour un point de coordonnées x, y, z ; Face (fichier Face.py) pour une face ; Objet3D (fichier Objet3D.py) pour un objet, défini par une liste de sommets et une liste de faces. Le fichier Imprimante3D.py décrit une imprimante.

Dans cette page, toutes les cellules partagent le même Python : les classes écrites dans un module sont directement utilisables dans les autres, sans import.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

Pour l'examinateur

Repère

Contrairement à ce qu'annonce l'énoncé, les faces ne stockent pas des indices mais les objets Sommet eux-mêmes (voir ajouter_face). C'est la clé de la question 4.

1

Question 1La distance entre deux sommets

On approche le volume d'un objet par celui d'un cube dont l'arête est la plus longue arête de l'objet. La longueur d'une arête est la distance entre ses deux sommets.

Écrire la méthode distance de la classe Sommet. Elle prend en paramètre un objet de type Sommet et renvoie la distance entre l'objet courant et l'objet de type Sommet passé en paramètre. On rappelle que la distance entre deux points A et B s'obtient par la formule :

AB = √( (xA − xB)² + (yA − yB)² + (zA − zB)² )

Pour calculer une racine carrée en Python, on peut utiliser la fonction sqrt du module math.

Appel professeur

À demander au candidat

  1. Quel est le rôle de self et de s dans distance ? Lequel est l'objet courant ?
  2. Pourquoi ** 0.5 donne-t-il une racine carrée ? Quelle autre écriture propose le module math ?
Point de vigilance

Le fichier Sommet.py fourni contient déjà la méthode distance : le candidat doit au moins la tester et l'expliquer.

Résultats attendus
s1.distance(s2)
5,0
2

Question 2Deux sommets adjacents

Pour obtenir l'arête la plus longue, on considère tous les couples de sommets formant une arête et on cherche le couple de plus grande longueur. Quand deux sommets sont les extrémités d'une arête d'une face, on dit qu'ils sont adjacents.

Écrire la méthode sommets_adjacents de la classe Objet3D qui prend en entrée deux sommets et renvoie True s'ils représentent une arête de l'objet 3D et False sinon. Attention, on considère que les arêtes ne sont pas ordonnées : sommets_adjacents(s1, s2) == sommets_adjacents(s2, s1). La méthode volume_cube_englobant de la classe utilise cette fonction pour estimer le volume d'un objet.

Appel professeur

À demander au candidat

  1. Comment parcourez-vous les côtés d'une face ? Comment traitez-vous le côté qui relie le dernier sommet au premier ?
  2. Pourquoi deux sommets opposés d'une face carrée ne sont-ils pas adjacents ?
  3. Comparez-vous les objets Sommet ou leurs coordonnées ? Quelle différence ?
Point de vigilance

Une arête relie deux sommets consécutifs d'une face, en comptant le côté qui ferme le polygone (dernier → premier). Les diagonales ne sont pas des arêtes.

Résultats attendus
Cube fourni, arête la plus longue
3,0
Volume du cube englobant
27,0 mm³
3

Question 3Le temps d'impression

La classe Imprimante3D contient deux attributs : remplissage, le taux de remplissage du plastique, flottant entre 0.0 et 1.0, et vitesse_extrusion, la vitesse d'impression, entier exprimé en mm³/s.

Écrire une méthode estimation_impression pour la classe Imprimante3D qui prend en paramètre un Objet3D et renvoie une estimation de son temps d'impression en secondes : calculer d'abord le volume d'impression de l'objet en multipliant le volume réel par le taux de remplissage, puis le temps d'impression en divisant ce volume par la vitesse d'extrusion.

Appel professeur

À demander au candidat

  1. Dans quel ordre faites-vous les deux calculs ? Les unités sont-elles cohérentes ?
  2. L'imprimante du fichier est créée avec Imprimante3D(20, 1.2). Ces valeurs respectent-elles la description des attributs ?
Point de vigilance

Le fichier crée l'imprimante avec un remplissage de 20 (au lieu d'un taux entre 0 et 1) et une vitesse de 1,2 (au lieu d'un entier) : le résultat affiché, 377 s, en découle.

Résultats attendus
Rhombicuboctaèdre, arête la plus longue
2√2 ≈ 2,83 mm
Estimation avec Imprimante3D(20, 1.2)
≈ 377,1 s
4

Question 4Un agrandissement sans effet

On souhaite agrandir ou rétrécir un objet 3D selon un rapport. La classe Objet3D dispose de la méthode transformer, qui transforme l'instance courante selon le rapport passé en paramètre. Elle se trouve dans la cellule de la classe, à la question 2.

Utilisez cette méthode pour doubler la dimension du cube présent dans Objet3D.py en l'affichant avant et après l'appel. Le cube n'apparaît pas deux fois plus grand : analyser le fonctionnement de la méthode transformer et proposer une correction.

Appel professeur

À demander au candidat

  1. Que contient face.sommets : des indices ou des objets ? Où le voit-on dans le code ?
  2. Après l'appel à transformer, que référencent les faces ? Et self.sommets ?
  3. Pourquoi modifier les sommets existants plutôt qu'en créer de nouveaux ?
Point de vigilance

transformer crée de nouveaux sommets, mais les faces gardent les anciens : l'affichage, qui parcourt les faces, ne change pas.

Résultats attendus
Cube agrandi, arête la plus longue
6,0

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans plusieurs fichiers. Chaque bouton rassemble les cellules d'un fichier, telles qu'elles sont à l'écran, à ouvrir dans votre éditeur habituel.

Chargement de Python…