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

Documents pareils