Une introduction douce au problème de la coque convexe
Les coques convexes ont tendance à être utiles dans de nombreux domaines différents, parfois de manière assez inattendue. Dans cet article, je vais expliquer l’Idée de base des coques convexes 2d et comment utiliser le scan de graham pour les trouver. Donc, si vous connaissez déjà le graham scan, alors cet article n’est pas pour vous, mais sinon, cela devrait vous familiariser avec certains des concepts pertinents.
La coque convexe d’un ensemble de points est définie comme le plus petit polygone convexe, qui entoure tous les points de l’ensemble. Convexe signifie que le polygone n’a aucun coin courbé vers l’intérieur.
Les bords rouges sur le polygone de droite entourent le coin où la forme est concave, l’opposé de convexe.
Une façon utile de penser à la coque convexe est l’analogie de l’élastique. Supposons que les points de l’ensemble soient des clous, dépassant d’une surface plane. Imaginez maintenant, ce qui se passerait si vous preniez un élastique et l’étiriez autour des clous. En essayant de se contracter pour retrouver sa longueur initiale, l’élastique enfermerait les clous, en touchant ceux qui dépassent le plus du centre.
Pour représenter la coque convexe résultante en code, nous stockons habituellement la liste des points qui soutiennent cet élastique, c’est-à-dire la liste des points sur la coque convexe.
Notez que nous devons encore définir ce qui doit se passer si trois points se trouvent sur la même ligne. Si on imagine que l’élastique a un point où il touche l’un des clous mais qu’il ne s’y plie pas du tout, cela signifie que le clou qui s’y trouve se trouve sur une droite entre deux autres clous. Selon le problème, on peut considérer que ce clou situé le long de la ligne droite fait partie de la sortie, puisqu’il touche l’élastique. D’un autre côté, nous pourrions également dire que ce clou ne devrait pas faire partie de la sortie, car la forme de l’élastique ne change pas lorsque nous le retirons. Cette décision dépend du problème sur lequel vous travaillez actuellement, et mieux encore, si vous avez une entrée où aucun des trois points n’est colinéaire (c’est souvent le cas dans les tâches faciles pour les concours de programmation), alors vous pouvez même ignorer complètement ce problème.
Finir la coque convexe
En regardant un ensemble de points, l’intuition humaine nous permet de déterminer rapidement quels points sont susceptibles de toucher la coque convexe, et lesquels seront plus proches du centre et donc éloignés de la coque convexe. Mais traduire cette intuition en code demande un peu de travail.
Pour trouver la coque convexe d’un ensemble de points, nous pouvons utiliser un algorithme appelé le Scan de Graham, qui est considéré comme l’un des premiers algorithmes de géométrie computationnelle. En utilisant cet algorithme, nous pouvons trouver le sous-ensemble de points qui se trouvent sur la coque convexe, ainsi que l’ordre dans lequel ces points sont rencontrés en faisant le tour de la coque convexe.
L’algorithme commence par trouver un point, dont on sait qu’il se trouve sur la coque convexe avec certitude. Le point avec la coordonnée y la plus basse par exemple peut être considéré comme un choix sûr. Si plusieurs points existent à la même coordonnée y, on prend celui qui a la plus grande coordonnée x (cela fonctionne aussi avec d’autres points d’angle, par exemple d’abord le plus petit x puis le plus petit y).
Puis, nous trions les autres points par l’angle auquel ils se trouvent vus du point de départ. Si deux points se trouvent être au même angle, le point qui est plus proche du point de départ devrait apparaître plus tôt dans le tri.
Leave a Reply