« Mathématiques avec Python et Ruby/Points en Python » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Annulation des modifications 446728 de CommonsDelinker (discussion)
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 11 : Ligne 11 :
Le point de coordonnées ''(x,y)'' est, en ''Python'', une classe:
Le point de coordonnées ''(x,y)'' est, en ''Python'', une classe:


<source lang="python">
<syntaxhighlight lang="python">
class Point:
class Point:
def __init__(self,x,y):
def __init__(self,x,y):
Ligne 18 : Ligne 18 :




</syntaxhighlight>
</source>


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''.
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''.
Ligne 26 : Ligne 26 :
La méthode peut ressembler à ceci:
La méthode peut ressembler à ceci:


<source lang="python">
<syntaxhighlight lang="python">
def affichage(self):
def affichage(self):
return '('+str(self.x)+';'+str(self.y)+')'
return '('+str(self.x)+';'+str(self.y)+')'


</syntaxhighlight>
</source>


mais on peut envisager d'y rajouter des instructions avec ''TkInter'' pour réellement dessiner le point sur la figure. Voir à ce sujet [[Mathématiques_avec_Python_et_Ruby/Fonctions_en_Python|le chapitre sur les fonctions]].
mais on peut envisager d'y rajouter des instructions avec ''TkInter'' pour réellement dessiner le point sur la figure. Voir à ce sujet [[Mathématiques_avec_Python_et_Ruby/Fonctions_en_Python|le chapitre sur les fonctions]].
Ligne 42 : Ligne 42 :
Les coordonnées du milieu d'un segment sont les moyennes de celles des extrémités:
Les coordonnées du milieu d'un segment sont les moyennes de celles des extrémités:


<source lang="python">
<syntaxhighlight lang="python">
def milieu(self,p):
def milieu(self,p):
return Point((self.x+p.x)/2,(self.y+p.y)/2)
return Point((self.x+p.x)/2,(self.y+p.y)/2)




</syntaxhighlight>
</source>


En se rappelant que l'équivalent en [[w:Java (langage)|Java]] de ''self'' est ''this'', on remarque une certaine ressemblance avec les codes sources de logiciels de géométrie dynamique:
En se rappelant que l'équivalent en [[w:Java (langage)|Java]] de ''self'' est ''this'', on remarque une certaine ressemblance avec les codes sources de logiciels de géométrie dynamique:
Ligne 53 : Ligne 53 :
Tout d'abord, [[w:CaRMetal|CaRMetal]]:
Tout d'abord, [[w:CaRMetal|CaRMetal]]:


<source lang="java">
<syntaxhighlight lang="java">
setXY((P1.getX() + P2.getX()) / 2, (P1.getY() + P2.getY()) / 2);
setXY((P1.getX() + P2.getX()) / 2, (P1.getY() + P2.getY()) / 2);
</syntaxhighlight>
</source>


Ensuite, [[w:GeoGebra|GeoGebra]]:
Ensuite, [[w:GeoGebra|GeoGebra]]:


<source lang="java">
<syntaxhighlight lang="java">
M.setCoords(
M.setCoords(
(P.inhomX + Q.inhomX) / 2.0d,
(P.inhomX + Q.inhomX) / 2.0d,
(P.inhomY + Q.inhomY) / 2.0d,
(P.inhomY + Q.inhomY) / 2.0d,
1.0);
1.0);
</syntaxhighlight>
</source>


Remarque: Ces codes sources sont sous license [[w:License 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]].
Remarque: Ces codes sources sont sous license [[w:License 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]].
Ligne 72 : Ligne 72 :
Le vecteur d'origine ''A'' et d'extrémité ''B'', noté <math>\overrightarrow{AB}</math>, est un vecteur! On le définira donc au [[Mathématiques_avec_Python_et_Ruby/Vecteurs_en_Python|chapitre suivant]] mais il peut servir ici:
Le vecteur d'origine ''A'' et d'extrémité ''B'', noté <math>\overrightarrow{AB}</math>, est un vecteur! On le définira donc au [[Mathématiques_avec_Python_et_Ruby/Vecteurs_en_Python|chapitre suivant]] mais il peut servir ici:


<source lang="python">
<syntaxhighlight lang="python">
def vecteur(self,p):
def vecteur(self,p):
return Vecteur(p.x-self.x,p.y-self.y)
return Vecteur(p.x-self.x,p.y-self.y)


