TP 3 - Géométrie algorithmique
Transcription
TP 3 - Géométrie algorithmique
TP 3 - Géométrie algorithmique Amaury Pouly ([email protected]) 19 octobre et 9 novembre 2010 Le but du jour : En finir avec les automates et découvrir un peu de géométrie algorithmique Vous pourrez trouver les énoncés ainsi que les corrections des TP sur ma page personnelle : http://perso.ens-lyon.fr/amaury.pouly/ 1 Retour sur les automates Exercice 1 Écrivez une fonction gen_aut_div:int→(, int) automaton qui pour chaque entier n, génère un automate reconnaissant les nombres divisibles par n lorsqu’ils sont lus de gauche à droite. Vous pouvez remplacer par n’importe quel type de votre choix. L’alphabet est celui des chiffres de 0 à 9 (d’où le type int). Votre automate ne doit pas accepter le mot vide ! Exercice 2 Implémentez une fonction accepts:(’a, ’b) automaton -> ’b list -> bool qui sous l’hypothèse que starts est de taille un et que l’automate est déterministe, détermine si un mot est accepté par l’automate. Vous pourrez vous servir des fonctions mem et assoc de la bibliothèque standard ainsi que des exceptions. Un bon exercice est d’implémenter cette fonction à la fois en impératif et en fonctionnel. Exercice 3 Écrivez une fonction split_int:int→int list qui à tout entier n associe les chiffres de n en base 10 de gauche à droite. Testez l’automate généré par gen_aut_div grâce accepts et split_int. 2 Géométrie algorithmique La géométrie algorithmique consiste généralement en la résolution d’un problème ou la construction d’un objet géométrique. On trouve de nombreuses applications, notamment dans le cas de R3 que ce soit dans le domaine scientifique ou dans les jeux vidéos. Dans toute la suite, on se basera sur les définitions suivantes : type p o i n t = {x : i n t ; y : i n t } and vec == p o i n t ; ; l e t p x y = {x = x ; y = y } ; ; type d i r = L e f t | S t r a i g h t | Right ; ; l e t mk vec a b = ( { x = b . x − a . x ; y = b . y − a . y} : vec ) ; ; On considèrera qu’un polygône est décrit par la liste de ses sommets, donnés dans le sens direct et deux à deux distints. 1 Exercice 4 ux vx Écrivez une fonction cross : vec -> vec -> int qui étant donnés ~u, ~v calcule det . Interprétez uy vy géométriquement. En déduire une fonction seg_turn : point C (Left) -> point -> point -> dir qui étant donné A, B, C détermine la position relative de C par B −−→ A C (Straight) rapport à AB. De façon équivalente, elle donne le signe de −−→ −−→ l’angle (AB, BC). C (Right) Exercice 5 B C d A Exercice 6 C4 P b C5 Écrivez une fonction is_convex : point list -> bool qui détermine si un polygône est convexe. Écrivez une fonction in_convex_poly : point -> point list -> bool qui détermine si un point P est à l’intérieur d’un polygône convexe C. On considère en particulier que tout point du bord de C est à l’intérieur. C3 C1 Écrivez une fonction vec_len : vec -> float qui calcule la longueur d’un vecteur. En déduire une fonction line_dist : point * point -> point -> float qui étant donnés (A, B), C calcule la distance d de C à la droite (AB). C2 En déduire une fonction is_convex_hull : point list -> point list -> bool qui étant donné H et C vérifie que H est une enveloppe convexe de C. Dans chaque cas, on prendra garde au cas dégénérés, notamment le cas d’un polygône à zéro, un ou deux sommets. 3 Enveloppe convexe Exercice 7 b b b b P1 b b P8 P5 b P3 P4 b P2 P2 P1 P7 P6 P4 b b P3 b b On définit la relation ≺ sur R2 comme l’ordre lexicographique sur (R, <) × (R, <). Rappelez sa définition et implémentez une fonction lex_comp : point -> point -> bool correspondant à cet ordre. b P9 b P10 En supposant une liste de points P1 , . . . , Pn triée selon ≺, montrez comment construire une enveloppe convexe supérieure en temps linéaire (voir figure ci-contre). En déduire une fonction up_hull : point list -> point list qui détermine une enveloppe convexe supérieure d’un ensemble de point. On prendra garde à retourner les points de l’enveloppe dans le sens direct et on se demandera qu’elle est l’enveloppe convexe supérieur dans le second exemple ci-contre. Exercice 8 Écrivez une fonction convex_hull : point list -> point list qui calcule l’enveloppe convexe d’un ensemble de points. Quelle est sa complexité ? Testez cette fonction grâce à is_convex_hull. Vérifiez au moins sur les exemples suivants : 2 b b b b b b b b b b 4 b b b b b b b Points les plus éloignés On appelle diamètre d’un nuage de point la distance entre les deux points les plus éloignés. De façon équivalente, un diamètre d’un nuage de point est un couple de points les plus éloignés. Le but de cette section est de voir en quoi le calcul de l’enveloppe convexe permet de trouver un diamètre. Exercice 9 b b B Donnez un algorithme naı̈f qui trouve en temps quadratique un diamètre d’un ensemble de point. Écrivez une fonction diameter_slow : point list -> point * point qui implémente cet algorithme. b A b b Exercice 10 b b Pi−1 Pj+1 b Pj Pi b Pi+1 b Pj−1 b Montrez qu’un diamètre d’un ensemble de points P est toujours constitué de points sur l’enveloppe convexe de P . On dit que deux points A et B sont antipodaux s’il existe deux droites parallèles passant par A et B telles que P est entièrement contenu entre ces deux droites. Montrez qu’un diamètre forme toujours une paire antipodale. On suppose que les Pk sont donnés dans le sens direct. Montrez que si Pi et Pj sont antipodaux, on peut toujours prendre les droites parallèles à l’un des deux segments suivants : Pi Pi+1 ou Pj Pj+1 . Donnez une condition sur Pj−1 , Pj et Pj+1 pour que Pi et Pj soient antipodaux et que l’on puisse prendre les droites parallèles à Pi Pi+1 . On pourra le relier à la distance de ces points à la droite (Pi Pi+1 ). On suppose que pour tout i, Pi−1 , Pi et Pi+1 ne sont pas alignés. En déduire le nombre maximum de paires antipodales. Exercice 11 Écrivez une fonction diameter : point list -> point * point qui trouve un diamètre en O(n log n) en se basant sur la recherche de paires antipodales. 5 Bonus Exercice 12 Généralisez la recherche d’un diamètre afin de résoudre le problème suivant : étant donné un ensemble P de points, on cherche le plus petit rectangle R (au sens de l’aire) englobant P . b b b b b b b b b 3