TP : recherche d’une enveloppe convexe Option info MPSI Étant donné un ensemble de points, on cherche leur ensemble convexe, c’est à dire le plus petit ensemble convexe contenant ces points. On représentera un point par un couple de flottants et un ensemble de points par une liste. P3 P4 P2 Q P1 P0 Figure 1 – Un ensemble de points avec son enveloppe convexe I Fonctions utilitaires −−→ −→ 1. Écrire une fonction det prenant 3 points P , Q, R en arguments et renvoyant det(P Q, P R). −−→ −→ 2. En déduire une fonction direct qui prend 3 points P , Q, R en arguments et renvoie true ssi (P Q, P R) −−−→ −−→ est un angle dans le sens direct (i.e dans le sens trigonométrique, par ex (P0 P1 , P0 Q) est direct sur la −−−→ −−→ Figure 1 mais pas (P0 P4 , P0 Q)). II Marche de Jarvis La marche de Jarvis est un algorithme permettant de calculer une enveloppe convexe d’un ensemble de points. Elle consiste à partir d’un point P0 dont on sait qu’il est sur l’enveloppe convexe, puis à trouver le point −−−→ −−→ P1 tel que (P0 P1 , P0 Q) soit direct pour tout Q (voir Figure 1), et ainsi de suite jusqu’à revenir sur le point initial P0 . 1. Écrire une fonction mini_y qui prend une liste de points en arguments et renvoie le point ayant une ordonnée minimum (si plusieurs points ont la même ordonnée minimum, on renverra celui qui est d’abscisse minimum). 2. Écrire une fonction next qui prend une liste de points l et un point p en arguments et qui renvoie le prochain point q de l, à partir de p, en suivant la marche de Jarvis. Pour cela on pourra remarquer que la − − relation q ≺ r ⇐⇒ det(→ pq, → pr) > 0 est une relation d’ordre, et que q est le minimum pour cette relation. 3. Écrire une fonction jarvis renvoyant l’ensemble des points de l’enveloppe convexe, dans l’ordre trigonométrique, d’une liste de points donnée en argument. Le fichier tp_enveloppe.ml contient une fonction affiche telle que affiche lp enveloppe affiche les points lp et relie les points de enveloppe. L’utiliser pour vérifier votre fonction. On fermera la fenêtre graphique en appuyant sur une touche quelconque et non pas en cliquant sur la croix. 4. Quelle est la complexité de la fonction précédente, en fonction du nombre h de points sur l’ensemble convexe et du nombre total n de points ? 1 III Intersections 1. On veut déterminer informatiquement si deux segments [P1 P2 ] et [P3 P4 ] se croisent. Que peut-on dire des −−−→ −−−→ −−−→ −−−→ angles (P1 P2 , P1 P3 ) et (P1 P2 , P1 P4 ) dans ce cas ? En déduire une condition nécessaire et suffisante pour que [P1 P2 ] et [P3 P4 ] s’intersectent et écrire une fonction le déterminant. Vérifier avec les 4 points de la Figure 2, puis en échangeant P4 et P2 . P4 (1, 2) P2 (3, 2) P3 (4, 1) P1 (0, 0) Figure 2 – [P1 P2 ] et [P3 P4 ] s’intersectent 2. Écrire une fonction ayant un point P et une liste ` de n points en arguments et déterminant si P est situé à l’intérieur de l’enveloppe convexe de `. Indice : on pourra considérer un point P∞ « à l’infini » ((1000., 0.) suffira pour nous) et regarder le nombre de fois que [P P∞ ] intersecte l’enveloppe convexe de `. Vérifier que (2, 2) est dans l’enveloppe des points sur la Figure 2, mais que (2, 2.5) n’y est pas. 3. Quelle est la complexité de l’algorithme précédent ? IV Compléments La marche de Graham est une autre méthode qui permet de trouver l’enveloppe convexe d’un ensemble de n points, et qui a comme complexité O(n log(n)). 1. Montrer qu’un algorithme en complexité C(n) pour la recherche d’une enveloppe convexe peut être utilisé pour trier un tableau de n entiers en complexité C(n). En déduire la complexité optimale d’un algorithme de recherche d’enveloppe convexe. Indice : si t est un tableau d’entiers, considérer les points (t.(i), t.(i)2 ). On s’intéresse à une application de la recherche d’une enveloppe convexe : trouver les deux points les plus éloignés parmi n points. 2. Quelle est la complexité de la méthode naïve ? L’implémenter. 3. Améliorer l’algorithme précédent en remarquant que les deux points les plus éloignés sont forcément sur l’enveloppe convexe. 4. Quelle est la complexité de l’algorithme précédent si on utilise la marche de Graham pour trouver l’enveloppe convexe ? 2