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,.yet.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:
- Creating a class
- Customizing string representations
- Comparing equality of tuplesAdding class instances
- Allowing objects to be multiplied by numbers
- Handling operations with arbitrary types
- Multiple assignment and tuple unpacking
- Creating objects that work with multiple assignment