Skip to content

Vector

But de l'éxercice

Le but de l'exercice est d'ecrire une class Vector, dans un fichier vector.py dont le but est de representer un vecteur de dimension 3.

Et voila le script de tests unitaires: test_vector.py

Utilitaires

Un vecteur est un objet mathématique qui permet de représenter un deplacement.

Si nous sommes sur le point A, et que nous allons sur le point B, alors, le déplacement entre A et B est nommé vecteur A B et noté \overrightarrow{AB} (TODO: make an image)

Chacune des composantes d'un vecteur est égale à la composante de la destination moins la composante de la source.

Si A est le point (xa, ya, za) et B (xb, yb, zb); alors le vecteur \overrightarrow{AB} a pour composante: (xb - xa, yb - ya, zb - za).

Ajouter des vecteurs correspond aussi à ajouter les deplacements. Pour obtenir le vecteur correspondant, on ajoute une à une chaque composante des vecteurs qu'on additionne.

Mais il y a une certaine singularité par rapport à la vraie vie: * si dans la vraie vie vous allez de A à B puis de B à C, alors vous aurez fait un passage par B * en math, si on ajoute les 2 deplacements AB, puis BC, alors c'est comme si on n'était pas passé par B, mais qu'on avait fait le déplacement direct de A à C.

Demonstration si on prend les composantes x uniquement: * le vecteur AB: xB - xA * le vecteur BC: xC - xB * la somme de AB et BC: (xB - xA) + (xC - xB) == xC - xA

On n'a pas additionné les distances de deplacement en fait, on a juste fait la route la plus courte

Voilà qui est bien suffisant pour cet exercie.

Exercice de base

Note

pour cet exercie, les points ne seront que de simples tuples, mais on peut tout autant imaginer les faire sous forme de classe afin de leur donner a eux aussi un certain nombre d'operations (par exemple: un point moins un autre devrait retourner le vecteur correspondant au deplacement ;))

Il va donc falloir ici écrire une classe qui permette de représenter un vecteur:

  • le constructeur prendra 2 tuples de dimension 3 qui représentent la source, puis la destination.
  • on devra pouvoir obtenir leur coordonnées avec .x, .y et .z, et les modifier
  • on pourra les comparer afin de savoir si un vecteur est égal à un autre (toutes leurs coordonnées son égales une a une)
>>> A = (0, 1, 2)
>>> B = (2, 1, 0.5)
>>> v1 = Vector(A, B)
>>> v1
Vector(x=2, y=0, z=-1.5)
>>> v1.x
2
>>> v2 = Vector(A, B)
>>> v1 == v2
True
>>> v1.x = 0
>>> v1 == v2
False

Et voilà pour l'exercice de base. Si vous arrivez à résoudre cet exercice assez rapidement (et je n'en doute pas) vous pourrez vous amuser un peu plus avec les bonus suivants.

Bonus numéro 1

Ajouter la possibilité d'additionner des vecteurs, mais aussi de les soustraires (addition avec l'opposé)

>>> O = (0, 0, 0)
>>> A = (1, 1, 1)
>>> B = (2, 0, 2)
>>> OA = Vector(O, A)
>>> OB = Vector(O, B)
>>> AB = Vector(A, B)
>>> BA = Vector(B, A)
>>> AB + BA
Vector(x=0, y=0, z=0)
>>> OA + AB == OB
True
>>> OA - AB == OB
False
>>> OA - BA == OB
True

Bonus numéro 2

Autoriser la multiplication d'un vecteur par un nombre afin de lui appliquer un facteur d'échelle: AB * 2 == AB + AB

>>> O = (0, 0, 0)
>>> A = (1, 1, 1)
>>> OA = Vector(O, A)
>>> OA * 2 == OA + OA
True
>>> OA * 4 == 4 * OA
True

Bonus numéro 3

Permette de dépaqueter les composantes du vecteur pour, par exemple itérer dessus.

>>> O = (0, 0, 0)
>>> A = (1, 1, 1)
>>> OA = Vector(O, A)
>>> x, y, z = OA
>>> x, y, z
1, 1, 1

Aide

Si vraiment vous êtes bloqué.e.s, vous pouvez regarder ces articles:

Solution

Voir la solution