Home CAMA : ma02 Changement de repere
Post
Cancel

CAMA : ma02 Changement de repere

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))

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) :

1
D @ (J-O) # donne AC
1
array([-1.5,  1. ])

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
1
array([5., 4.])

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]))])
1
P @ to3D(J)  # is C
1
array([1.5, 4. , 1. ])

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é)
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 

This post is licensed under CC BY 4.0 by the author.