# CAMA : ma02 Changement de repere
# Cours du 30 / 03
## Matrice de passage
Une matrice peut representer un changement de repere :
```python=
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))
```
![](https://i.imgur.com/23vasZo.png)
:::danger
La matrice de passage sans la translation est l'ensemble des vecteurs de la seconde base exprimes dans la premiere.
```python=
D = np.array([(B-A), (C-A)]).T # déformation sans la translation
```
```
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) :
```python=
D @ (J-O) # donne AC
```
```
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 :
```python=
A + D @ I # passage de I en B
```
```
array([5., 4.])
```
On peut integrer la translation dans une matrice d'une dimension superieure (cf ma01).
```python=
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
```
```
array([[ 2. , -1.5, 3. ],
[ 1. , 1. , 3. ],
[ 0. , 0. , 1. ]])
```
```python=
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]))])
```
```python=
P @ to3D(J) # is C
```
```
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é)
:::danger
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
:::
```python=
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]])
```
```python=
# 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
```
![](https://i.imgur.com/5y3SBqb.png)