Skip to content

Algorithmes de décompositions convexes de polygones

ilokhat edited this page May 9, 2018 · 1 revision

Introduction

La classe PolygonMeshBuilder contient l’ensemble des fonctions permettant d’effectuer une décomposition en parties convexes (majoritairement des triangles) d’un polygone 2D (avec ou sans parties évidées). Les fonctionnalités les plus avancées de cette classe utilisent les algorithmes de triangulation de la librairie JTS.

Les entrées/sorties génériques des fonctions de décomposition sont :

- Entrée : IGeometry
- Sortie : IMultiSurface<GM_Polygon>

Liste des algorithmes :

1) TRIANGULATE : ‘’triangulation’’ simple sans ajouter de vertices
2) MAKECONVEX : partitionnement en ensembles convexes (majoritairement à base de triangles (triangulation jusqu’à ce que la surface résultante soit convexe)
3) GENERATEMESH : partitionnements paramétrables à l’aide des triangulations contraintes de JTS

Exemples d’utilisations :

Partitionnement en polygones convexes d’une IGeometry polygon

IMultiSurface<GM_Polygon> partitionConvexe = makeConvex(polygon);

Cet algorithme simple et fonctionnel (à base de décomposition à partir des “oreilles” du polygone) présente l’avantage de ne pas être dépendant de la triangulation contrainte de JTS, instable dès lors que le nombre de sommets et relativement élevé et donc inutilisable sur des polygones complexes. En revanche, l’irrégularité des triangles de la décomposition (parfois quasi-plats) peut poser des problèmes de stabilité numérique dans la suite des traitements, auquel cas il faudra préférentiellement utiliser les algorithmes plus évolués décrits ci-dessous.

Partitionnement “régulier” en polygones convexes

// Pas de sur-échantillonnage des vertices du maillage
PolygonMeshBuilder.setOverSampling(false);
 
// Calcul de la partition
IMultiSurface<GM_Polygon> partitionConvexe = generateMesh(polygon);

La “régularité” du partitionnement est assurée par une triangulation de Delaunay contrainte des sommets du polygone.

Partitionnement “régulier” en polygones convexes avec sur-échantillonnage

// Sur-échantillonnage des vertices du maillage
PolygonMeshBuilder.setOverSampling(true);
  
// Paramètres : grille régulière / résolution 5 m
PolygonMeshBuilder.setGridGeneration(PolygonMeshBuilder.REGULAR_GRID);
PolygonMeshBuilder.setSamplingResolution(5.0);
    
// Calcul de la partition
IMultiSurface<GM_Polygon> partitionConvexe = generateMesh(polygon);

Partitionnement en polygones convexes avec sur-échantillonnage aléatoire

// Sur-échantillonnage des vertices du maillage
PolygonMeshBuilder.setOverSampling(true);
    
// Paramètres : grille irrégulière aléatoire / résolution 5 m
PolygonMeshBuilder.setGridGeneration(PolygonMeshBuilder.RANDOM_GRID);
PolygonMeshBuilder.setSamplingResolution(5.0);
    
// Calcul de la partition
IMultiSurface<GM_Polygon> partitionConvexe = generateMesh(polygon);

Dans cet algorithme, la paramètre de “résolution” est telle que la densité de sur-échantillonnage globale est identique à celle d’un maillage régulier de même résolution.
Par exemple, une résolution de 1 m appliquée à un sur-échantillonnage aléatoire d’un polygone carré de côté 10 m produira un maillage de partitionnement contenant 100 points.

Partitionnement en polygones convexes avec sur-échantillonnage adaptatif

// Sur-échantillonnage des vertices du maillage
PolygonMeshBuilder.setOverSampling(true);
    
// Paramètres : grille irrégulière adaptative / résolution 5 m
PolygonMeshBuilder.setGridGeneration(PolygonMeshBuilder.ADAPTIVE_GRID);
PolygonMeshBuilder.setSamplingResolution(5.0);
    
// Calcul de la partition
IMultiSurface<GM_Polygon> partitionConvexe = generateMesh(polygon);

Cet algorithme est requis lorsque l’on désire une modélisation fine des frontières du polygones sans accroître inutilement le nombres de parties de la décomposition.
Le paramètre “résolution” correspond à la résolution de niveau moyen : résolution max = 0.5 x samplingResolution (sur les bords) et résolution min = 1.5 x samplingResolution (au centre).

Paramètre de tolérance :

Le paramètre de tolérance (réel entre 0 et 1, par défaut égal à 0.001) permet d’éviter les problèmes d’erreurs numériques lors des tests d’inclusion des parties issues de la décomposition dans le polygone d’origine au niveau des frontières. A titre d’exemple, une valeur de 0.001 indique une incertitude numérique sur l’erreur de calcul d’aire de l’ordre de 0.1% de la surface totale du polygone à décomposer. Dans l’éventualité où un résultat incorrect soit obtenu en sortie de l’algorithme, il est important de tester d’augmenter légèrement cette valeur de tolérance.

Résultat sur un jeu de données BDTOPO :