« Mathématiques avec Python et Ruby/Points en Python » : différence entre les versions
m <source> -> <syntaxhighlight> (phab:T237267) |
Aucun résumé des modifications |
||
Ligne 66 : | Ligne 66 : | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
Remarque: Ces codes sources sont sous |
Remarque: Ces codes sources sont sous licence [[w:Licence publique générale GNU|GPL]] ce qui autorise à les citer, au nom de la [[w:Logiciel_libre#Définition|liberté numéro 1]] (celle d'étudier le logiciel) de [[w:Richard Stallman|Richard Stallman]]. |
||
==Vecteur== |
==Vecteur== |
Version actuelle du 3 septembre 2022 à 14:50
L'objet Point est une bonne manière d'aborder la programmation objet. En géométrie repérée, un point est constitué de deux nombres, son abscisse et son ordonnée.
Création de l'objet[modifier | modifier le wikicode]
Le point de coordonnées (x,y) est, en Python, une classe:
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
Lorsqu'on crée un point, ses coordonnées sont stockées à l'intérieur de l'objet. On note p.x et p.y les coordonnées de p.
Affichage[modifier | modifier le wikicode]
La méthode peut ressembler à ceci:
def affichage(self):
return '('+str(self.x)+';'+str(self.y)+')'
mais on peut envisager d'y rajouter des instructions avec TkInter pour réellement dessiner le point sur la figure. Voir à ce sujet le chapitre sur les fonctions.
Avec deux points[modifier | modifier le wikicode]
Le plus simple quand on a deux points, c'est leur milieu, parce que c'est aussi un point (donc un objet de même nature).
Milieu[modifier | modifier le wikicode]
Les coordonnées du milieu d'un segment sont les moyennes de celles des extrémités:
def milieu(self,p):
return Point((self.x+p.x)/2,(self.y+p.y)/2)
En se rappelant que l'équivalent en Java de self est this, on remarque une certaine ressemblance avec les codes sources de logiciels de géométrie dynamique:
Tout d'abord, CaRMetal:
setXY((P1.getX() + P2.getX()) / 2, (P1.getY() + P2.getY()) / 2);
Ensuite, GeoGebra:
M.setCoords(
(P.inhomX + Q.inhomX) / 2.0d,
(P.inhomY + Q.inhomY) / 2.0d,
1.0);
Remarque: Ces codes sources sont sous licence GPL ce qui autorise à les citer, au nom de la liberté numéro 1 (celle d'étudier le logiciel) de Richard Stallman.
Vecteur[modifier | modifier le wikicode]
Le vecteur d'origine A et d'extrémité B, noté , est un vecteur! On le définira donc au chapitre suivant mais il peut servir ici:
def vecteur(self,p):
return Vecteur(p.x-self.x,p.y-self.y)
Distance[modifier | modifier le wikicode]
Pour simplifier l'écriture de la distance AB on va encore utiliser les vecteurs, la distance AB étant égale à :
def distance(self,p):
return self.vecteur(p).norme()
Application au problème[modifier | modifier le wikicode]
Voici l'objet Point en entier:
from math import *
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def affichage(self):
return '('+str(self.x)+';'+str(self.y)+')'
def milieu(self,p):
return Point((self.x+p.x)/2,(self.y+p.y)/2)
def vecteur(self,p):
return Vecteur(p.x-self.x,p.y-self.y)
def distance(self,p):
return self.vecteur(p).norme()
Nature de ABC[modifier | modifier le wikicode]
Pour savoir si ABC est isocèle, on peut calculer les longueurs de ses trois côtés:
a=Point(-1,3)
b=Point(5,1)
c=Point(1,5)
print(a.distance(b))
print(a.distance(c))
print(b.distance(c))
Visiblement, ABC n'est pas isocèle. Mais
print(a.distance(b)**2)
print(a.distance(c)**2+b.distance(c)**2)
La réciproque du théorème de Pythagore nous apprend que ABC est rectangle en C, donc d'hypoténuse AB.
Centre du cercle[modifier | modifier le wikicode]
Donc le cercle circonscrit a pour diamètre [AB], donc pour centre le milieu de [AB]:
m=a.milieu(b)
print(m.affichage())
Rayon du cercle[modifier | modifier le wikicode]
On peut donc diviser par 2 la distance AB mais aussi vérifier que M est équidistant de A, B et C:
print(m.distance(a))
print(m.distance(b))
print(m.distance(c))
Figure[modifier | modifier le wikicode]
On pourrait utiliser TkInter pour dessiner le tout (y compris le cercle) mais la figure ci-dessous a été faite avec Ruby, ce langage permettant assez facilement de fabriquer un fichier au format svg: