suivant: Enveloppe de droites
monter: Les courbes de Bézier
précédent: Courbe de Bézier pour
Table des matières
Index
Une application amusante du barycentre est le morphing.
Prenons tout d'abord un exemple simple :
On considère six points
A, B, C, D, E, F, la courbe de Bézier
C1 définie par A, B, C et la courbe de Bézier
C2 définie par D, E, F.
Soient
t
[0;1] et M (resp N, P) le barycentre de (A, 1 - t) et de
(D, t) (resp de (B, 1 - t) et de (E, t), de (C, 1 - t) et de (F, t)).
Lorsque t varie de 0 à 1 la courbe de Bézier définie par
M, N, P se déforme en passant de C1 à C2.
On écrit la fonction baryc égale à la courbe intermédiaire de paramètre t :
baryc(A1,B1,C1,A2,B2,C2,t):={
local M1,M2,M3;
M1:=bary(A1,A2,t);
M2:=bary(B1,B2,t);
M3:=bary(C1,C2,t);
return(courb(M1,M2,M3));
};
puis, les instructions permettant de faire bouger la courbe intermédiaire :
courb(A,B,C);
courb(D,E,F);
t:=element(0..1);
baryc(A,B,C,D,E,F,t);
Prenons maintenant l'exemple où deux courbes de Bézier sont définies par des listes de points
L1 et L2 de même longueur. On définit la liste L3
obtenue en formant le barycentre des points de L1 avec ceux de L2
affectés des coefficients 1-t et t (
).
On représente la courbe de Bézier définie par la liste L3
en faisant varier t cette courbe se déforme et passe de la courbe
définie par L1 à celle définie par L2 lorsque t varie de 0 à 1.
Voici par exemple le programme :
baryl(L1,L2,t):={
local L3,s1,s2;
s1:=size(L1);
s2:=size(L2);
if (s1 !=s2) {s1:=min(s1,s2)};
L3:=[];
for (k:=0;k<s1;k++) {
L3:=append(L3,evalf(L1[k]*(1-t)+L2[k]*t));
}
return(eval(L3));
};
ou plus simplement
barycl(L1,L2,t):=evalf(t*L2+(1-t)*L1)
Par exemple, on clique avec la souris les points :
A,B,C,D,E,F,G,H,J,K,L,M,N,O,P
Par exemple vous pouvez utiliser les points qui se trouvent dans le fichier
pointmorph
puis on exécute un fichier contenant les commandes (c'est le fichier
morphing) :
t:=element(0..1);
courbl([A,B,C,D,E,F,G,H,A]);
courbl([J,K,L,M,N,O,L,P,J]);
courbl(baryl([A,B,C,D,E,F,G,H,A],[J,K,L,M,N,O,L,P,J],t));
ou encore
courbl([A,B,C,D,E,F,G,H,A]);
courbl([J,K,L,M,N,O,L,P,J]);
t:=element(0..1);
baryc(A,B,C,J,K,L,t);
baryc(C,D,E,L,M,N,t);
baryc(E,F,G,N,O,L,t);
baryc(G,H,A,L,P,J,t);
On peut ensuite s'amuser à changer la valeur de t et aussi déplacer
les différents points.
On pourra se référer aux fichiers bezier qui contient les fonctions qui suivent :
// -*- mode:C++ -*-
//fonction f(0)=A f(1)=C f'(0)=AB f'(1)=BC qui renvoie 1 pt
bezier3(A,B,C,x):={
evalf(A*(1-x)^2+2*B*x*(1-x)+C*x^2);
};
//dessin de la courbe en parametrique passant par A et C
//et tgte a AB et a BC
courb(A,B,C):={plotparam(affixe(bezier3(A,B,C,x)),x,0,1);};
//fonction donnant le barycentre de (A1,1-t) et de (A2, t)
bary(A1,A2,t):={evalf(t*A2+(1-t)*A1);};
//dessin de la courbe barycentre de (courb(A1,B1,C1),1-t)
//et de (courb(A2,B2,C2),t)
//on place les 6 pts puis on definit t:=element(0..1) on peut voir
//la deformation de la courbe qd on fait varier t.
baryc(A1,B1,C1,A2,B2,C2,t):={
local M1,M2,M3;
M1:=bary(A1,A2,t);
M2:=bary(B1,B2,t);
M3:=bary(C1,C2,t);
courb(M1,M2,M3);
};
baryl(L1,L2,t):={
local L3,s1,s2;
s1:=size(L1);
s2:=size(L2);
if (s1 !=s2) return("erreur");
L3:=[];
for (k:=0;k<s1;k++) {
L3:=append(L3,bary(L1[k],L2[k],t));
}
return(eval(L3));
};
barycl(L1,L2,t):=evalf(t*L2+(1-t)*L1);
bezierl(L,x):={
local LS,A,B,C;
LS:=[];
for(j:=0;j<size(L)-2;j:=j+2){
A:=L[j];B:=L[j+1];C:=L[j+2];
LS:=append(LS,affixe(evalf(A*(1-x)^2+2*B*x*(1-x)+C*x^2)));
};
eval(LS);
};
courbl(L):={
local LB,LS;
LS:=[];
LB:=bezierl(L,x);
for (j:=0;j<size(LB);j:=j+1) {
LS:=append(LS,plotparam(LB[j],x,0,1));
};
return(feuille(LS));
};
suivant: Enveloppe de droites
monter: Les courbes de Bézier
précédent: Courbe de Bézier pour
Table des matières
Index
Documentation de giac écrite par Renée De Graeve