Géométrie vectorielle en POO

On se propose de créer une classe Vecteur qui permet de réaliser des calculs de géométrie vectorielle.

Cette classe s'appuie sur la classe Point que l'on devra compléter et dont la définition partielle de la classe est présentée ci-dessous :

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
Classe Point

Compléter les méthodes abscisse et ordonnee de la classe Point qui renvoient respectivement les attributs x et y de l'objet.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(40i2edxm3s7= 1o5w_lSnatf)9h6,crg.yPku8/050l0k0C0B0i0y0p0s0J0y0B0p0p0r010C0i0c010406050p0Q0n0n0B0K0N040z0u0y0Q0-0u0A050S0@0_0{0}0=0c04161d051g0S1g1i1d0=0l0i0e0#0%0)0+0G0i0L0G0y1w0G0C0:050W0d0y0k1r0(0*011v1x1z1x0C1F1H1D0C0d0u0l0}1E0K1e0C0G0#100p0c0B0A0+0j011J1t010D0Y0k0A0B0n0k1D1+1-1=1L1^1H1{1}0:0a0s0O0K0u0c0u0p0i130A0s0U1)0K0K0k0J2i16200A1e0S1%2v0C1#1!1$0l220+1z0A1`2f1D1o1q0$1K2F0i2H0A1X1p1D0c2o1e2t2v2Z0?1,2j2N1?2S0K0`0y0:0s0t2s2%0;2$212)1L2+2-2/0j2=1-2@2t2E012|0B2.040s0o302u0=332`0+36380s0g3c322%343i2/0v3m3e3o3g350u2,372/0H3t2^2(1s2{3y2}390q3D3f3G3h3I3A390R3M3v3O3x3z3j0F3U2_3W3q040t0h3m1f2X162L2y0l2C340J1X1~1e3:1h3.2#172?053^0U2Y3V2O010P0:2`3,3N470w2/4c462*0J0:0O0u2Q0C4h3$470/040b3t0s4x0s3E3449040U0D4q3F4e4g40314A3w0D0n0:0x0x2Q2h4R4G344t0f4W3w0d4t0p0k0y4F4K2u4M3W4t0I3m4z4d2*0:0m4!4/0:4;4,394.470A0:0N4{4s0:0E4v4 064y5d4?4i1L4$0:4(4*561?0u0:0M5m2{4_4=515n0:0r5u4@5s044`5b5e4y5v5h4%4)4+2#5A0+5o045q4 5H3h545z5g5O5x5W4r4^04555b5c5G5N480:4E5r0+4f505S5,0A0D0:0B0d0p0J0i0)0k5:014Y635i045k5L415,4t594w5F5f5#1L4C2o0C0Q0K154 6h4H1?6769635P5R5M5X355t5)5d5T5-4D0k6a4L5,5=4z5@6A5_0:3y0l142H626O6i0+656X6s5I5j5K636d5a2Z5*5F6F6k0V6n6p2Z6r346u6)6#346x63535%3D0S430k2v2W763/1p3;2y2A2w1W1Y2y5|1H2v3:0=0S0U0W0Y0p04.
Constructeur de la classe Vecteur

Soit \(A\) et \(B\) deux points du plan. On souhaite connaître les coordonnées du vecteur \(\overrightarrow{AB}\).

L'instance de la classe Vecteur associée au vecteur \(\overrightarrow{AB}\) sera notée vAB.

Compléter le constructeur de la classe Vecteur qui prend en paramètres deux instances A et B de la classe Point représentant deux points \(A\) et \(B\), et initialise les attributs x et y, qui représentent les coordonnées du vecteur \(\overrightarrow{AB}\).

Rappels mathématiques

Soit \(A\) et \(B\) deux points du plan, respectivement de coordonnées \((x_A, y_A)\) et \((x_B, y_B)\).

Alors le vecteur \(\overrightarrow{AB}\) aura pour coordonnées \((x, y)\) avec \(x = x_B - x_A\) et \(y = y_B - y_A\).

