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

.128013s3o_8bcdufvg/0ly n7apS.r1me,(P2=4:twki95hx)6050i0B0J0u0M0p0b0r0h0p0u0b0b0G010J0M0v010406050b0j0A0A0u0y0q040w0d0p0j0-0d0s050n0@0_0{0}0=0v04161d051g0n1g1i1d0=0i0M0l0#0%0)0+0P0M0m0P0p1w0P0J0:050W0g0p0B1r0(0*011v1x1z1x0J1F1H1D0J0g0d0i0}1E0y1e0J0P0#100b0v0u0s0+0F011J1t010k0Y0B0s0u0A0B1D1+1-1=1L1^1H1{1}0:0a0r0E0y0d0v0d0b0M130s0r0U1)0y0y0B0h2i16200s1e0n1%2v0J1#1!1$0i220+1z0s1`2f1D1o1q0$1K2F0M2H0s1X1p1D0v2o1e2t2v2Z0?1,2j2N1?2S0y0`0p0:0r0z2s2%0;2$212)1L2+2-2/0F2=1-2@2t2E012|0u2.040r0c302u0=332`0+36380r0H3c322%343i2/0O3m3e3o3g350d2,372/0S3t2^2(1s2{3y2}390t3D3f3G3h3I3A390f3M3v3O3x3z3j0N3U2_3W3q040z0o3m1f2X162L2y0i2C340h1X1~1e3:1h3.2#172?053^0U2Y3V2O010L0:2`3,3N470K2/4c462*0h0:0E0d2Q0J4h3$470/040I3t0r4x0r3E3449040U0k4q3F4e4g40314A3w0k0A0:0e0e2Q2h4R4G344t0D4W3w0g4t0b0B0p4F4K2u4M3W4t0C3m4z4d2*0:0Q4!4/0:4;4,394.470s0:0q4{4s0:0R4v4 064y5d4?4i1L4$0:4(4*561?0d0:0x5m2{4_4=515n0:0G5u4@5s044`5b5e4y5v5h4%4)4+2#5A0+5o045q4 5H3h545z5g5O5x5W4r4^04555b5c5G5N480:4E5r0+4f505S5,0s0k0:0u0g0b0h0M0)0B5:014Y635i045k5L415,4t594w5F5f5#1L4C2o0J0j0y154 6h4H1?6769635P5R5M5X355t5)5d5T5-4D0B6a4L5,5=4z5@6A5_0:3y0i142H626O6i0+656X6s5I5j5K636d5a2Z5*5F6F6k0V6n6p2Z6r346u6)6#346x63535%3D0n430B2v2W763/1p3;2y2A2w1W1Y2y5|1H2v3:0=0n0U0W0Y0b04.
Constructeur de la classe Vecteur

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

Compléter le constructeur de la classe Vecteur qui prend en paramètres deux instances point1 et point2 de la classe Point et initialise les attributs x et y, qui représentent les coordonnées du vecteur fomré par ces deux points.

Exemples
>>> A = Point(0, 2)
>>> B = Point(3, 6)
>>> AB = Vecteur(A, B)
>>> AB.x
3
>>> AB.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

.128013s3Oo_;bcdufvg/lyq napS.r1-meh,(P2=4V:twki5Rx)é6050j0C0M0u0P0p0b0s0i0p0u0b0b0I010M0P0v010406050b0k0B0B0u0y0q040w0e0p0k0:0e0t0s020u0B0v0g0s0R0C0}0y0r0k0C0b050o0`0|0~100^0v041o1v051y0o1y1A1v0^0j0P0m0(0*0,0.0D0P0n0D0p1O0D0M0?050Z0h0p0C1J0+0-011N1P1R1P0M1X1Z1V0M0h0e0j101W0y1w0M0D0(130b0v0u0t0.0H011#1L010l0#0C0t1b0C1V2022271%2a1Z2d0B2f040a0s0G0y0e0v0e0b0P16180X1~0y0y0C0i2A1o2h0t1w0o1|2M0M1`1_1{0j2j0.1R0t2c2x1V1G1I0)1$2W0P2Y0t1?1H1V0v2F1w2K2M2@0_21182(282-0y0}0p0?0z2J2{0@2`2i2}1%2 310?0H3522372K2V013c0u32040c3g2L0^3j3a0.3m3o0J3r3i2{3k3x0?0Q3A3t3C3v3l0e303n0?0V3A1x2=1o2$2P0j2T3k0i1?2p0W1H1w2;0C2?363R3!0X3,391K1%0O0t0?0l2u0B3R3u3?0.0N0?0s3~3J403l3_040}1|453=2)014204441p3-3 4f3^0?0P1c3M0M3A444m2~0?0b0r0y4t4k3h063I4e280O0?3a4d2|474h4j2_4w3b0i0?0K2G0M0C0k0y4M3k0=040L3H0s4,4v464n0?0X0l4$3K4P4@470l0B0?0f0f2+2z4 4`4f4(0F54280h4(0b0C0p4?4D2L384N550?0E4u5i3D0?2w2+0M345g3;5j284(5m5v4.4H3b5q0e5s3f5v5o3K4(0T4*5v064-5R5C5x1%5a4y5d5f4R4/280e0?0x585E040S5n4S0.5%040I5.5#5+5r0t0M5I5!5D5:5(5*3w0?0u0h0b0i0P0,0C6201560T5@5 015;0A6g5U63045`5t6c5;5)5J5/3l6466686a6c6e4+5S4,5K475W045c5e6r616u5^6n0q6l3k5;5?5B6G4f496p5}4l6P6i6N5~6m6w043M0j172Y6b6O6h6C6W6v6j6S3K6Z5G5{5u6*6T6)6$6h496.6:0C6=725L0?0F6f5P1o3/3+3S7k0o3V1o0M3X7p2R2N1=1@2P651Z2M3V1u5w3k2F0B0f0l0u0O0C0f0D0c0?1g1i1k1m0s5O2_1B371v0d180v4Z0M0s0j220%0i1!0i0+0s150#690C0y0s2+1G0l0l0U7F2o5{0s1Z0%0_2Q170n041$1m5c4!1n1p870t89447j8a6y695c7i3#4i0Y8k8r780t6;8q3:0s0e0k7)0P2F2H1h2c7(840s0u1-0y0P0h15858l5-0o8l0s8t058l6R8W8r6t1E3%2%471)1Q1S1U7D3K2l2c2e0?2r0w0i8P0v7(0G0q1|173R3*5w2^3-8l6X4I4K3?6c4_6?6+0t4U044W8H4!6B0?7V365Q4-9b3@4;0C5Z756+9g7c4{4}044 510M539h4%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+aP4E8z7m963U3(0^7n0Y0!0$04.
Méthode norme

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

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

Exemples
>>> AB.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

.128013s3o_8bcdufvg/lyq n7apS.r1-me,(P2=4V:+twki95h*x)6050i0C0M0u0P0o0b0r0h0o0u0b0b0H010M0P0v010406050b0j0B0B0u0y0p040w0d0o0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0P0l0)0+0-0/0S0P0m0S0o1A0S0M0@050!0g0o0C1v0,0.011z1B1D1B0M1J1L1H0M0g0d0i111I0y1i0M0S0)140b0v0u0s0/0G011N1x010k0$0C0s0u0B0C1H1/1;1_1P1|1L1 210@0a0r0F0y0d0v0d0b0P170s0r0Y1-0y0y0C0h2m1a240s1i0n1+2z0M1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0P2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0y0~0o0@0z2w2+0^2*252-1P2/2;0@0G2^1;2`2x2I012 0u2=040c332y0_362}0/393b0I3e352+373k0@0R3n3g3p3i380d2:3a0@0W3u2{2,1w2~3z30040t3E3h3H3j3J3B040f3N3w3P3y3A3b0Q3n1j2#1a2P2C0i2G370h1#221i3*1l3(2)1b2_053/0Y2$3W2S010O0s0@0k2g0B3$3O410N0@0r49402.44040~1+4f2|3X4c044e3`343F37430@0P0B2i0y0M3n4e4a2.0@0b0q4B3u3v4n410O0@2}4m3G4b4d4S3q0h0@0J2t0M0C0j0y4W3x0?040K3u0r4:4E4g1P4P040Y0k4*4o4V4s2y4u3x0k0B0@0e0e2U2l564|414,0E5b1`0g4,0b0C0o4{4 3 4N1`4,0D4D513X4i2i2U0M2@5n5u5c0@5s5n4=5p2~0@5x0s0M325B4F1P4,0V4.5n064;5X5H4T5g5i5k5m2)5Q0/0d0@0x5f5J040U5t5*015,040H5?4?3j5K0d5y5O5)5}5^5-5/5~040u0g0b0h0P0-0C67015d0V5|5I5+0@0A6l5!5:5L5z6h5_5.5P644i6a6c6e5j6h6j4/5Y4:5C5#4H5%6v666y6m380@0p6q375_5{5G6K6s605M623{5@6w6h4i3z0i182L6g6Q6r0/6G6Z6*6o6V3x5w6$6u6?6W6P636R6-0y6/0s6;6F0@0E6k5V5W4;6!0/4^4`6h4p4r756@380k0@2 6=7q375d6h5h6M5l7c045T6H6I7j420@2s0M4(196`6z4H4J4C724+7d7A5$7D7V3X6+7#414i5=7Q6R5_0T0T6}3X0B0P317;415_0L7_6L045j7!7x3x7%825v6T7}1P7.7:7,7r7?7^7(5q0@7f2%0_0n3}0C2z2!8o3)1t3+2C2E2A1!1$2C6a1L2z3*8l0Y0!0$0b04.
Méthode est_colineaire

