Projets 2023
Projets 2023
Projets 2023
ENSAF/GSEII1
2023-2024
C++ : Mini-Projets
Projet : Class Complex et Class Point
Complément du cours:
Un opérateur de conversion peut être défini pour convertir des objets de classes dans un type fondamental ou dans un autre objet
de classe défini par l’utilisateur. Les prototypes suivants :
déclarent un opérateur de conversion, qui peut convertir un objet de MyClass en entier (Le premier prototype), ou en un objet de
OtherClass (le deuxième prototype).
2. Se définir l’opérateur de conversion de la classe Complex → classe Point et réciproquement de la classe Point → classe
Complex et vérifier les deux conversions dans un programme principal Test.cpp.
3. Surdéfinir la méthode operator + dans la classe Complex et vérifier que les deux cas suivants marchent :
• Complex z3 = z1 + z2;
• Complex z4 = z1 + 1.f ;
4. Allons plus loin, écrire un point comme la somme d’un complexe et d’un point et réciproquement un complex comme la
somme d’un complexe et d’un point.
5. Ecrire maintenant un point comme somme de deux points. Proposer une solution raisonnable pour les deux composants
Point et Complex.
7. Surdéfinir les operators de flux entrant et sortant, afin d’afficher et lire des complex.
8. Créer un tableau de Complex * dynamiquement, de dimension 3 et initialiser ce tableau et chaque sous-tableau (selon votre
imagination) de dimension 3.
Projet : Polynôme
Introduction et notions de base
i=0
Dimension Pk = k + 1.
Les applications f :
t ∈ R −→ ti , i ∈ [0, k]
constituent une base de Pk et est appelée base canonique de Pk ou base des
monômes.
1
*Règle de Hörner Soit
p(t) ∈ Pk , p(t) = a0 + a1 t + · · · + ai ti + · · · + ak tk .
p(ti ) = pi , i = 0, · · · , k
Matrice de Vandermonde
Ce polynôme est unique et vérifie le système linéaire suivant :
k
"
aj tji = pi i = 0, · · · , k
j=0
2
et est donc différent de zéro si les valeurs ti sont distinctes.
Exemples:
k=1 ) )
) 1 t0 )
det[M ] = ) ) = t1 − t0
) 1 t1 )
k=2 ) )
) 1 t0 t20 )
) )
det[M ] = ) 1 t1 t21 ) = (t2 − t0 )(t2 − t1 )(t1 − t0 )
) )
) 1 t2 t22 )
det[M ] = (ti − tj ) × · · ·
det[A]T = det[A]
1.
det[A]−1 =
det[A]
Posons
) )
) a1,1 a1,2 · · · a1,n )
) )
) a2,1 a2,2 · · · a2,n )
) )
det[A] = )) ··· ··· ··· ··· ) = ∆(a1 , a2 , · · · , ai , · · · , an )
)
) ··· ··· ··· ··· )
) )
) an,1 an,2 · · · an,n )
3
Par conséquent, de la colonne j de la matrice [M] retranchons la colonne j-1
multipliée par t0 pour j variant de n à 2 et on obtient :
) )
) 1 0 0 ··· 0 )
) )
) 1 t1 − t0 (t1 − t0 )t1 · · · (t1 − t0 )tk−1 )
) 1 )
det[M ] = ∆(t0 , · · · , tk ) = )) · · · ··· ··· ··· ··· )
)
) ··· · · · · · · · · · · · · )
) )
) 1 tk − t0 (tk − t0 )tk · · · (tk − t0 )tk−1 )
k
Donc
k
* k−1
* k
*
det[M ] = ∆(t0 , · · · , tk ) = ∆(t1 , · · · , tk ) (ti − t0 ) = (tj − ti )
i=1 i=0 j=i+1
4
• L’opérateur d’affectation = :
Polynome & operator = ( const Polynome &)
• L’opérateur () qui renvoie la valeur du polynôme de la variable x
en utilisant la règle de Hörner:
double operator () ( double )
• L’opérateur + qui effectue la somme de deux polynômes.
Polynome operator + ( const Polynome & ) ;
• L’opérateur * qui effectue le produit de deux polynômes.
Polynome operator * ( const Polynome & ) ;
• Le constructeur d’interpolation qui calcule les coéfficients A[i] à
partir d’un tableau de double T, T[i] i=1,ordre , valeurs distinctes
et d’un tableau double B.On utilisera la classe Matrice, définie
dans le TP
Polynome( double * T, double * B) ;
5
Projet sur les courbes de Bézier
Base de Bernstein
Définition 1. Considérons Pk[0, 1] l’espace des polynômes de degré ≤ k définis sur [0,1] et à
valeurs dans R.
Les fonctions définies par :
! " ! " k!
k i k 0≤i≤k
Bik(t) = t (1 − t)k −i oú = i!(k − i)!
i i
0 sinon
1
Proposition 2. En posant
Démonstration:
Pour k = 1
! "
k
Bik(t) = ti(1 − t)k −i
i
! " ! "
k −1 k−1
= i
t (1 − t)k−i
+ ti(1 − t)k −i
i i−1
! " ! "
k −1 k −1
= (1 − t) ti(1 − t)k −i−1 + t ti−1(1 − t)k−i
i i−1
Bik(t) = (1 − t)Bik−1(t) + t Bi−1 k−1
(t)
Proposition 3.
k
&
Bik(t) = 1, ∀t![0, 1].
i=0
i
3. La fonction Bik(t) atteint son maximum en t =
k
d Bik(t) k −1
4. = k(Bi−1 (t) − Bik−1(t))
dt
5. Les polynômes de Bernstein sont symétriques en t et 1-t
k
Bik(t) = Bk−i (1 − t)
Démonstration:
2
3. Dérivons Bik(t) :
! " ! "
d Bik(t) k i−1 k−i k
= i t (1 − t) − (k − i) ti(1 − t)k−1−i
dt i i
! "
d Bik(t) k
= ti−1(1 − t)k−1−i(i(1 − t) − (k − 1)t)
dt i
! "
d Bik(t) k
= ti−1(1 − t)k−1−i(i − t k)
dt i
d Bik(t) i
s’annule pour t = 0, t = 1 et t =
dt k
i
Bik(t) s’annule également pour t = 0, t = 1 et est positive, donc la valeur t = est bien un
k
maximum
4. Dérivons Bik(t) :
! " ! "
d Bik(t) k k
= i ti−1(1 − t)k−i − (k − i) ti(1 − t)k−1−i
dt i i
d Bik(t) k! k!
= ti−1(1 − t)k−i − ti(1 − t)k−1−i
dt (i − 1)!(k − i)! i!(k − i − 1)!
d Bik(t) k−1
= k(Bi−1 (t) − Bik−1(t))
dt
Courbes de Bézier
Algorithme de De Casteljau
2
&
γ(t) = Bi2(t)Pi , P0, P1, P2 points de contrôle
i=0
P11(t) = (1 − t)P0 + t P1
P21(t) = (1 − t)P1 + t P2
P22(t) = (1 − t)P11(t) + t P21(t)
P22(t) = (1 − t)2P0 + 2(1 − t)t P1 + t2P2 = γ(t)
3
Algorithme général
Pi0(t) = Pi , i = 0, , k
Pir+1 = (1 − t)Pi−1
r
(t) + t Pir(t), i = r + 1, ,k r = 0, ,k −1
Supposons que c’est vrai pour r et montrons que c’est également vrai pour r+1
Pir+1(t) = (1 − t)P r
(i−1 (t) + t Pir(t) ) ( r )
&r &
r+1 r r
Pi (t) = (1 − t) B j (t)Pi−1−r+ j + t B j (t)Pi−r+j
j =0 j =0
( r
) ( r+1 )
& &
Pir+1(t) = (1 − t) B jr(t)Pi−1−r+ j +t r
B j −1(t)Pi−r+ j −1
j =0
( r+1 ) ( jr+1
=1
)
r+1
& &
r r
Pi (t) = (1 − t) B j (t)Pi−1−r+ j + t B j −1(t)Pi−r+ j −1
j =0 j =0
r+1
&
Pir+1(t) = ((1 − t)B jr(t) + t B jr −1(t))Pi−r −1+ j
j =0
r+1
&
Pir+1(t) = B jr+1(t)Pi−r −1+ j
j =0
Propriétés
Remarque
k
&
Bik(t) ≥ 0 et Bik(t) = 1
i=0
par conséquent, chaque point de la courbe de Bézier, γ(t), est combinaison convexe des points
de contrôle Pi, affectés des poids Bik(t).
2. Invariance affine
φ application affine
k
& k
&
φ( Bik(t)Pi) = Bik(t)φ(Pi)
i=0 i=0
k
& k
& u−a
Bik(t)Pi = Bik( )Pi t ∈ [0, 1], u ∈ [a, b]
b−a
i=0 i=0
4
4. Symétrie
k
&
γ(t) = Bik(t)Pi
i=0
k
&
k
γ(t) = Bk−i (1 − t)Pi
i=0
k
&
γ(t) = Bik(1 − t)Pk−i
i=0
s(t) = 1 − t
t(s) = 1 − s
γ " = γo t
&k
γ "(s) = Bik(s)Pk −i
i=0
Les courbes γ(t) et γ (s) sont identiques mais leur sens de parcours est différent.
"
γ(0) = P0
γ(1) = Pk
γ "(0) = Pk
γ "(1) = P0
Dérivée première
k−1
& k−1
d γ(t)
Proposition 6. =k Bi (t)(Pi+1 − Pi)
dt
i=0
Démonstration:
d Bik(t) k −1
= k(Bi−1 (t) − Bik−1(t))
dt
&k
d γ(t) d Bik(t)
= Pi
dt dt
i=0
k
& k −1
= k(Bi−1 (t) − Bik −1(t))Pi
(
i=0
k k
)
& k −1
&
= k Bi−1 (t)Pi − Bik −1(t)Pi
( i=0 i=0 )
k
& k−1
&
k −1
= k Bi−1 (t)Pi − Bik−1(t)Pi
( i=1 i=0 )
k−1
& k
& −1
= k Bik −1(t)Pi+1 − Bik−1(t)Pi
i=0 i=0
k
& −1
= k Bik−1(t)(Pi+1 − Pi)
i=0
∆Pi = Pi+1 − Pi
∆rPi = ∆(∆r −1Pi) = ∆r −1Pi+1 − ∆r −1Pi
5
Exemples
∆0Pi = Pi
∆1Pi = Pi+1 − Pi
∆2Pi = Pi+2 − 2Pi+1 + Pi
∆3Pi = Pi+3 − 3Pi+2 + 3Pi+1 − Pi
Soit
r
& ! "
r
∆rPi = ( − 1)r − j Pi+j
j
j =0
drγ(0) k!
= ∆rP0
dt r (k − r)!
drγ(1) k!
= ∆rPk −r
dt r (k − r)!
d γ(0)
= k(P1 − P0)
dt
d γ(1)
= k(Pk − Pk−1)
dt
Soit une courbe de Bézier γ(t), exprimée dans la base de Bernstein de degré k (Bik(t), i = 0, , k)
on aimerait l’exprimer dans la base (Bik+1, i = 0, , k + 1), autrement dit, élever son degré de k à
k + 1.
k
& k+1
&
γ(t) = Bik(t)Pi = Bik+1(t)P̂i
i=0 i=0
Par conséquent, trouvons une relation entre les points Pi , i = 0, , k et P̂i , i = 0, ,k+1
k !
& " & ! k+1 "
k+1
k i k−i
t (1 − t) Pi = ti(1 − t)k+1−iP̂i
i i
i=0 i=0
k !
& "
k
(ti+1(1 − t)k−i + ti(1 − t)k+1−i)Pi
i
i=0
k + 1! k! k!
P̂i = Pi + Pi−1
i!(k + 1 − i)! i!(k − i)! i − 1!(k − i − 1)!
6
i i
P̂i = Pi−1 + (1 − )Pi , i = 1, ,k
k+1 k+1
P̂0 = P0
P̂
k+1 = Pk
Problème d’interpolation
i=k
On se donne une suite de points {Qi }i=0 , on veut définir la courbe de Bézier qui passe par ces
points.
Il faut se définir une paramétrisation {ti }i=k
i=0 de la courbe à partir des points donnés et le prob-
lème à résoudre est le suivant:
k
&
Bik(t j )Pi = Qj pour j = 0, ,k
i=0
Le nombre de points doit être égal à degré +1 et on peut pas augmenter indéfiniment le degré
de la base de Bernstein.
Si le nombre de points n+1 > degré k + 1, on a trois systèmes à n+1 équations pour k + 1
inconnues.
Pour un grand nombre de points le problème d’interpolation est à remplacer par le problème de
minimisation suivant:
Etant donnés n+1 points Q j , trouver les points Pi pour i = 0, , k qui minimisent:
* k
n *&
*2
& *
* *
* Bik(t j )Pi − Qj*
* *
j =0 i=0
pour k + 1 inconnues.
7
// Le vecteur Poles[2] contient les cotes des points de contrôle.
friend ostream & operator ' ( ostream & , const CourbeBezier & ) ;
void ConstruitMoindresCarresMatrice() ;
qui construit la matrice des moindres carrés associée à la matrice de Bernstein.
Vecteur SecondMembre(Vecteur) ;
qui calcule le second membre associé au système des moindres carrés.
Il faudra adapter le constructeur pour qu’il puisse traiter les deux problèmes suivants
NbPoints > Degre +1 ou égal.