L’origine de ce document était d’illustrer l’effet de la fonction setworldcoordinates
dans une fenêtre créée avec le module turtle de Python. L’utilisation de Python pour représenter des fonctions a été abordée par François Goichot dans son article (Python et les graphes de fonctions). Une analyse du changement de repère dans le module turtle de Python est suivie d’une comparaison des changements de repères dans d’autres logiciels. Le critère de comparaison est essentiellement la perception de l’observateur.
Pour réagir à l’article vous pouvez poster un message en suivant le lien en toute fin de page.
Cet article peut être librement diffusé et son contenu réutilisé pour une utilisation non commerciale (contacter l’auteur pour une utilisation commerciale) suivant la licence CC-by-nc-sa
Article
Introduction
L’utilisation d’outils numériques pour représenter des situations géométriques est chose commune à notre époque. Les possibilités de ces outils, notamment la facilité à changer de repère crée un nouveau type d’acteur dans l’expérimentation géométrique. Je l’appellerai « observateur ». C’est un nouveau rôle qui se distingue clairement de ceux en jeu dans la géométrie euclidienne étudiée avec règle et compas. Dans ce dernier cas [1], l’acteur est à la fois « facteur [2] » et « observateur ». Il ne peut y avoir pour lui de différence de géométrie des objets du point de vue de leur définition ou de leur perception.
Dans son article, François Goichot propose de tracer la représentation graphique d’une fonction en traçant des segments à l’aide du module turtle de Python. Il ne s’agit pas ici de discuter ce choix.
Le lecteur se reportera à l’article suffisamment clair et détaillé pour en apprendre plus. Il nous fournit ce module nommé tortue.py. Ce module inclut la fonction change_repere qui est une traduction de la fonction setworldcoordinates
du module turtle originel.
Dans le document d’aide du module tortue, on peut lire :
change_repere(xmin, ymin, xmax, ymax)
définit un nouveau repère : les abscisses iront de xmin à xmax (dans la fenêtre disponible) et les ordonnées de ymin à ymax (idem) ; il y a d’abord une mise à zéro ; ATTENTION, les angles seront déformés de manière imprévisible.
L’aide de Python fournit ceci :
turtle.setworldcoordinates(llx, lly, urx, ury)
Parameters:
llx – a number, x-coordinate of lower left corner of canvas
lly – a number, y-coordinate of lower left corner of canvas
urx – a number, x-coordinate of upper right corner of canvas
ury – a number, y-coordinate of upper right corner of canvas
Set up user-defined coordinate system and switch to mode “world” if necessary.
This performs a screen.reset().
If mode “world” is already active, all drawings are redrawn according to the new
coordinates.
ATTENTION: in user-defined coordinate systems angles may appear distorted.
Cette dernière mise en garde appelle plusieurs questions : comment et pourquoi les angles sont-ils modifiés ? Est-ce réellement imprévisible ? Quelle perception est induite pour l’observateur ?
Annexes
Utilitaire Python/Turtle
Dans cette annexe vous trouverez une proposition pour tracer un repère dans la fenêtre courante crée avec le module turtle
.
Ce module peut être importé.
Si rendu exécutable, le script donne :
- Figure 12
- Fenêtre de fin de script (programme principal)
Voici le script python carolinerepere.py
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- """
- #
- # carolinerepere.py
- #
- # Illustration de l'usage du module tortue de Python pour afficher
- # une fenêtre repérée.
- #
- # module importé : turtle : import turtle
- # fonctions du module :
- # repere(xmin,xmax,ymin,ymax,gradx,grady,tortue)
- #
- #"""
- import turtle
- def repere(xmin,xmax,ymin,ymax,gradx,grady,tortue):
- """repere(xmin,xmax,ymin,ymax,gradx,grady,tortue)
- cette fonction utilise une tortue déjà présente et lui fait tracer un repère
- conforme aux paramètres transmis.
- il est possible d'effacer le repère produit lorsqu'on invoque la méthode
- clear() de la tortue considérée dans le programme principal.
- Si O n'appartient pas à l'intervalle [xmin;xmax]
- L'axe des ordonnées n'est pas tracé
- Si O n'appartient pas à l'intervalle [ymin;ymax]
- L'axe des ordonnées n'est pas tracé"""
- #axe des abscisses
- if (0>ymin) and (0<ymax) :
- tortue.penup()
- tortue.goto(xmin,0)
- tortue.pendown()
- tortue.goto(xmax,0)
- tortue.penup()
- N1=int(xmin/gradx)
- N2=int(xmax/gradx)+1
- for i in range(N1,N2):
- tortue.goto(i*gradx,0)
- tortue.pendown()
- tortue.goto(i*gradx,-(ymax-ymin)*0.02)
- tortue.penup()
- if i==1:
- tortue.goto(i*gradx,-(ymax-ymin)*0.06)
- tortue.write(i*gradx,align="center")
- #axe des ordonnees
- if (0>xmin) and (0<xmax) :
- tortue.penup()
- tortue.goto(0,ymin)
- tortue.pendown()
- tortue.goto(0,ymax)
- tortue.penup()
- N1=int(ymin/grady)
- N2=int(ymax/grady)+1
- for i in range(N1,N2):
- tortue.goto(0,i*grady)
- tortue.pendown()
- tortue.goto(-(xmax-xmin)*0.02,i*grady)
- tortue.penup()
- if i==1:
- tortue.goto(-(xmax-ymin)*0.02,i*grady)
- tortue.write(i*grady,align="center")
- if __name__ == '__main__':
- scene=turtle.Screen()
- scene.setup(width=600,height=400)
- turtle.setworldcoordinates(-5.1,-5.1,5.1,5.1)
- joe=turtle.Turtle()# tortue dédiée au tracé du repère
- repere(-5,5,-5,5,1,1,joe)
- joe.hideturtle()
- caroline=turtle.Turtle()
- caroline.penup()
- caroline.goto(-1,-1)
- caroline.color("blue")
- caroline.pendown()
- for i in range(4):
- caroline.forward(3)
- caroline.left(90)
- # la fenêtre ne se ferme que si l'observateur clique dessus.
- turtle.exitonclick()
On peut créer un script important le module. L’exécution de ce script illustre le tracé dans une fenêtre avec un jeu de coordonnées inadapté pour l’observateur. Une correction des dimensions de la fenêtre, puis un nouveau jeu de coordonnées rétablit une perception correcte des objets géométriques tracés.
Voici un premier script carolinetest.py :
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- from carolinerepere import *
- if __name__ == '__main__':
- scene=turtle.Screen()
- scene.setup(width=600,height=400)
- turtle.setworldcoordinates(-5.1,-5.1,5.1,5.1)
- jack=turtle.Turtle()
- jack.hideturtle()
- repere(-5,5,-5,5,1,1,jack)
- caroline=turtle.Turtle()
- caroline.penup()
- caroline.goto(-1,-1)
- caroline.color("blue")
- caroline.pendown()
- for i in range(4):
- caroline.forward(3)
- caroline.left(90)
- caroline.color("red")
- for i in range(3):
- caroline.forward(3)
- caroline.left(120)
- caroline.color("green")
- caroline.left(90)
- for i in range(3):
- caroline.forward(3)
- caroline.left(120)
- # changement de la fenêtre observateur
- scene.setup(width=600,height=600)
- # adaptation du jeu de coordonnées aux nouvelles dimensions
- turtle.setworldcoordinates(-5.1,-5.1,5.1,5.1)
- # la fenêtre ne se ferme que si l'observateur clique dessus.
- turtle.exitonclick()
- Figure 13
- Fenêtre de fin de script carolinetest.py
Voici un deuxième script carolinetestfonction.py qui complète la démarche de François Goichot dans son article.
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- from carolinerepere import *
- def g(x):
- '''la fonction qu'on veut représenter'''
- return(2*x*x-3*x+1)
- def h(x):
- '''la fonction qu'on veut représenter'''
- return(2*x+1)
- def dessin(f,a,b,n,tortue):
- '''fait dessiner par tortue l'approximation affine
- par morceau du graphe de f obtenu en reliant les
- points (xi,f(xi)) sur [a,b] avec un nombre n+1 de points'''
- tortue.penup()
- pas=(b-a)/n
- for i in range(n):
- tortue.goto(a+i*pas,f(a+i*pas))
- tortue.pendown()
- tortue.goto(a+(i+1)*pas,f(a+(i+1)*pas))
- tortue.penup()
- if __name__ == '__main__':
- scene=turtle.Screen()
- scene.setup(width=600,height=400)
- turtle.setworldcoordinates(-5.1,-5.1,5.1,5.1)
- joe=turtle.Turtle()
- joe.hideturtle()
- repere(-5,5,-5,5,1,1,joe)
- caroline=turtle.Turtle()
- caroline.hideturtle()
- caroline.color("blue")
- dessin(g,-4,3,30,caroline)
- scene.setup(width=600,height=600)
- turtle.setworldcoordinates(-3.1,-1.1,7.1,10.1)
- joe.clear()
- joe.color("purple")
- repere(-3,7,-1,10,1,1,joe)
- caroline.color("brown")
- dessin(h,-1,5,2,caroline)
- turtle.setworldcoordinates(-5.1,-4.1,5.1,40.1)
- joe.clear()
- repere(-5,5,-5,40,1,2,joe)
- # la fenêtre ne se ferme que si l'observateur clique dessus.
- turtle.exitonclick()