Lien de la note Hackmd
Cours du 30 / 03
Matrice de passage
Une matrice peut representer un changement de repere :
1
2
3
4
5
6
7
| O = np.array((0,0))
I = np.array((1,0))
J = np.array((0,1))
A = np.array((3,3))
B = np.array((5,4))
C = np.array((1.5,4))
|
La matrice de passage sans la translation est l’ensemble des vecteurs de la seconde base exprimes dans la premiere.
1
| D = np.array([(B-A), (C-A)]).T # déformation sans la translation
|
1
2
| array([[ 2. , -1.5],
[ 1. , 1. ]])
|
Vecteurs dans le nouveau repère
On exprime le vecteur $OJ$ dans la base rouge en utilisant la matrice de passage (l’origine d’un repere n’est pas utile pour un vecteur) :
Points dans le nouveau repère
Il faut prendre en compte la translation d’un repere d’un repere vers l’autre en separant la deformation de la translation pour rester en 2D :
1
| A + D @ I # passage de I en B
|
On peut integrer la translation dans une matrice d’une dimension superieure (cf ma01).
1
2
3
| P = np.identity(3) # definie la taille et initialise la derniere ligne (les autres seront remplacees)
P[:2, :2] = D # deformation
P[:2, 2] = A # translation
|
1
2
3
| array([[ 2. , -1.5, 3. ],
[ 1. , 1. , 3. ],
[ 0. , 0. , 1. ]])
|
1
2
3
4
5
| def to3D(x):
if len(x.shape) == 1:
return np.array([*x,1])
elif len(x.shape) == 2:
return np.array([*x,np.ones(len(x[0]))])
|
Une application linéaire transposée dans le nouveau repère
Appliquons une rotation qui prend un point et le fais tourner dans le sens trigonométrique de θ autour de (0,0). Que fait cette rotation dans notre nouveau repere?
- on applique plusieurs fois une rotation au point (1,0) autour de O (le cercle bleu)
- on déforme le cercle bleu avec la matrice de passage P (la forme noire)
- on applique plusieurs fois la rotation déformée par P du point B autour de A (la forme orange pointillé)
Pour calculer la rotation R dans le nouveau repere : \(Q = P \, R \, P^{-1}\) avec $P^{-1}$ permettant de revenir au repere d’origine pour effectuer la rotation
1
2
3
4
5
| def Rot(θ):
return np.array([[np.cos(θ), -np.sin(θ)], [np.sin(θ), np.cos(θ)]])
def Rot3D(θ):
return np.array([[np.cos(θ), -np.sin(θ), 0], [np.sin(θ), np.cos(θ), 0], [0, 0, 1]])
|
1
2
3
4
5
6
7
8
9
10
11
| # plusieurs rotation qui donnent le cercle bleu :
cercle = np.array([Rot(α) @ I for α in np.linspace(0, 2*np.pi, 10)]).T
# le cercle exprimé dans le nouveau repère (noir)
p_cercle = P @ to3D(cercle)
# construction de Q
Q = lambda θ: P @ Rot3D(θ) @ lin.inv(P) # définition de Q en fonction de θ
# on applique Q pour faire tourner B autour de A (orange)
p_rot_A = np.array([Q(α) @ to3D(B) for α in np.linspace(0, 2*np.pi, 10)]).T
|