| 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:13] – goupillwiki | nsi:tds:maths:geometrie_analytique [2022/10/04 10:53] (Version actuelle) – goupillwiki |
|---|
| * La méthode magique ''%%__mul__%%'' permet d'obtenir le point produit ''A * k'' où ''k'' est un nombre. Vous comprenez qu'on parle en termes de coordonnées. | * La méthode magique ''%%__mul__%%'' permet d'obtenir le point produit ''A * k'' où ''k'' est un nombre. Vous comprenez qu'on parle en termes de coordonnées. |
| * La méthode magique ''%%__truediv__%%'' permet d'obtenir la division ''A / k'' où ''k'' est un nombre. Là encore il s'agi de coordonnées. | * La méthode magique ''%%__truediv__%%'' permet d'obtenir la division ''A / k'' où ''k'' est un nombre. Là encore il s'agi de coordonnées. |
| * La méthode magique ''%%__str__%%'' indique à Python quoi faire quand on demande un transtypage ''str(A)'' | * La méthode magique ''%%__str__%%'' indique à Python quoi faire quand on demande un transtypage ''str(A)''. On souhaite que cette fonction renvoie les coordonnées du point sous la forme $(x\,;\,y)$. |
| * La méthode magique ''%%__repr__%%'' est utilisée lors de l'affichage d'un point en console. | * La méthode magique ''%%__repr__%%'' est utilisée lors de l'affichage d'un point en console. |
| |
| ===== Droite ===== | ===== Droite ===== |
| | |
| | {{ :nsi:tds:maths:classe_droite.png?direct&200|}} |
| | |
| |
| L'objet ''Droite'' décrit une droite. Cette classe est dépendante de la classe ''Point''. | L'objet ''Droite'' décrit une droite. Cette classe est dépendante de la classe ''Point''. |
| Une droite est définie par une équation. La forme la plus générale d'équation est $a\cdot x + b\cdot y + c = 0$. C'est l'équation cartésienne. On utilisera cette forme et pas $y = m\cdot x + p$ qui n'est pas valable pour une droite verticale. | Une droite est définie par une équation. La forme la plus générale d'équation est $a\cdot x + b\cdot y + c = 0$. C'est l'équation cartésienne. On utilisera cette forme et pas $y = m\cdot x + p$ qui n'est pas valable pour une droite verticale. |
| |
| * L'objet ''Droite'' a les attributs ''a'', ''b'', ''c''. | 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.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.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.is_perp(d2)'' renvoie ''True'' si les deux droites sont perpendiculaires\\ <wrap tip>si $a\cdot a' + b \cdot b' = 0$</wrap> |
| | * Les méthodes magiques ''%%__str__%%'' et ''%%__repr__%%'' répondent au même besoin que pour ''Point''. On souhaite que ces fonctions renvoient l'équation de la droite au format ''str''. |
| |
| On veut les méthodes suivantes : | On aimerait disposer d'autres fonctions : |
| * tester si deux droites sont parallèles, <wrap tip>deux droites sont parallèles si $a\cdot b' = a' \cdot b$</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> |
| * obtenir la 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> |
| * obtenir la perpendiculaire à la droite et passant par un point, <wrap tip>Une perpendiculaire a les coefficients $a' = -b$ et $b' = a$</wrap> | |
| * obtenir la médiatrice d'un segment donné sous la forme d'une paire de points, | |
| * obtenir l'intersection entre deux droites,\\ <wrap tip>Il faut que les deux droites soient non parallèles puis $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> | |
| * tester si un point est sur la droite <wrap tip> il suffit de vérifier si $a\cdot x + b\cdot y + c = 0$</wrap> | |
| * tester si deux droites sont perpendiculaires <wrap tip>Elles sont perpendiculaires si $a\cdot a' + b \cdot b' = 0$</wrap> | |
| |
| ===== Segment ===== | == 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, |
| | * 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. |
| | * plus technique, on peut placer ces fonctions dans la classe ''Droite'' mais en signalant qu'elles fonctionnent autrement. On pourra écrire : |
| |
| <WRAP tip> | <code python> |
| Pas obligé, mais ça peut paraître mieux car plus rigoureux. | class Droite: |
| </WRAP> | # ... |
| | @staticmethod |
| | def par_deux_pts(A:Point, B:Point) -> 'Droite': |
| | ''' |
| | renvoie la droite (AB) |
| | ''' |
| | a = B.y - A.y |
| | b = -(B.x - A.x) |
| | c = -a*A.x - b*A.y |
| | return Droite(a, b, c) |
| | |
| | # usage avec deux points A et B : |
| | d = Droite.par_deux_points(A, B) |
| | </code> |
| |
| * Un objet ''Segment'' est défini par les deux ''Point'' extrémités. | <WRAP tip> |
| | Le mot clé ''%%@staticmethod%%'' est la façon en Python de prévenir que la méthode qui suit est spéciale. C'est une méthode **statique**. Ce concept existe dans tous les langages implémentant des classes. La fonction ''%%droite_par_pts%%'' est attaché à la classe ''Droite'' elle-même, pas à un objet instancié de cette classe. |
| |
| Il a les méthodes : | 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é. |
| * ''milieu'' | </WRAP> |
| * ''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 ===== |