| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| nsi:tds:maths:geometrie_analytique [2022/09/30 11:44] – [Segment] goupillwiki | nsi:tds:maths:geometrie_analytique [2022/10/04 10:53] (Version actuelle) – goupillwiki |
|---|
| |
| Quelques précisions sur les méthodes :\\ //dans ce qui suit ''d1'' et ''d2'' sont des droites, ''A'' un point.// | Quelques précisions sur les méthodes :\\ //dans ce qui suit ''d1'' et ''d2'' sont des droites, ''A'' un point.// |
| * ''d1.is_parallel(d2)'' renvoie ''True'' si les deux droites sont parallèles.\\<wrap tip>deux droites sont parallèles si $a\cdot b' = a' \cdot b$</wrap> | * ''d1.is_parallel(d2)'' renvoie ''True'' si les deux droites sont parallèles.\\ <wrap tip>deux droites sont parallèles si $a\cdot b' = a' \cdot b$</wrap> |
| * ''d1.perp_by_point(d2, A)'' renvoie la droite perpendiculaire à ''d1'' et passant par ''A''.\\<wrap tip>Une perpendiculaire a les coefficients $a' = -b$ et $b' = a$</wrap> | * ''d1.perp_by_point(A)'' renvoie la droite perpendiculaire à ''d1'' et passant par ''A''.\\ <wrap tip>Une perpendiculaire a les coefficients $a' = -b$ et $b' = a$</wrap> |
| * ''d1.inter(d2)'' renvoie le point intersection des deux droites.\\ //précondition : les deux droites ne sont pas parallèles//\\ <wrap tip>$x = -\frac{c\cdot b' - c'\cdot b}{a\cdot b' - a'\cdot b}$ et $y = -\frac{c\cdot a' - c'\cdot a}{b\cdot a' - b'\cdot a}$</wrap> | * ''d1.inter(d2)'' renvoie le point intersection des deux droites.\\ //précondition : les deux droites ne sont pas parallèles//\\ <wrap tip>$x = -\frac{c\cdot b' - c'\cdot b}{a\cdot b' - a'\cdot b}$ et $y = -\frac{c\cdot a' - c'\cdot a}{b\cdot a' - b'\cdot a}$</wrap> |
| * ''d1.has_point(A)'' renvoie ''True'' si le point est sur la droite.\\ <wrap tip>Tester si $a\cdot x_A + b\cdot y_A + c = 0$</wrap> | * ''d1.has_point(A)'' renvoie ''True'' si le point est sur la droite.\\ <wrap tip>Tester si $a\cdot x_A + b\cdot y_A + c = 0$</wrap> |
| |
| On aimerait disposer d'autres fonctions : | On aimerait disposer d'autres fonctions : |
| * une fonction ''par_deux_pts(A:Point, B:Point) -> Droite'' renvoyant droite passant par deux points,\\ <wrap tip>Les coefficients pour la droite $(AB)$ sont $a = y_B - y_A$, $b = -(x_B - x_A)$ et $c = -a\cdot x_A + b \cdot y_A$</wrap> | * une fonction ''par_deux_pts(A:Point, B:Point) -> Droite'' renvoyant droite passant par deux points,\\ <wrap tip>Les coefficients pour la droite $(AB)$ sont $a = y_B - y_A$, $b = -(x_B - x_A)$ et $c = -a\cdot x_A - b \cdot y_A$</wrap> |
| * une fonction ''mediatrice(A:Point, B:Point) -> Droite'' renvoyant la médiatrice su segment [AB]\\ <wrap tip>C'est la perpendiculaire à (AB) passant par le milieu de [AB]</wrap> | * une fonction ''mediatrice(A:Point, B:Point) -> Droite'' renvoyant la médiatrice su segment [AB]\\ <wrap tip>C'est la perpendiculaire à (AB) passant par le milieu de [AB]</wrap> |
| |
| Mais où placer ces deux fonctions ? | == Mais où placer ces deux fonctions ? == |
| * si on les place dans ''Point'', l'objet ''Point'' devient dépendant de ''Droite'' ce qu'on préférait éviter, | * si on les place dans ''Point'', l'objet ''Point'' devient dépendant de ''Droite'' ce qu'on préférait éviter, |
| * on ne peut les placer dans la classe ''Droite'' car les méthodes de ''Droite'' concernent toujours une droite qui existe déjà. Mais ces deux fonctions servent à créer une droite (qui n'existe donc pas encore) à partir d'autre chose qu'une droite... D'ailleurs, vous voyez qu'il n'y a pas ''self'' dans la définition de ces fonctions. | * on ne peut les placer dans la classe ''Droite'' car les méthodes de ''Droite'' concernent toujours une droite qui existe déjà. Mais ces deux fonctions servent à créer une droite (qui n'existe donc pas encore) à partir d'autre chose qu'une droite... D'ailleurs, vous voyez qu'il n'y a pas ''self'' dans la définition de ces fonctions. |
| | * on peut créer une classe ''Segment''. Un objet de cette classe serait défini par deux points. La fonction ''mediatrice'' serait une méthode d'un objet ''Segment''. Cette approche est rigoureuse et logique : en mathématique, la médiatrice appartient à un segment, pas à un point ou une droite. Il est donc naturel de donner à ''Segment'' la responsabilité de la médiatrice. Le seul défaut de cette approche est d'obliger à créer une classe en plus. |
| * on peut les placer dans le module ''droite.py'' comme fonctions ordinaires, à côté de la classe ''Droite''. C'est une bonne option. Son seul tort est de ne pas tout empaqueter dans la classe, ce qu'on préfère quand on commence à faire des classes. | * on peut les placer dans le module ''droite.py'' comme fonctions ordinaires, à côté de la classe ''Droite''. C'est une bonne option. Son seul tort est de ne pas tout empaqueter dans la classe, ce qu'on préfère quand on commence à faire des classes. |
| * plus technique, on peut placer ces fonctions dans la classe ''Droite'' mais en signalant qu'elles fonctionnent autrement. On pourra écrire : | * plus technique, on peut placer ces fonctions dans la classe ''Droite'' mais en signalant qu'elles fonctionnent autrement. On pourra écrire : |
| Vous remarquez également qu'on appelle la fonction en précisant le nom de la classe : ''%%Droite.par_deux_points(A, B)%%''. Cela montre que la fonction est //rangée// dans ''Droite''. C'est un des aspects des classes qu'on apprécie : tout est bien rangé. | Vous remarquez également qu'on appelle la fonction en précisant le nom de la classe : ''%%Droite.par_deux_points(A, B)%%''. Cela montre que la fonction est //rangée// dans ''Droite''. C'est un des aspects des classes qu'on apprécie : tout est bien rangé. |
| </WRAP> | </WRAP> |
| |
| ===== Segment ? ===== | |
| |
| <WRAP tip> | |
| Je n'avais pas pensé à cette classe dans un premier temps. On peut juger cela plus rigoureux mais n'a rien d'obligatoire. | |
| |
| Avec une classe ''Segment'', on n'aura plus à se demander où mettre la fonction ''mediatrice'', ce sera clairement : dans la classe ''Segment''. | |
| </WRAP> | |
| |
| Si vous choisissez d'implémenter la classe ''Segment'', elle devra contenir les méthodes : | |
| * ''milieu'' | |
| * ''longueur'' | |
| * ''mediatrice''. Cette fonction ne serait alors plus dans la classe ''Droite'' | |
| |
| ===== Triangle ===== | ===== Triangle ===== |
| |
| Un objet ''Triangle'' décrit un triangle. Cette classe est dépendante des classes ''Point'' et ''Triangle''. | {{ :nsi:tds:maths:classe_triangle.png?direct&200|}} |
| |
| * Le triangle a les attributs ''A'', ''B'', ''C'', ses sommets. | Un objet ''Triangle'' décrit un triangle. Il est défini par ses trois sommets. Cette classe est dépendante des classes ''Point'' et ''Droite''. |
| |
| On veut les méthodes suivantes : | Quelques précisions sur les méthodes :\\ //Ci-dessous, ''t'' est de type ''Triangle''// |
| * aire du triangle | * ''t.aire()'' renvoie l'aire du triangle |
| * périmètre du triangle | * ''t.perimeter()'' renvoie le périmètre du triangle |
| * centre de gravité | * ''t.G()'' renvoie le centre de gravité |
| * centre du cercle circonscrit | * ''t.O()'' renvoie le centre du cercle circonscrit (intersection des médiatrices) |
| * orthocentre | * ''t.H()'' renvoie l'orthocentre (intersection des hauteurs) |
| * tester si le triangle est rectangle | * ''t.is_rectangular()'' renvoie ''True'' si le triangle est rectangle |
| | * ''%%__str__%%'' et ''%%__repr__%%'' renvoient une représentation texte du triangle. On pourra par exemple renvoyer la liste des coordonnées des 3 sommets. |
| |
| ===== Développement ===== | ===== Développement ===== |