Subdivision de surface

Bien que les opérations de raffinement de surface par subdivision du maillage soient intuitives et faciles à décrire localement et schématiquement, leurs spécifications formelles et globales dans un langage standard ne sont pas immédiate et facile à implanter. On peut alors se demander dans quelle mesure on peut utiliser les complexes cellulaires comme espace d'indexation de collections topologiques et les patches (extension des transformations standards sur les complexes cellulaires), pour programmer de tels changements de structure.

Dans cet exemple, nous allons voir l'utilisation des patches pour décrire déclarativement et localement un algorithme de subdivision de surface, tout en conservant une bonne expressivité.

On se concentre ici sur l'un des plus simples algorithmes de subdivision de maillage triangulaire, qui consiste à diviser chaque triangle en quatre triangles coplanaires. Il s'agit de la subdivision polyhédrale.

La position des nouveaux sommets est calculée au cours de la subdivision. Ici, on choisit que chaque sommet est inséré au milieu d'un arc (c'est-à-dire que ses coordonnées sont la moyenne des coordonnées des arcs du triangle. D'autres algorithmes utilisent la même modification topologique mais placent les nouveaux et les anciens sommets à des positions différentes, suivant un masque particulier. Il ne s'agit là que d'une différence géométrique qui n'a d'influence que sur le plongement du maillage topologique dans l'espace euclidien.

Description de l'algorithme :

On peut voir sur la figure précédente, que bien que la transformation soit locale, des effets de bords apparaissent. En effet, les triangles voisins voient leur topologie changer par l'insertion des sommets. C'est cet effet de bord qui rend l'implantation de l'algorithme compliquée. On ne peut donc pas utiliser cette règle directement.

Pour éviter ce problème, nous appliquons deux modifications successives pour obtenir le résultat. Dans premier temps, on rajoute un sommet sur chaque arc. Dans une seconde étape, chaque hexagone (en effet, la première transformation a pour effet de rajouter 3 sommets par triangle produisant alors des hexagones) est divisé par l'ajout de 3 nouveaux arcs en 4 triangles.

On associe respectivement les valeurs `edge et `face aux arcs et aux triangles. Pour faire la différence entre les anciens sommets et les nouveaux sommets lors de la deuxième étape, on associe un entier à chaque sommet, correspondant à sa génération. On associe également le plongement dans l'espace :

record Point = { x:float , y:float , z:float , gen:int } ;;

Insertion de sommet

Cette étape consiste à sélectionner chaque arc, pour y insérer un sommet.

Le code MGS est la suivant :

patch insert_vertex[genNb] = {
  ~v1 < e:[dim=1] > ~v2 =>
    `e1:[dim=1,faces=(v1,`v),`edge]
    `v:[dim=0,cofaces=(`e1,`e2),{gen = genNb,
                                 x   = (v1.x + v2.x) / 2,
                                 y   = (v1.y + v2.y) / 2,
                                 z   = (v1.z + v2.z) / 2}]
    `e2:[dim=1,faces=(v2,`v),`edge]
} ;;

Dans ce patch, v1 et v2 ne sont pas consommé (opérateur ~) pour autoriser le filtrage de tous les arcs incidents à un même sommet.

Subdivision des hexagones

On cherche dans le maillage chaque hexagone pour les remplacer par 4 triangles :

patch build_triangles[genNb] = {
  f:[dim=2,(e1,e2,e3,e4,e5,e6) in faces]
  ~v1 < ~e1 > ~v2:[v2.gen == genNb] < ~e2 >
  ~v3 < ~e3 > ~v4:[v4.gen == genNb] < ~e4 >
  ~v5 < ~e5 > ~v6:[v6.gen == genNb] < ~e6 > ~v1 =>
    `e24:[dim=1,faces=(v2,v4),`edge]
    `e46:[dim=1,faces=(v4,v6),`edge]
    `e62:[dim=1,faces=(v6,v2),`edge]
    `f1:[dim=2,faces=(e6,e1,`e62),`face]
    `f2:[dim=2,faces=(e2,e3,`e24),`face]
    `f3:[dim=2,faces=(e4,e5,`e46),`face]
    `f4:[dim=2,faces=(e24,e46,`e62),`face]
} ;;

Dans cette règle, seule l'hexagone f est filtré et consommé. Son bord est filtré mais non-consommé pour permettre la construction des triangles en partie droite de la règle.

L'itération des ces deux étapes successives produit sur un triangle l'animation topologique suivante :










...
Cliquez sur l'image pour l'agrandir.

Voici quelques exemples de subdivisions réalisées en MGS.




Cliquez sur l'image pour l'agrandir.
Subdivisions géométriques. En haut à gauche, le maillage initial. En haut à droite, le résultat après 4 itérations de l'algorithme de subdivision polyhédrale. En bas à gauche, après 4 itérations du même algorithme mais avec le masque d'interpolation de Butterfly. En bas à droite, la même chose mais avec le masque de Butterfly modifié pour la gestion des sommets de degrés différents de 6.


Back to top
MGS examples index
MGS home page



(currently under construction logo)
this site is under construction.
Pages started: May 2002. Last revision: 24 jully 2003.

Creative Commons License
Pictures, graphics and animations are licensed under a Creative Commons License.


English keywords for indexation: computer science, programming language, topological collections, transformation, declarative programming language, functional languages, simulation of biological processes, cell model, biological pathway, interaction network, gene regulation, signal transduction, morphogenesis, developmental biology, integrative simulation, biological organization, dynamical systems, dynamical structure, Gamma, CHAM, P system, L system, Paun, Lindenmayer, cellular automata, membrane computing, aqueous computing, artificial chemistry, GBF, Cayley graph, data fields, nested collections, rewriting, rule based programming, pattern-matching, intentional programming, compilation, interpretation, type, type inference, nested type, polytypism, catamorphism, static analysis, sequence, multiset, combinatorial algebraic topology, chain complex, chain group.