Exemples
>>> A = Point(0, 2)
>>> B = Point(3, 6)
>>> vAB = Vecteur(A, B)
>>> vAB.x
3
>>> vAB.y
4

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(4i2edmx3;s= 1Vo5w_lSnatf-)OhR6qcrg,.éyPku/050k0j0C0B0h0y0p0r0L0y0B0p0p0q010C0h0c010406050p0U0l0l0B0M0R040z0u0y0U0:0u0A0r020B0l0c0o0r0I0j0}0M0K0U0j0p050V0`0|0~100^0c041o1v051y0V1y1A1v0^0k0h0e0(0*0,0.0H0h0N0H0y1O0H0C0?050Z0d0y0j1J0+0-011N1P1R1P0C1X1Z1V0C0d0u0k101W0M1w0C0H0(130p0c0B0A0.0i011#1L010D0#0j0A1b0j1V2022271%2a1Z2d0l2f040a0r0S0M0u0c0u0p0h16180X1~0M0M0j0L2A1o2h0A1w0V1|2M0C1`1_1{0k2j0.1R0A2c2x1V1G1I0)1$2W0h2Y0A1?1H1V0c2F1w2K2M2@0_21182(282-0M0}0y0?0s2J2{0@2`2i2}1%2 310?0i3522372K2V013c0B32040n3g2L0^3j3a0.3m3o0g3r3i2{3k3x0?0v3A3t3C3v3l0u303n0?0J3A1x2=1o2$2P0k2T3k0L1?2p0W1H1w2;0j2?363R3!0X3,391K1%0T0A0?0D2u0l3R3u3?0.0w0?0r3~3J403l3_040}1|453=2)014204441p3-3 4f3^0?0h1c3M0C3A444m2~0?0p0K0M4t4k3h063I4e280T0?3a4d2|474h4j2_4w3b0L0?0t2G0C0j0U0M4M3k0=040b3H0r4,4v464n0?0X0D4$3K4P4@470D0l0?0x0x2+2z4 4`4f4(0f54280d4(0p0j0y4?4D2L384N550?0O4u5i3D0?2w2+0C345g3;5j284(5m5v4.4H3b5q0u5s3f5v5o3K4(0F4*5v064-5R5C5x1%5a4y5d5f4R4/280u0?0P585E040m5n4S0.5%040q5.5#5+5r0A0C5I5!5D5:5(5*3w0?0B0d0p0L0h0,0j6201560F5@5 015;0E6g5U63045`5t6c5;5)5J5/3l6466686a6c6e4+5S4,5K475W045c5e6r616u5^6n0R6l3k5;5?5B6G4f496p5}4l6P6i6N5~6m6w043M0k172Y6b6O6h6C6W6v6j6S3K6Z5G5{5u6*6T6)6$6h496.6:0j6=725L0?0f6f5P1o3/3+3S7k0V3V1o0C3X7p2R2N1=1@2P651Z2M3V1u5w3k2F0l0x0D0B0T0j0x0H0n0?1g1i1k1m0r5O2_1B371v0G180c4Z0C0r0k220%0L1!0L0+0r150#690j0M0r2+1G0D0D0Q7F2o5{0r1Z0%0_2Q170N041$1m5c4!1n1p870A89447j8a6y695c7i3#4i0Y8k8r780A6;8q3:0r0u0U7)0h2F2H1h2c7(840r0B1-0M0h0d15858l5-0V8l0r8t058l6R8W8r6t1E3%2%471)1Q1S1U7D3K2l2c2e0?2r0z0L8P0c7(0S0R1|173R3*5w2^3-8l6X4I4K3?6c4_6?6+0A4U044W8H4!6B0?7V365Q4-9b3@4;0j5Z756+9g7c4{4}044 510C539h4%7e6c6I6K9z3h9v0.5z6|476~5s719A9M045A2@5T5p6o6 5|9p045N6D6E9T019P5Y6M046t9D6Y0?8V9)9@6U9W9 9,5H9{9}9#6}a0a55$0?6k6_6%9Y70a96c49a19s6E6F6v9_6L9L3K6san0?8$a26`0?6VaCaj5Fa8aw47ayaKa6aB369*axagae5_9-9!9SaD9|az04aP4E8z7m963U3(0^7n0Y0!0$04.
Méthode norme

Soit \(A\) et \(B\) deux points du plan. On souhaite connaître la norme \(\lVert\overrightarrow{AB}\rVert\) du vecteur \(\overrightarrow{AB}\).

Écrire la méthode norme de la classe Vecteur qui renvoie la norme de ce vecteur.

Rappels mathématiques

Soit \(\overrightarrow{u}\) un vecteurs du plan, de coordonnées \((x_u, y_u)\).

Alors la norme de ce vecteur est \(\lVert\overrightarrow{u}\rVert = \sqrt{x_u^2 + y_u^2}\).

Exemples
>>> vAB.norme()
5.0
Racine carrée d'un nombre

La fonction permettant de calculer la racine carrée d'un nombre positif fait partie du module math. Elle est importée au début de cette version de l'exercice : from math import sqrt.

\(\sqrt{5}\) s'obtient avec sqrt(5)

La valeur renvoyée est bien souvent une valeur approchée du résultat. Regardons par exemple \({\sqrt{3}}^2\)

🐍 Console Python
>>> sqrt(3)**2
2.9999999999999996

La fonction sqrt renvoie un nombre flottant (type float) :

🐍 Console Python
>>> sqrt(16)
4.0

Comparaison de nombres flottants

Lorsqu'on écrit a = x ou x est un nombre réel, la valeur de a enregistrée en machine est une valeur approchée de x (quelques fois la valeur exacte). Cette valeur approchée a la forme d'un nombre flottant (le type float en Python). En conséquence, alors que des calculs et des comparaisons peuvent être effectués de manière exacte sur des réels, ils ne le sont que de manière approchée sur leur représentation en machine. On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b évaluée à True alors que x et y sont différents.

C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.

Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassert abs(1.414214 - sqrt(2)) < 1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) près.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(4i2+edxm3s7= 1Vo5w_lSnatf-)9h6,qcrg.*yPku8/050l0k0D0C0h0z0p0s0M0z0C0p0p0r010D0h0c010406050p0U0n0n0C0N0R040A0v0z0U0;0v0B050W0{0}0 110_0c041a1h051k0W1k1m1h0_0l0h0e0)0+0-0/0I0h0O0I0z1A0I0D0@050!0d0z0k1v0,0.011z1B1D1B0D1J1L1H0D0d0v0l111I0N1i0D0I0)140p0c0C0B0/0i011N1x010E0$0k0B0C0n0k1H1/1;1_1P1|1L1 210@0a0s0S0N0v0c0v0p0h170B0s0Y1-0N0N0k0M2m1a240B1i0W1+2z0D1)1(1*0l260/1D0B1~2j1H1s1u0*1O2J0h2L0B1#1t1H0c2s1i2x2z2%0`1:2n2R1`2W0N0~0z0@0t2w2+0^2*252-1P2/2;0@0i2^1;2`2x2I012 0C2=040o332y0_362}0/393b0g3e352+373k0@0w3n3g3p3i380v2:3a0@0J3u2{2,1w2~3z30040q3E3h3H3j3J3B040V3N3w3P3y3A3b0H3n1j2#1a2P2C0l2G370M1#221i3*1l3(2)1b2_053/0Y2$3W2S010T0B0@0E2g0n3$3O410x0@0s49402.44040~1+4f2|3X4c044e3`343F37430@0h0n2i0N0D3n4e4a2.0@0p0L4B3u3v4n410T0@2}4m3G4b4d4S3q0M0@0u2t0D0k0U0N4W3x0?040b3u0s4:4E4g1P4P040Y0E4*4o4V4s2y4u3x0E0n0@0y0y2U2l564|414,0f5b1`0d4,0p0k0z4{4 3 4N1`4,0K4D513X4i2i2U0D2@5n5u5c0@5s5n4=5p2~0@5x0B0D325B4F1P4,0G4.5n064;5X5H4T5g5i5k5m2)5Q0/0v0@0P5f5J040m5t5*015,040r5?4?3j5K0v5y5O5)5}5^5-5/5~040C0d0p0M0h0-0k67015d0G5|5I5+0@0F6l5!5:5L5z6h5_5.5P644i6a6c6e5j6h6j4/5Y4:5C5#4H5%6v666y6m380@0R6q375_5{5G6K6s605M623{5@6w6h4i3z0l182L6g6Q6r0/6G6Z6*6o6V3x5w6$6u6?6W6P636R6-0N6/0B6;6F0@0f6k5V5W4;6!0/4^4`6h4p4r756@380E0@2 6=7q375d6h5h6M5l7c045T6H6I7j420@2s0D4(196`6z4H4J4C724+7d7A5$7D7V3X6+7#414i5=7Q6R5_0Q0Q6}3X0n0h317;415_0j7_6L045j7!7x3x7%825v6T7}1P7.7:7,7r7?7^7(5q0@7f2%0_0W3}0k2z2!8o3)1t3+2C2E2A1!1$2C6a1L2z3*8l0Y0!0$0p04.
Méthode est_colineaire

Écrire la méthode est_colineaire qui renvoie une valeur booléenne indiquant si le vecteur courant (celui sur lequel on applique la méthode) est colinéaire ou non avec une autre instance de la classe Vecteur passée en paramètre.

Remarque

Du fait des problèmes de comparaison entre nombres flottants, on se limitera à des coordonnées entières.

Rappels mathématiques

Soit \(\overrightarrow{u}\) et \(\overrightarrow{v}\) deux vecteurs du plan, respectivement de coordonnées \((x_u, y_u)\) et \((x_v, y_v)\).

Ces deux vecteurs sont colinéaires si et seulement si \(x_u \times y_v - x_v \times y_u= 0\).

Exemples
>>> A = Point(0, 2)
>>> B = Point(3, 6)
>>> vAB = Vecteur(A, B)
>>> C = Point(6, 12)
>>> D = Point(0, 4)
>>> vCD = Vecteur(C, D)
>>> vAB.est_colineaire(vCD)
True
>>> vCD.est_colineaire(vAB)
True
>>> E = Point(0, 0)
>>> CE = Vecteur(C, E)
>>> vAB.est_colineaire(vCE)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(40i2edxm3s7= 1Vo5w_lSnatf-)h6,crg.*yPku8/050l0k0D0C0i0z0p0s0K0z0C0p0p0r010D0i0c010406050p0S0n0n0C0L0P040A0v0z0S0/0v0B050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0l0i0e0%0)0+0-0H0i0M0H0z1y0H0D0=050Y0d0z0k1t0*0,011x1z1B1z0D1H1J1F0D0d0v0l0 1G0L1g0D0H0%120p0c0C0B0-0j011L1v010E0!0k0B0C0n0k1F1-1/1@1N1`1J1}1 0=0a0s0Q0L0v0c0v0p0i150B0s0W1+0L0L0k0K2k18220B1g0U1)2x0D1%1$1(0l240-1B0B1|2h1F1q1s0(1M2H0i2J0B1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0L0|0z0=0t2u2)0?2(232+1N2-2/0=0j2?1/2^2v2G012}0C2:040o312w0@342{0-37390g3c332)353i0=0w3l3e3n3g360v2.380=0I3s2_2*1u2|3x2~040q3C3f3F3h3H3z040T3l1h2Z182N2A0l2E350K1Z201g3X1j3V2%192@053$0W2!3u3N010R0=2{3T3M2Q010x0=0s3}3@3 0B0K0=0u2r0D0k0S0L442`3^0;040b3s0s4n433~1^3`040W0E4g3E3 4104433.323D350E0n0=0y0y2S2j4J4w354j0f4O3v0d4j0p0k0z4v4C2w4E3v4j0J3l4p452,0=2g2S0D2=4!3?4h3 4(4*4$3^0B4.0v4:304?4|4_0=0G4l4?064o5b4+4^1^4U0=4W4Y4S3^0v0=0N5k460=0m4{4q1N5m040r5t4,2|4 515p1^5w5o535u3h0=0C0d0p0K0i0+0k5E1N4Q0G5z5e5v0=0F5X4x4-044/0B4;5T0-5G5-365L5N5P5R5:5V4m5c4n545f4V4X4Z2%5J015/5I5A5K040P5$355w5y4?5d5%5B5)505+526368655n5:4~043x0l162J5S675Y0-5`6g5~5Z045#6E646t5*5,6A6i5.6r6O3o0=6v6x0k6z6o6B016D2#065a4o6F0-4s4u5:4z4B6Z6P360E0=0k0p0D0y3$2I0k0Z2q5_0=4R6S4T605j764i0=4)6J6p6t0C142q0y0e4b4d4f7a5504575{5|6+5;4t0X0k2.2S1/0D6c3v6e7E3^5g045i623/64666=6T045s7e6!5w0O7H5q047h2B0k7k7m4e5:7P7N7f0=6b7U6?5w6I2#6h357J7L7+6R7Q3v6t7:7^7v7W7Y5(7#7j7l2s7n7}045H7 4}5r7t5c7v4s2q0D4e177;7R0W4c7A1}5+866G0r6f83640n0i0=0h3C0U3;0k2x2Y8L3W1r3Y2A2C2y1Y1!2A5M1J2x3X0@0U8t0Z0#04.