Travaux Dirigés de aci
5. Courbes de Bézier interactives

Le but de cet exercice est d’écrire un éditeur de courbes de Bézier en X-window. La courbe est calculée par la fonction dessineBezier qui fait l’objet de la dernière question, mais considérée comme disponible pour définir les autres. Cette fonction ne dessine pas la courbe mais calcule la suite des segments de droites qui permet de la tracer, en s’appelant récursivement jusqu’à ce que son deuxième argument, décrémenté à chaque appel, atteigne la valeur 1 (on prendra 6 comme valeur d’initialisation, suffisant en général). Cette suite est rangée dans la variable globale points, qui représente dans un tableau de XPoint, les points successifs à relier par des droites. Toutefois, les trois premiers points de ce tableau sont les deux points de contrôle et le point d’arrivée, dont les coordonnées doivent être mémorisées. On commencera donc le dessin à partir du quatrième élément (d’index 3 donc).

Les symboles de la Xlib utilisés dans ce problème :

ButtonMotionMask ButtonPress ButtonPressMask
ButtonRelease ButtonReleaseMask ControlMask
CoordModeOrigin Cursor DefaultRootWindow
DefaultScreen Display Expose
ExposureMask GC GCForeground
GCFunction GCLineStyle GCLineWidth
GXxor LineOnOffDash MotionNotify
ShiftMask WhitePixel Window
XButtonEvent XClearWindow XCloseDisplay
XCreateFontCursor XCreateGC XCreateSimpleWindow
XDefineCursor XDisplayName XDrawLines
XEvent XExposeEvent XFillArc
XFillRectangle XFreeGC XGCValues
XMapWindow XMaskEvent XNextEvent
XOpenDisplay XParseGeometry XPoint
XSelectInput XSetDashes

Makefile
main.c
typincdef.h


1 Déploie

Ecrire la fonction refresh, appelée notamment après un événement Expose. Non seulement elle dessine la courbe stockée dans points, mais elle dessine de plus deux cercles de rayon RAYON aux points de départ et d’arrivée de la courbe, et deux rectangles de côté RAYON ! aux points de contrôle.


Obtenir un formulaire de soumission de comptes rendus

2 Définis

On convient que lorsque l’utilisateur clique avec la touche Majuscules enfoncée, il définit le point de départ au premier clic, et le point d’arrivée lors du second. De même avec la touche Controle pour les points de contrôle. A chacun de ces quatre clics, les coordonnées de la souris sont mémorisées dans les premiers éléments de la variable points, et le cercle ou le carré mentionnés à la question précédente sont affichés.

Définir la fonction posepoints qui réagit ainsi à ces clics. Dès que les quatre points sont définis, elle lance le calcul de la courbe et la visualise. Les clics intempestifs (par exemple un troisième point de contrôle alors que le point d’arrivée n’est pas défini) seront ignorés.


Obtenir un formulaire de soumission de comptes rendus

3 Déforme

Lorsque l’utilisateur clique sans enfoncer de touche, on cherche s’il a cliqué sur l’un des quatre points. Si c’est le cas, on attend qu’il relâche le bouton en suivant les mouvements de la souris, et en déformant la courbe en fonction de ce mouvement.

Définir la fonction bougepoints réalisant ce traitement. On utilisera à profit le contexte graphique gc_deplace, et on changera de curseur.


Obtenir un formulaire de soumission de comptes rendus

4 Déroule

Pour calculer la courbe, la fonction dessineBezier reçoit en argument une profondeur de récursion et un tableau de points supposé assez grand, et dont les quatre premiers éléments indiquent, dans l’ordre, les points de départ D, d’arrivé A, les deux points de contrôle Z et U. Calculer, en suivant l’algorithme de De Casteljou. les points d, z, u milieux de DZ, ZU et UA, puis les points c et v milieux de dz et zu et enfin le point M, milieu de dz et zu. Calculer alors récursivement les courbes D d c M et M v u A en remplissant le tableau aux bons endroits.


Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 23 janvier 2021 à 17h17min