IUT Littoral 2019 - 2020
Info 2A Ana. Num. – C++
TP 5 - TP not´ e
Ce TP not´ e est divis´ e en deux parties. Pour des raisons pratiques vous travaillerez uniquement sous linux (et de pr´ ef´ erence sur les machines de l’IUT). Une archive contenant le code ` a compl´ eter est disponible sur ma page ` a l’adresse suivante :
http://www.lmpa.univ-littoral.fr/~fromentin/teaching/2019/dut/tp-note.tar.gz Renommer le r´ epertoire nom-prenom avec vos nom et prenom. C’est ce r´ epertoire compl´ et´ e que vous me donnerez ` a l’issu du TP not´ e.
Attention. N’oubliez pas de faire des copies de sauvegardes r´ eguli` erement avant de ne pas tout perdre suite ` a une fausse manipultation.
1. Courbes de B´ ezier
Le but de cette partie est de tracer une courbe de B´ ezier cubique ` a l’aide de la librairie graphique SDL2. Elle est ` a r´ ealiser dans le r´ epertoire bezier.
Exercice 1. Nous allons commencer par cr´ eer une classe Point permettant de repr´ esenter des points ` a coefficients entiers. Cette classe sera cod´ ee dans les fichiers point.hpp et point.cpp.
a. Coder un constructeur prenant deux entiers x et y en param` etre et cr´ eant le point de coordonn´ ees (x, y ).
b. Coder deux accesseurs lire x et lire y retournant l’abscisse (resp. l’ordonn´ ee) du point courant
Les fonctions qui suivent ne sont pas des fonctions membres de la classe Point et sont donc ` a coder ` a l’ext´ erieur de la class Point.
c. Surcharger l’op´ erateur operator<< pour permettre d’afficher des objets de la classe Point.
d. Cr´ eer une fonction milieu qui ´ etant donn´ es deux points A et B retourne le milieu du segment [AB]
e. Cr´ eer une fonctions distance qui ´ etant donn´ es deux points A et B retourne la dis- tance d(A, B ) entre A et B.
A partir de maintenant vous n’aurez plus que le fichier ` main.cpp ` a modifier.
Exercice 2. Les courbes de B´ ezier cubiques sont cr´ eer ` a l’aide de quatre points quelcon- ques. Ces points seront directement positionn´ es ` a l’aide la souris. Vous devez modifier le code de la fonction main pour obtenir le comportement suivant :
• D` es que l’utilisateur clique dans la fenˆ etre on enregistre la position de la souris dans une variable de type Point.
• Si quatre points ont ´ et´ e cr´ e´ es de cette fa¸con afficher le message ”Dessin courbe de B´ ezier”
• Si l’utilisateur clique une cinqui` eme fois afficher le message ”Efface courbe de
B´ ezier” et consid´ erer ce nouveau point comme le premier d’une nouvelle courbe
de B´ ezier
2
Exercice 3. Nous allons maintenant dessin´ e les points d´ efinissant la courbe de B´ ezier.
a. Ecrire une fonction permettant de dessiner un ´ point A sous la forme d’un carr´ e de centre A. Les arrˆ etes du carr´ e seront de longueur 2c + 1 o` u c sera un entier positif qu’on d´ eterminera pour avoir un rendu satisfaisant. Vous pourrez tracer le carr´ e de la couleur que vous souhaitez.
b. Afficher les points d´ ej` a saisis lors de la construction de la courbe de B´ ezier ` a l’aide de la souris
Exercice 4.
a. Ecrire une fonction qui ´ etant donn´ e quatre points dessine une ligne bris´ ee reliant ces points.
b. Modifier le code de la fonction main pour que la ligne bris´ ee reliant les 4 points soit afficher lors de l’affichage du message ”Dessin courbe de B´ ezier”.
c. D` es que le message ”Efface courbe de B´ ezier” est affich´ e il faut que la ligne bris´ ee ne soit plus affich´ ee ` a l’´ ecran.
Nous disposons maintenant de tous les outils n´ ecessires pour tracer la courbe de B´ ezier
`
a l’aide de l’algorithme de De Casteljau.
A
B C
D
AB
BC
CD
ABC BCD
ABCD
Les points AB, BC, CD, ABC, BCD et ABCD sont plac´ es au milieu de leur segement respectif.
On dira qu’une courbe de B´ ezier d´ efinie par les points A, B, C et D est n´ egligeable si toutes les distances d(A, B), d(B, C), d(C, D) et d(A, D) sont inf´ erieurs ` a 0.1. Le tracer de la courbe de B´ ezier d´ efinie par les points A, B, C, D est
• la ligne reliant A ` a D si la courbe est n´ egligeable
• obtenu en tra¸cant la courbe de B´ ezier d´ efinie par le points A, AB, ABC, ABCD puis celle d´ efinie par les points ABCD, BCD, CD, D.
Exercice 5. Ecrire des fonctions permettant de :
a. D´ ecider si quatre points d´ efinissent une courbe de B´ ezier n´ egligeable.
b. Tracer la courbe de B´ ezier d´ efinie par quatre points donn´ es.
Exercice 6. Finir de tout mettre en place.
3
2. Pendule oscillant
Dans cette section nous souhaitons mod´ eliser un pendule oscillant ` a l’aide des m´ ethodes de Runge-Kutta d’ordre 1 et 2 (RK1 et RK2). Rappelons que ces m´ ethode permettent de r´ esoudres num´ eriquement des ´ equations diff´ erentielles du type :
y
0(t) = f(t, y(t)) et y(0) = y
0(1)
o` u y : R
+→ R
dest une fonction inconnue, t est une variable parcourant R
+, le vecteur y
0de R
dest la condition initiale et f : R
+× R
d→ R
dest une fonction connue d´ ependant du probl` eme ` a ´ etudier.
Nous rappelons aussi que pour tout intervalle I, une fonction g : I → R
dest donn´ ee par
g(t) =
g
1(t)
.. . g
d(t)
pour t ∈ I,
o` u g
1, . . . , g
dsont des fonctions de I dans R . De plus si g est d´ erivable sur I alors nous avons
g
0(t) =
g
10(t)
.. . g
d0(t)
pour t ∈ I.
Les m´ ethodes de Runge-Kutta ne donneront pas la fonction y solution de (1) mais donneront des valeurs approch´ ee de y(t) pour certaines valeurs de t. Commen¸cons par fix´ e un r´ e´ el strictement positif h suppos´ e petit. Pour tout n ∈ N , on pose t
n= n × h.
Nous souhaitons alors obtenir une valeur approch´ ee a
nde y(t
n) pour tout n ∈ N .
Pour les deux m´ ethodes, la suite (a
n) est d´ efinie par r´ ecurrence ` a partir de a
n= y
0et les formules de r´ ecurrence suivantes :
• a
n+1= a
n+ hf (t
n, a
n) pour la m´ ethode RK1,
• a
n+1= a
n+ hf t
n+
h2, a
n+
h2f(t
n, a
n)
pour la m´ ethode RK2.
Le code demand´ e sera ` a ´ ecrire dans le fichier main.cpp du r´ epertoire pendule1
Exercice 7. On consid` ere un pendule oscillant de masse m accroch´ e en A ` a l’aide d’une tige de longueur `. On note θ l’angle que forme la tige du pendule avec la verticale.
A θ `
a. Compl´ eter la fonction dessine pendule(double theta) permettant de dessiner le pendule (et sa tige) pour un angle θ donn´ e. Le point A sera le milieu de la fenˆ etre, la longueur de la tige sera de 200 pixels et le rayon du cercle sera de 30 pixels.
b. Tester votre fonction pour diff´ erentes valeurs de θ.
4