← Tous les projets

Science

Topologie 3D

Maillages dans un viewer 3D et analyse topologique.

Terminé Sprint S4-S5+S36-S41+S43 · 36 points
En bref, sans jargon pour les non-informaticiensLire le résuméRefermer
Ce que c'est
Un outil qui analyse la forme d'objets en 3D (un anneau, une sphère, un ruban de Möbius) : combien ils ont de trous, où ils sont courbés, comment leur forme se construit quand on les remplit du bas vers le haut.
À quoi ça sert
Ces mesures servent en imagerie médicale, en simulation et en conception industrielle, pour comparer et contrôler des formes.
Ce que ça montre
Mon cœur de métier, en tant que docteur en informatique graphique : des mathématiques exigeantes traduites en un outil rapide et vérifié, qu'on manipule à la souris.

Sujet de ma thèse

Code source

Comment les morceaux tiennent ensemble

Schéma : lib-c → Topologie (maillage lu) ; Topologie → API C (invariants, courbure) ; API C → WebAssembly ; WebAssembly → Visionneuse ; API C → API Python (bibliothèque partagée). maillage lu invariants, courbure bibliothèque partagée lib-c lecture OBJ, PLY, STL Topologie C++20, demi-arêtes API C une seule interface WebAssembly Emscripten Visionneuse three.js, sur la fiche API Python FastAPI, ctypes

Faire tourner un maillage

La couleur montre la courbure de Gauss en chaque sommet. Invariants et courbure sont calculés par le code C++ du projet, compilé en WebAssembly, dans votre navigateur.

Exemples :

Coloration

Glisser pour tourner, molette ou pincement pour zoomer ; survoler un point pour lire sa courbure. Le repère en bas à gauche suit la caméra : x en rouge, y en vert, z en bleu.

Au bord, le défaut angulaire mesure la courbure du bord lui-même : les sommets du bord prennent la couleur de leurs voisins intérieurs.

Temps de calcul

Mesuré sur un tore debout, meilleur de 3 passages, sur un seul fil d’un Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz : en natif (C++ compilé en Release par GCC) et en WebAssembly (le même code, dans Node, comme dans la page). Produit par projects/topologie/scripts/bench.mjs.

TrianglesFichier OBJLecture (Wasm)HauteurPersistanceGraphe de ReebPersistance étendue
10 0000,3 Mo24 ms2 ms natif · 2 ms Wasm8 ms natif · 10 ms Wasm5 ms natif · 6 ms Wasm15 ms natif · 17 ms Wasm
30 0001,0 Mo75 ms5 ms natif · 6 ms Wasm26 ms natif · 37 ms Wasm14 ms natif · 19 ms Wasm57 ms natif · 60 ms Wasm
100 0003,5 Mo251 ms24 ms natif · 24 ms Wasm116 ms natif · 174 ms Wasm56 ms natif · 68 ms Wasm231 ms natif · 248 ms Wasm
300 00010,8 Mo788 ms76 ms natif · 76 ms Wasm502 ms natif · 736 ms Wasm178 ms natif · 204 ms Wasm945 ms natif · 968 ms Wasm
1 000 00037,6 Mo2,72 s281 ms natif · 280 ms Wasm2,38 s natif · refusé par la page648 ms natif · refusé par la page4,32 s natif · refusé par la page

Et un GPU ? Il accélérerait ce qui se fait sommet par sommet ou triangle par triangle, sans dépendance : la hauteur (un produit scalaire par sommet), le tri des sommets (tri parallèle), le lien inférieur de chaque sommet, et la persistance H0 par fusions en parallèle. La réduction de la matrice de bord, elle, traite les colonnes l’une après l’autre (chacune dépend des précédentes), et le graphe de Reeb repose, comme la persistance H0, sur des union-find aux accès imprévisibles : un GPU y passerait son temps à se synchroniser. Or la persistance domine (2,38 s pour un million de triangles en natif) et c’est elle qui s’y prête le moins : pas de version GPU (D49).

Pourquoi 32 Mo ? Avant tout calcul, lire un OBJ de 37,6 Mo (un million de triangles) prend 2,72 s en WebAssembly, sur le fil de la page, qui reste figée pendant ce temps ; la mémoire WebAssembly monte vers 190 Mo (750 Mo pour 4 millions de triangles), plafonnée à 1 Go par la compilation et à 4 Go en wasm32, et un téléphone en a moins. La limite garde l’attente sous deux secondes et demie ; la lever demanderait une lecture en flux dans un Web Worker et plus de mémoire (D49). Au-delà de 300 000 triangles, la page refuse aussi la persistance, sa version étendue et le graphe de Reeb : une demi-seconde à ce plafond, une seconde pour la persistance étendue.

Technologies

  • C++
  • Three.js
  • GoogleTest

Qui fait quoi

C++
La structure demi-arête, les invariants (Euler, genre, bords, orientabilité), la courbure de Gauss, la hauteur, ses points critiques (théorie de Morse discrète) sa persistance (réduction de la matrice de bord) et son graphe de Reeb ; compilé en WebAssembly par Emscripten pour la visionneuse, et en bibliothèque partagée pour l'API Python.
Three.js
La visionneuse de la fiche : le maillage coloré par sa courbure ou sa hauteur, filtré sous un seuil, ses points critiques marqués, son graphe de Reeb tracé dedans, tourné à la souris ou au doigt.
GoogleTest
Les tests du C++ : invariants des maillages de référence, courbure comparée aux valeurs théoriques, points critiques (sphère, tore, selle de singe, somme des indices égale à χ), persistance (nombres de Betti, stabilité), graphe de Reeb (boucles égales au genre), sous Linux, Windows et macOS.

Definition of Done

  • Code relu, diff par diff
  • Tests unitaires et d'intégration verts
  • CI verte sur Linux, Windows et macOS si compilé
  • README, REVIEW.md et DECISIONS.md à jour
  • Textes en français et en anglais
  • Démo déployée et testée sur mobile