</syntaxhighlight>
</source>


==Distance==
==Distance==
Ligne 82 : Ligne 82 :
Pour simplifier l'écriture de la distance ''AB'' on va encore utiliser les [[Mathématiques_avec_Python_et_Ruby/Vecteurs_en_Python|vecteurs]], la distance ''AB'' étant égale à <math>\|\overrightarrow{AB}\|</math>:
Pour simplifier l'écriture de la distance ''AB'' on va encore utiliser les [[Mathématiques_avec_Python_et_Ruby/Vecteurs_en_Python|vecteurs]], la distance ''AB'' étant égale à <math>\|\overrightarrow{AB}\|</math>:


<source lang="python">
<syntaxhighlight lang="python">
def distance(self,p):
def distance(self,p):
return self.vecteur(p).norme()
return self.vecteur(p).norme()


</syntaxhighlight>
</source>


=Application au problème=
=Application au problème=
Ligne 92 : Ligne 92 :
Voici l'objet ''Point'' en entier:
Voici l'objet ''Point'' en entier:


<source lang="python">
<syntaxhighlight lang="python">
from math import *
from math import *


Ligne 112 : Ligne 112 :
return self.vecteur(p).norme()
return self.vecteur(p).norme()


</syntaxhighlight>
</source>


==Nature de ABC==
==Nature de ABC==
Ligne 118 : Ligne 118 :
Pour savoir si ABC est isocèle, on peut calculer les longueurs de ses trois côtés:
Pour savoir si ABC est isocèle, on peut calculer les longueurs de ses trois côtés:


<source lang="python">
<syntaxhighlight lang="python">
a=Point(-1,3)
a=Point(-1,3)
b=Point(5,1)
b=Point(5,1)
Ligne 126 : Ligne 126 :
print(a.distance(c))
print(a.distance(c))
print(b.distance(c))
print(b.distance(c))
</syntaxhighlight>
</source>


Visiblement, ABC n'est pas isocèle. Mais
Visiblement, ABC n'est pas isocèle. Mais


<source lang="python">
<syntaxhighlight lang="python">
print(a.distance(b)**2)
print(a.distance(b)**2)
print(a.distance(c)**2+b.distance(c)**2)
print(a.distance(c)**2+b.distance(c)**2)
</syntaxhighlight>
</source>


La réciproque du [[w:Théorème de Pythagore|théorème de Pythagore]] nous apprend que ABC est rectangle en C, donc d'[[w:Hypoténuse|hypoténuse]] ''AB''.
La réciproque du [[w:Théorème de Pythagore|théorème de Pythagore]] nous apprend que ABC est rectangle en C, donc d'[[w:Hypoténuse|hypoténuse]] ''AB''.
Ligne 141 : Ligne 141 :
Donc le cercle circonscrit a pour diamètre ''[AB]'', donc pour centre le milieu de ''[AB]'':
Donc le cercle circonscrit a pour diamètre ''[AB]'', donc pour centre le milieu de ''[AB]'':


<source lang="python">
<syntaxhighlight lang="python">
m=a.milieu(b)
m=a.milieu(b)


print(m.affichage())
print(m.affichage())
</syntaxhighlight>
</source>


==Rayon du cercle==
==Rayon du cercle==
Ligne 151 : Ligne 151 :
On peut donc diviser par 2 la distance ''AB'' mais aussi vérifier que ''M'' est équidistant de ''A'', ''B'' et ''C'':
On peut donc diviser par 2 la distance ''AB'' mais aussi vérifier que ''M'' est équidistant de ''A'', ''B'' et ''C'':


<source lang="python">
<syntaxhighlight lang="python">
print(m.distance(a))
print(m.distance(a))
print(m.distance(b))
print(m.distance(b))
print(m.distance(c))
print(m.distance(c))
</syntaxhighlight>
</source>


==Figure==
==Figure==

Version du 16 avril 2020 à 09:28

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.


Voici l'énoncé de l'exercice:
Dans un repère orthonormé, on considère , et . Calculer les distances AB, AC et BC et en déduire la nature du triangle ABC. Puis en déduire les coordonnées du centre de son cercle circonscrit.

Création de l'objet

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

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

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

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 license GPL ce qui autorise à les citer, au nom de la liberté numéro 1 (celle d'étudier le logiciel) de Richard Stallman.

Vecteur

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

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

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

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

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

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

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: