diagramme voronoi python maths

Diagrammes de Voronoï, point de vue mathématiques et Python

  • Dernière modification de la publication :2 mai 2024
  • Temps de lecture :9 min de lecture
  • Commentaires de la publication :0 commentaire

Loading

Un diagramme de Voronoï (mathématiques et Python), est une représentation graphique. Nous allons voir en quoi elle consiste.

Pour celles et ceux qui désirent en savoir plus, vous pouvez consulter la page wikipedia.

Diagramme de Voronoï: point de vue mathématiques (on verra ensuite pour Python)

Considérons dans un repère orthonormé un système S de points \(A_k(x_k;y_k)\). Le diagramme de Voronoï associé à ce système S permet de voir quels sont les points du plan les plus proches d’un des points de S.

Définitions

L’ensemble:$$\text{Vor}_S(A_k) = \{ M(x;y)\in\mathbb{R}^2,\ MA_k \leqslant MA_i,\ \forall i \neq k\}$$ est l’ensemble des points du plan qui sont plus proches de \(A_k\) que des autres points de S.

Cet ensemble est appelé polygone de Voronoï, ou polygone de Thiessen, du point \(A_k\). On peut aussi l’appeler une cellule.

Le point \(A_k\), quant à lui, est appelé germe (ou centre de la cellule).

Un pavage de Voronoï est l’ensemble des polygones de Voronoï.

En mathématiques

Un pavage de Voronoï avec deux points n’est pas compliqué à trouver. Il s’agit de deux demi-plans délimités par la médiatrice du segment formé par les deux points.

Avec trois points, il suffit de construire les médiatrices des segments formés par ces trois points:

diagramme voronoi mathématiques python

On l’aura compris, il suffit au final de tracer les médiatrices; ce sont elles qui partitionnent le plan pour donner le pavage de Voronoï.

diagramme voronoi mathématiques python
Pavage de Voronoï pour un système de 7 points

Diagramme de Voronoï: après les mathématiques, une implémentation en Python

Il existe déjà un module qui permet de tracer de tels diagrammes: dans scipy.spatial, il y a une fonction Voronoi.

Premier exemple

import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d

points = np.random.rand(10,2) # choisit au hasard 10 points dans le carré unité
vor = Voronoi(points)
fig = voronoi_plot_2d(vor)
plt.show()

Ce programme choisit 10 points au hasard. Leurs coordonnées sont comprises entre 0 et 1, puis détermine le pavage de Voronoï. On obtient par exemple:

Deuxième exemple

import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d

points = np.random.rand(10,2)
vor = Voronoi(points)
fig = voronoi_plot_2d(vor, show_vertices=False, line_colors='red',line_width=2, line_alpha=0.6, point_size=2)
plt.show()

Note : j’ai oublié de mettre à l’échelle les graphiques précédents, donc il est normal que les bords des polygones ne semblent pas perpendiculaires aux segments joignant deux points du système. L’orthogonalité se verra mieux sur les graphiques suivants.

Troisième exemple: avec de la couleur (c’est plus fun!)

import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt

points = np.random.rand(20, 2)
vor = Voronoi(points)
colors = plt.cm.tab20(np.arange(len(vor.regions)))

fig, ax = plt.subplots()
voronoi_plot_2d(vor, ax=ax, show_vertices=False, line_colors='k', line_width=2, line_alpha=0.6)


for region_index, region in enumerate(vor.regions):
    if not -1 in region and len(region) > 0:  # Vérifier si la région est finie
        polygon = [vor.vertices[i] for i in region]
        ax.fill(*zip(*polygon), color=colors[region_index], alpha=0.3)

# Ajouter les points d'origine
ax.plot(points[:, 0], points[:, 1], 'o', markersize=1)

# Optionnel : ajuster les limites de la figure pour mieux voir le pavage
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)

plt.show()

Applications du diagramme de Voronoï

La polyvalence des diagramme de Voronoï en fait un outil puissant. Dans l’analyse et la modélisation de structures spatiales dans de nombreux domaines scientifiques et appliqués, par exemple:

  • Sciences géospatiales : pour diviser une région en zones contiguës en fonction de la proximité des points de données. Cela peut être utile dans la cartographie, la télédétection, la géologie, etc.
  • Planification des réseaux : dans les télécommunications, pour planifier l’emplacement des tours de téléphonie mobile. Cela permet de maximiser la couverture du signal et minimiser les chevauchements.
  • Modélisation des mouvements de particules : en physique et en biologie, pour modéliser le déplacement des particules. Cela se fait dans un espace en fonction des attracteurs ou des obstacles présents.
  • Traitement d’images : pour segmenter les images en régions homogènes en fonction des niveaux de gris ou des couleurs.
  • Optimisation : dans des problèmes d’optimisation pour diviser l’espace en régions qui minimisent la distance à un ensemble de points donnés.
  • Modélisation des écosystèmes : pour modéliser les territoires de chasse ou de recherche des animaux en fonction de leur emplacement.
  • Analyse des données spatiales : analyser la distribution spatiale des données. Cela permet d’identifier les clusters, les zones denses ou les régions isolées.
  • Conception architecturale : pour générer des motifs de conception spatiale. Mais aussi pour déterminer la répartition des espaces en fonction des besoins des utilisateurs.
0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires