Ce TP consiste à écrire des procédures pour créer et maintenir une structure de recherche de points dans le plan. Pour cela, on va utiliser un arbre binaire de recherche (pas nécessairement équilibré) qui est légèrement modifié : lors de la descente dans l'arbre, la comparaison effectuée à chaque noeud se fait alternativement sur les coordonnées x et y. Chaque noeud de l'arbre contient un point du plan, en plus des deux pointeurs sur les fils gauche et droit. La structure de donnée principale sera donc de ce type :
type Typecle=Point; Arbre=^Noeud Noeud= record cle: Typecle; fg,fd: Arbre; end;Il n'est pas nécessaire de stocker dans cet enregistrement l'information disant si ce noeud effectue une séparation en x ou en y. En effet puisque les deux directions sont systématiquement alternées, cette information est explicitement disponible lors du parcours de l'arbre.
On demande d'impléménter les procédures suivantes :
insertion(p:Point; niveau:boolean;var a:Arbre)La variable niveau indiquera si la racine de l'arbre est un noeud effectuant une séparation en x ou en y. On pourra alors écrire une procédure EntrePoints(var a:Arbre) qui permet d'entrer un ensemble de points à la souris et qui les range dans l'arbre, et tester le programme au moyen d'une procédure TracePoints( a:Arbre) qui affiche tous les points faisant partie de l'arbre a.
RechercheRect(r:Rect; niveau:boolean; a:Arbre)Cette procédure parcourt l'arbre en commençant par la direction x ou y suivant la valeur du niveau. L'exploration des branches doit être limitée à celles qui peuvent contenir des points dans le rectangle r. Chaque fois qu'un point est trouvé dans ce rectangle, il doit être mis en valeur dans la fenêtre graphique.