Écrire la méthode est_colineaire qui prend en paramètre une instance de la classe Vecteur et renvoie la valeur booléenne indiquant si ces vecteurs sont colinéaires ou non.

Remarque

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

Exemples
>>> A = Point(0, 2)
>>> B = Point(3, 6)
>>> AB = Vecteur(A, B)
>>> C = Point(6, 12)
>>> D = Point(0, 4)
>>> CD = Vecteur(C, D)
>>> AB.est_colineaire(CD)
True
>>> E = Point(0, 0)
>>> CE = Vecteur(C, E)
>>> AB.est_colineaire(CE)
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

.128013s3o_8bcdufvg/0ly n7apS.r1-me,(P2=4V:twki5h*x)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0/0d0s050n0_0{0}0 0@0v04181f051i0n1i1k1f0@0i0O0l0%0)0+0-0Q0O0m0Q0p1y0Q0L0=050Y0g0p0C1t0*0,011x1z1B1z0L1H1J1F0L0g0d0i0 1G0y1g0L0Q0%120b0v0u0s0-0G011L1v010k0!0C0s0u0B0C1F1-1/1@1N1`1J1}1 0=0a0r0F0y0d0v0d0b0O150s0r0W1+0y0y0C0h2k18220s1g0n1)2x0L1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0O2J0s1Z1r1F0v2q1g2v2x2#0^1.2l2P1^2U0y0|0p0=0z2u2)0?2(232+1N2-2/0=0G2?1/2^2v2G012}0u2:040c312w0@342{0-37390I3c332)353i0=0P3l3e3n3g360d2.380=0U3s2_2*1u2|3x2~040t3C3f3F3h3H3z040f3l1h2Z182N2A0i2E350h1Z201g3X1j3V2%192@053$0W2!3u3N010N0=2{3T3M2Q010M0=0r3}3@3 0s0h0=0J2r0L0C0j0y442`3^0;040K3s0r4n433~1^3`040W0k4g3E3 4104433.323D350k0B0=0e0e2S2j4J4w354j0E4O3v0g4j0b0C0p4v4C2w4E3v4j0D3l4p452,0=2g2S0L2=4!3?4h3 4(4*4$3^0s4.0d4:304?4|4_0=0T4l4?064o5b4+4^1^4U0=4W4Y4S3^0d0=0x5k460=0S4{4q1N5m040H5t4,2|4 515p1^5w5o535u3h0=0u0g0b0h0O0+0C5E1N4Q0T5z5e5v0=0A5X4x4-044/0s4;5T0-5G5-365L5N5P5R5:5V4m5c4n545f4V4X4Z2%5J015/5I5A5K040q5$355w5y4?5d5%5B5)505+526368655n5:4~043x0i162J5S675Y0-5`6g5~5Z045#6E646t5*5,6A6i5.6r6O3o0=6v6x0C6z6o6B016D2#065a4o6F0-4s4u5:4z4B6Z6P360k0=0C0b0L0e3$2I0C0Z2q5_0=4R6S4T605j764i0=4)6J6p6t0u142q0e0l4b4d4f7a5504575{5|6+5;4t0X0C2.2S1/0L6c3v6e7E3^5g045i623/64666=6T045s7e6!5w0R7H5q047h2B0C7k7m4e5:7P7N7f0=6b7U6?5w6I2#6h357J7L7+6R7Q3v6t7:7^7v7W7Y5(7#7j7l2s7n7}045H7 4}5r7t5c7v4s2q0L4e177;7R0W4c7A1}5+866G0H6f83640B0O0=0o3C0n3;0C2x2Y8L3W1r3Y2A2C2y1Y1!2A5M1J2x3X0@0n8t0Z0#04.