- la NumWorks dont l'application Python intègre directement turtle
- les Casio Graph 35+E II et Graph 90+E dont l'application Python intègre directement turtle
- les TI-Nspire CX II sur lesquelles on peut rajouter un module turtle officiel à l'environnement Python
- et sur les TI-83 Premium CE Edition Python (France), TI-84 Plus CE-T Python Edition (Europe) et TI-84 Plus CE Python (Amérique du Nord), on pouvait jusqu'ici rajouter un module officiel ce_turtl à l'application Python
Ils apparaissaient au menu uniquement lorsque l'on était en train d'éditer un script comportant une ligne les important (dans notre cas forcément sous la forme
from ce_turtl import
, et pas un simple import ce_turtl
).Lors de la création d'un script, afin d'obtenir le menu te permettant de saisir facilement et rapidement les appels aux différentes méthodes de ce_turtl, tu devrais donc commencer par te taper la saisie lettre par lettre au clavier de sa ligne d'importation, avec en prime le caractère tiret bas qui n'est pas au clavier et était donc à aller chercher dans un menu.
Mais attends car le pire, c'est que c'était encore loin d'être le pire...
Aucun effort ne semblait avoir été fait pour coller au standard : des méthodes essentielles manquantes, des noms de méthodes fantaisistes, des arguments attendus différant du standard dans leur nombre, leur ordre ou leur type... et ne parlons même pas encore du comportement attendu.
Si tu ne faisais pas l'effort d'adapter ton code, il t'était fort probable d'obtenir n'importe quoi. Voici ci-contre ce que donne un escargot sur ordinateur et l'ensemble de la concurrence, et sur TI-83 Premium CE Edition Python et compatibles avec ce_turtl...
Quel professeur allait perdre du temps à faire apprendre un sous-dialecte du turtle ne fonctionnant que sur calculatrice TI-83 Premium CE Edition Python, risquant ainsi de mélanger les élèves par rapport aux documents, ouvrages ou autres autres plateformes auxquels ils ont accès (ordinateur, tablette, smartphone, calculatrice d'un autre modèle) ?...
Nous savons parfaitement que la mémoire de tas (heap) du Python des TI-83 Premium CE Edition Python et compatibles est extrêmement limitée, seulement 19,968 Ko de capacité, et en pratique souvent bien moins de disponible car les modules importés prennent de la place.
Dans ce contexte nous comprenons parfaitement qu'il faille se limiter et faire des choix.
Mais nous persistons à penser que l'on pouvait faire largement mieux niveau compatibilité et conformité que ce que nous a offert ce_turtl, et ce sans augmenter la consommation de heap à l'exécution.
Ce nouveau module turtle peut être installé indépendamment de la mise à jour ; il fonctionne tout aussi bien sur les versions précédentes selon nos tests.
Donc plus de saisie fastidieuse, une seule touche suffit à coller la ligne d'importation et alors faire apparaître tout le contenu du nouveau module turtle au menu !
Mais reste à voir pour le reste. Découvrons donc maintenant ensemble si le nouveau module turtle est effectivement meilleur que ce_turtl.
A) Informations et fonctionnement
Go to top- TURTLE.8xv
- GRID.8xv
TURTLE.8xv est le module Python complémentaire en question, ici en version 2.0.0. Soit cela signifie qu'il y a eu des versions inférieures de test auxquelles nous n'avons pas eu accès, soit ce changement de numérotation majeure est pour noter une différence significative par rapport à ce_turtle.
Le fichier TURTLE.8xv a été généré par Texas Instruments à l'aide de py2appvar, un outil non public de Texas Instruments permettant à partir d'un fichier source Python :
- la conversion du cose source Python en bytecode Python
- l'énumération des éléments à mettre au menu à partir de lignes de commentaires spécialement formatées à cette fin dans le code source
Contrairement à CE_TURTL.8xv, TURTLE.8xv a été généré à l'aide d'une version plus récente de l'outil py2appvar, non plus la 1.2.0 mais la 1.2.1. Nous supposons que py2appvar 1.2.1 ajoute la gestion de la nouvelle ligne de commentaire permettant de spécifier l'ajout de la commande d'importation au menu des modules complémentaires.
GRID.8xv quant à lui n'est rien d'autre qu'une image 320×210 pixels au format IM8C directement affichable par les scripts Python de la calculatrice et que voici justement ci-contre ; il s'agit donc d'une grille.
- Code: Select all
from ti_image import *
load_image("GRID")
show_image(0, 0)
show_screen()
Cette image sera affichée automatiquement à chaque début d'appel à des fonctions de tracé turtle, se comportant donc comme une sorte de fond d'écran.
- Code: Select all
from turtle import *
t = Turtle()
t.circle(52)
t.done()
Tu peux très bien te passer de GRID, soit ne pas transférer ou effacer la variable en question. Dans ce cas cela ne déclenche pas d'erreur, mais rappelons que le Python sur TI-83 Premium CE Edition Python et compatible ne dispose pas d'un buffer dédié aux affichages graphiques, ces derniers étant effectués par-dessus la console. Ne trouvant alors rien à afficher, l'écran ne sera pas nettoyé et il te faudra alors rajouter du code en ce sens.
Tu peux également t'amuser à remplacer le fond d'écran du module turtle comme bon te semble. Notre outil en ligne img2calc te permet de convertir n'importe quelle image au format IM8C de Texas Instruments, et il te suffira alors juste de choisir le nom GRID pour la calculatrice.
Rappelons que comme le buffer d'affichage est ici unique, tu dois effectuer une pause en fin de script sous peine de voir ton tracé une fois terminé être immédiatement écrasé par l'affichage de la console. Le module turtle t'offre pour cela la méthode
.done()
qui attend l'appui sur la touche annul(ou
clearsur les TI-84 Plus CE), mais tu es libre d'utiliser n'importe quel autre code générant une attente.
À noter que le module turtle t'offre la possibilité de désactiver l'affichage de la grille. Il te suffira d'appeler la méthode .hidegrid() avant ta première instruction d'affichage.
En pratique la méthode .hidegrid() efface simplement l'écran en blanc.
B) Le tour des menus
Go to top- Move : pour les déplacements de la tortue
- Draw : pour les tracés autres que des segments (cercle, texte, remplissage, ...)
- Pen : pour tout ce qui concerne le stylo (levé, baissé, couleur, taille)
- Settings : pour différents réglages (effacement du tracé, cacher/montrer la tortue, désactiver l'affichage de la grille comme déjà vu, vitesse)
- State : pour interroger l'état de la tortue (position, orientation)
C) Premier script comparatif (ce_turtl + turtle)
Go to topce_turtl | turtle |
|
|
Déjà ce script met en évidence un bug en Python des TI-83 Premium CE Edition Python et compatibles : au-delà d'une certaine valeur de rayon les tracés de cercles se déforment très rapidement et tendent vers des carrés.
Le bug n'est en fait ni dans ce_turtl ni dans turtle, mais dans le module de tracé par pixels ti_graphics qu'ils utilisent tous les deux sur ces calculatrices, visiblement toujours pas corrigé en version 5.7.
Si en plus on fait rentrer la concurrence dans l'équation, il n'est pas envisageable pour nous de maintenir jusqu'à 7 versions différentes pour chaque script testé...
D) Tests de conformité comparatifs (tous modèles)
Go to topVoici des scripts en ce sens, une amélioration majeure de ceux développés dans le code de notre test de rentrée QCC 2021 :
- Code: Select all
_turtle_errors = 0
def _turtle_error(k):
global _turtle_errors
_turtle_errors |= 1 << k
# import turtle
try:
import turtle
if not "forward" in dir(turtle):
turtle = turtle.Turtle()
except ImportError: #TI-83 Premium CE
from ce_turtl import turtle
_turtle_error(0)
try:
turtle.clear()
except:
turtle.reset()
# can turtle be patched ?
_fix_turtle = True
try:
def _fixcolor(c): return c
turtle._fixcolor = _fixcolor
except:
_fix_turtle = False
# test color() + pencolor() + fillcolor()
if not "pencolor" in dir(turtle):
pencolor = turtle.color
_turtle_error(1)
else:
pencolor = turtle.pencolor
if not "color" in dir(turtle):
_turtle_error(2)
if not "fillcolor" in dir(turtle):
_turtle_error(12)
if not "clear" in dir(turtle):
_turtle_error(13)
if not "reset" in dir(turtle):
_turtle_error(14)
if not "heading" in dir(turtle):
_turtle_error(11)
# test color argument types
_color_types = 0
try:
pencolor([0, 0, 0])
_color_types |= 1 << 0
except: _turtle_error(4)
try:
pencolor((0, 0, 0))
_color_types |= 1 << 1
except: _turtle_error(5)
try:
pencolor(0, 0, 0)
_color_types |= 1 << 2
except: _turtle_error(6)
try:
pencolor("black")
_color_types |= 1 << 3
except: _turtle_error(7)
# test colormode()
if not "colormode" in dir(turtle):
_turtle_error(3)
# test color strings
_colors_fix={
"blue":(0,0,1),
"green":(0,1,0),
"red":(1,0,0),
"cyan":(0,1,1),
"yellow":(1,1,0),
"magenta":(1,0,1),
"white":(1,1,1),
"orange":(1,0.65,0),
"purple":(0.66,0,0.66),
"brown":(0.75,0.25,0.25),
"pink":(1,0.75,0.8),
"grey":(0.66,0.66,0.66),
"black":(0,0,0),
}
for c in tuple(_colors_fix.keys()):
try:
pencolor(c)
_colors_fix.pop(c)
except: pass
if len(_colors_fix):
if _color_types & 1 << 3:
_turtle_error(8)
# test circle(,)
try: turtle.circle(0,0)
except:
_turtle_error(9)
# test for unfixable missing functions
_missing_fct=["write","pensize","dot"]
for f in tuple(_missing_fct):
try:
eval("turtle."+f)
_missing_fct.remove(f)
except: pass
if len(_missing_fct):
_turtle_error(15)
_missing_alias=[
["backward","back","bk"],
["forward","fd"],
["right","rt"],
["left","lt"],
["position","pos"],
["goto","setpos","setposition"],
["setheading","seth"],
["pendown","pd","down"],
["penup","pu","up"],
["pensize","width"],
["showturtle","st"],
["hideturtle","ht"],
]
for aliases in tuple(_missing_alias):
validf = None
for f in tuple(aliases):
try:
eval("turtle."+f)
validf = f
aliases.remove(f)
break
except: pass
for f in tuple(aliases):
try:
eval("turtle."+f)
aliases.remove(f)
except: pass
if not len(aliases):
_missing_alias.remove(aliases)
else:
aliases.insert(0, validf)
if len(_missing_alias):
_turtle_error(16)
try:
turtle.position()
except:
try:
turtle.pos()
except:
_turtle_error(10)
- Code: Select all
from ttl_chk import *
from ttl_chk import _fix_turtle, _turtle_errors, _colors_fix, _missing_fct, _missing_alias
def turtle_diags():
print("Type: " + str(type(turtle)))
print("Patchable: " + (_fix_turtle and "yes" or "no"))
errors_msg = (
"No <import turtle>",
"No pencolor()",
"No color()",
"No colormode()",
"No color as list",
"No color as tuple",
"No color as args",
"No color as string",
"Missing colors strings: ",
"No circle(,angle)",
"Can't get position()",
"No heading()",
"No fill",
"No clear()",
"No reset()",
"Other missing: ",
"Missing aliases: ",
)
errors = 0
for k in range(len(errors_msg)):
if _turtle_errors & 1 << k:
errors += 1
msg = "Err " + str(k) + ": " + errors_msg[k]
if k == 8:
msg += str(len(_colors_fix)) + " " + str(tuple(_colors_fix.keys()))
if k == 15:
msg += str(len(_missing_fct)) + " " + " ".join(_missing_fct)
if k == 16:
l = []
for v in _missing_alias:
l.extend(v[1:])
msg += str(len(l)) + " " + " ".join(l)
print(msg)
print(str(errors) + " error" + ((errors > 1) and "s" or ""))
turtle_diags()
Voici ce que nous racontent les scripts sur calculatrices Texas Instruments :
TI-83PCE/84+CE ce_turtl | TI-83PCE/84+CE turtle | TI-Nspire CX II turtle |
- ligne d'importation non standard (à cause du nom)
- réglage non standard de la couleur du tracé, utilisant la méthode .color() au lieu de .pencolor()
- absence de la méthode .colormode() et donc pas de possibilité de modifier le mode des coordonnées de couleurs (maximum de chaque composante à 1 ou à 255)
- refus des paramètres de couleurs sous forme de tuple, liste ou chaîne de caractères, les fonctions concernée prennent obligatoirement 3 paramètres avec les valeurs de chaque composante
- la méthode .circle() ne prend qu'un seul argument et ne gère donc pas les arcs de cercle
- absence des méthodes de remplissage
- absence de la méthode d'effacement et réinitialisation de la tortue .reset()
- absence de la méthode d'écriture de texte .write()
- absence de 18 alias courts pour les noms de méthodes
Son code source ne semblerait pas dériver de celui de ce_turtl, puisque certaines erreurs disparaissent alors qu'une autre apparaît.
Restent donc :
- absence de la méthode .color()
- absence de la méthode .colormode() et donc pas de possibilité de modifier le mode des coordonnées de couleurs (maximum de chaque composante à 1 ou à 255)
- refus des paramètres de couleurs sous forme de liste ou chaîne de caractères, mais les tuples sont acceptés
- la méthode .circle() ne prend qu'un seul argument et ne gère donc pas les arcs de cercle
- absence de la méthode d'effacement et réinitialisation de la tortue .reset()
- absence de 16 alias courts pour les noms de méthodes
Le turtle des TI-Nspire CX II pour sa part ne donne que 5 erreurs. Vu la grande similarité, on pourrait se demander si le nouveau module turtle des TI-83 Premium CE Edition Python et compatibles ne découlerait pas de celui des TI-Nspire CX II, avec juste la suppression des paramètres de couleurs sous forme de chaîne de caractères afin d'économiser un peu de place en heap.
Voici pour référence les résultats du même test chez la concurrence :
Casio Graph 90/35+E II | NumWorks | |
Voici un script qu'il suffit d'importer à la place du module turtle de chaque machine, et lorsque autorisé corrige la plupart des erreurs détectées :
- Code: Select all
from ttl_chk import *
from ttl_chk import _color_types, _turtle_errors, _colors_fix, _missing_fct, _missing_alias
_fix_turtle = True
def nop(*argv): return None
idty = lambda c: c
try: # can turtle be patched ?
turtle._fixcolorlist = idty
turtle._fixcolorval = idty
turtle._fixcolorstring = idty
turtle._fixcolorargs = idty
turtle._fixcolor = lambda c: turtle._fixcolorlist(turtle._fixcolorval(turtle._fixcolorstring(turtle._fixcolorargs(c))))
except:
_fix_turtle = False
if _fix_turtle:
# fix color() + pencolor()
if _turtle_errors & 2:
turtle.pencolor = turtle.color
if _turtle_errors & 4:
turtle.color = turtle.pencolor
if _turtle_errors & 0x1000:
turtle.fillcolor, turtle.begin_fill, turtle.end_fill = idty, nop, nop
_fix_color = _color_types & 0b11 != 0b11 or not "colormode" in dir(turtle)
# fix list/tuple color argument
if _color_types & 0b11 == 0b10:
def _fixcolorlist(c): return type(c) is list and tuple(c) or c
turtle._fixcolorlist = _fixcolorlist
if _color_types & 0b11 == 0b01:
def _fixcolorlist(c): return type(c) is list and list(c) or c
turtle._fixcolorlist = _fixcolorlist
if not _color_types & 4:
def _fixcolorargs(*argv):
return len(argv) != 1 and argv or argv[0]
if _fix_color:
turtle._color = turtle.color
turtle._pencolor = turtle.pencolor
turtle._fillcolor = turtle.fillcolor
if _color_types & 0b11:
def _color(*argv):
if not(len(argv)): return turtle._color()
turtle._color(turtle._fixcolor(len(argv) > 1 and argv or argv[0]))
def _pencolor(*argv):
if not(len(argv)): return turtle._pencolor()
turtle._pencolor(turtle._fixcolor(len(argv) > 1 and argv or argv[0]))
def _fillcolor(*argv):
if not(len(argv)): return turtle._fillcolor()
turtle._fillcolor(turtle._fixcolor(len(argv) > 1 and argv or argv[0]))
else:
def _color(*argv):
if not(len(argv)): return turtle._color()
c = turtle._fixcolor(len(argv)>1 and argv or argv[0])
turtle._color(c[0], c[1], c[2])
def _pencolor(*argv):
if not(len(argv)): return turtle._pencolor()
c = turtle._fixcolor(len(argv)>1 and argv or argv[0])
turtle._pencolor(c[0], c[1], c[2])
def _fillcolor(*argv):
if not(len(argv)): return turtle._fillcolor()
c = turtle._fixcolor(len(argv)>1 and argv or argv[0])
turtle._fillcolor(c[0], c[1], c[2])
turtle.color = _color
turtle.pencolor = _pencolor
turtle.fillcolor = _fillcolor
# fix colormode()
if _turtle_errors & 8:
# test color mode
try:
turtle.pencolor([255, 0, 0])
_color_mode = 255
except: _color_mode = 1.0
turtle._color_mode = _color_mode
def _colormode(*argv):
if not(len(argv)): return turtle._color_mode
if int(argv[0]) in (1, 255):
turtle._color_mode = int(argv[0]) == 255 and 255 or 1.0
turtle.colormode = _colormode
if _color_mode == 255:
turtle._fixcolorval = lambda c: int(turtle._color_mode) == 1 and type(c) in (list, tuple) and [int(c[k] * 255) for k in range(3)] or c
else:
turtle._fixcolorval = lambda c: turtle._color_mode == 255 and type(c) in (list, tuple) and [c[k] / 255 for k in range(3)] or c
# fix color strings
if len(_colors_fix):
def _fixcolorstring(c):
if type(c) is str and c in _colors_fix:
c = _colors_fix[c]
if turtle.colormode() == 255:
c = [int(c[k] * 255) for k in range(3)]
return c
turtle._fixcolorstring = _fixcolorstring
# fix circle(,)
if _turtle_errors & 0x200:
turtle._circle = turtle.circle
def _circle(r, a=360): turtle._circle(r)
turtle.circle = _circle
if len(_missing_fct):
for f in _missing_fct:
exec("turtle."+f+"=nop")
if len(_missing_alias):
for aliases in _missing_alias:
validf = aliases[0]
for f in aliases[1:]:
exec(validf and "turtle."+f+"=turtle."+validf or "turtle."+f+"=nop")
# fix clear()
if _turtle_errors & 0x2000:
turtle.clear = turtle.reset
# fix reset()
if _turtle_errors & 0x4000:
turtle.reset = turtle.clear
Nous pouvons envisager à partir de maintenant d'avoir une unique version de chaque script utilisable sur l'ensemble des machines.
E) 12 exemples comparatifs (tous modèles)
Go to topCela va justement être l'occasion de voir si il y a d'autres problèmes qui n'ont pas pu être détectés automatiquement
Exemple n°1 : Rosace à la Casio
Go to topPrécisons que les problèmes récurrents ne seront pas systématiquement réévoqués sur chaque exemple.
Commençons par une petite rosace à la Casio ; tout possesseur de Graph 35+E II sait en effet que Casio aime bien ça :
- Code: Select all
from ttl_fix import *
turtle.speed(0)
turtle.pensize(1)
turtle.pencolor("black")
for i in range(12):
turtle.left(30)
for i in range(8):
turtle.forward(30)
turtle.left(45)
try: turtle.show() #TI-83 Premium CE
except: pass
C'est la base, tout-le-monde s'en sort à peu près, mais tu peux déjà constater quelques légers écarts.
Ici l'appel
turtle.pensize(1)
produisait l'effet d'un turtle.pensize(2)
.Et plus généralement un appel
turtle.pensize(s)
produisait l'effet d'un turtle.pensize(s+1)
.L'écran de la Casio Graph 35+E II a une définition très inférieure de seulement 128×64 pixels, et bien évidemment le tracé est donc tronqué. Pour le coup, là cela aurait été particulièrement utile de pouvoir faire défiler le tracé...
Exemple n°2 : Fractale de Koch
Go to top- Code: Select all
from ttl_fix import *
def koch(n, l):
if n==0:
turtle.forward(l)
else:
koch(n - 1, l / 3)
turtle.left(60)
koch(n - 1, l / 3)
turtle.right(120)
koch(n - 1, l / 3)
turtle.left(60)
koch(n - 1, l / 3)
turtle.speed(0)
turtle.pensize(1)
turtle.pencolor("blue")
turtle.penup()
turtle.goto(-180, -50)
turtle.pendown()
koch(4, 360)
try: turtle.show() #TI-83 Premium CE
except: pass
Le cas de KhiCAS est complètement différent et n'est à la différence pas un problème. La fenêtre obtenue défile automatiquement en fonction des mouvements de la tortue, et peut même être défilée au clavier une fois le tracé terminé, ce qui est d'ailleurs fort utile pour explorer des tracés débordant de la fenêtre graphique. Une exclusivité à ce jour sur calculatrices !
Exemple n°3 : Flocons de Koch
Go to top- Code: Select all
from ttl_fix import *
def rotate_list(l):
l[1:],l[0] = l[0:-1],l[-1]
def koch(n, l):
if n<=0:
turtle.forward(l)
else:
koch(n - 1, l / 3)
turtle.left(60)
koch(n - 1, l / 3)
turtle.right(120)
koch(n - 1, l / 3)
turtle.left(60)
koch(n - 1, l / 3)
def flock(n, l):
koch(n, l)
turtle.right(120)
koch(n, l)
turtle.right(120)
koch(n, l)
c = [127, 255, 0]
turtle.speed(0)
turtle.colormode(255)
l = 80
for j in range(2):
for i in range(3):
n = j and 3 + i or 2 - i
s = (7 - n) // 2
turtle.penup()
turtle.goto(i*117-157, j*95-25)
turtle.pencolor(tuple(c))
turtle.pensize(s)
turtle.setheading(0)
turtle.pendown()
flock(n, l)
n += 1
rotate_list(c)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°4 : Sous le soleil exactement
Go to top- Code: Select all
from ttl_fix import *
from math import exp
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(1.0)
for i in range(36):
turtle.pencolor([exp(-.5 * ((i - k) / 12)**2) for k in (6, 18, 30)])
for i in range(1, 5):
turtle.forward(60)
turtle.right(90)
turtle.right(10)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°5 : Escargot de lumière
Go to top- Code: Select all
from ttl_fix import *
from math import exp
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(1.0)
turtle.penup()
turtle.goto(0, -20)
turtle.pendown()
for i in range(36):
turtle.pencolor([exp(-.5 * ((i - k) / 12)**2) for k in (6, 18, 30)])
turtle.circle(50 - i)
turtle.right(10)
try: turtle.show() #TI-83 Premium CE
except: pass
C'est que la méthode turtle.circle() de ce_turtl nous trace ici des cercles ayant pour centre la position actuelle de la tortue. Alors que dans le standard, le cercle tracé passe par la position de la tortue.
Exemple n°6 : Triangles de Sierpiński
Go to top- Code: Select all
from ttl_fix import *
def sierp(n, l):
if n == 0:
for i in range (0, 3):
turtle.forward(l)
turtle.left(120)
if n > 0:
sierp(n - 1, l / 2)
turtle.forward(l / 2)
sierp(n - 1, l / 2)
turtle.backward(l / 2)
turtle.left(60)
turtle.forward(l / 2)
turtle.right(60)
sierp(n - 1, l / 2)
turtle.left(60)
turtle.backward(l / 2)
turtle.right(60)
turtle.speed(0)
turtle.pensize(1)
turtle.penup()
turtle.backward(109)
turtle.left(90)
turtle.backward(100)
turtle.right(90)
turtle.pendown()
turtle.pencolor("red")
sierp(6, 217)
turtle.penup()
turtle.forward(400)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°7 : Casio Graph 90+E
Go to top- Code: Select all
from ttl_fix import *
turtle.pencolor("black")
turtle.speed(0)
turtle.forward(40)
turtle.backward(100)
turtle.left(90)
turtle.forward(30)
turtle.right(60)
turtle.forward(60)
turtle.right(30)
turtle.forward(30)
turtle.penup()
turtle.forward(18)
turtle.right(90)
turtle.forward(60)
turtle.pendown()
turtle.right(30)
turtle.backward(30)
turtle.right(60)
turtle.forward(60)
turtle.pencolor("red")
turtle.penup()
turtle.goto(80,40)
turtle.right(140)
turtle.pendown()
turtle.circle(30)
turtle.penup()
turtle.goto(105,50)
turtle.pencolor("green")
turtle.pendown()
turtle.circle(-50)
turtle.penup()
turtle.pencolor("red")
turtle.right(21)
turtle.goto(60,20)
turtle.pendown()
turtle.circle(40,60)
turtle.penup()
turtle.pencolor("blue")
turtle.goto(-50,15)
turtle.setheading(0)
turtle.pendown()
turtle.write("CASIO")
try: turtle.show() #TI-83 Premium CE
except: pass
- Absence de la méthode turtle.write() permettant d'écrire du texte à la position de la tortue, et donc absence du mot CASIO sur le rendu.
- La méthode standard
turtle.circle(r, a=360)
permet de préciser l'angle au centre en 2ème argument et ainsi de tracer des arcs de cercle, l'omission de ce paramètre donnant par défaut un angle au centre de 360° et donc un cercle. C'est utilisé ici pour tracer le pied du 9 en rouge. Sauf que l'implémentation dans ce_turtl ne respecte pas le standard et ne gère pas ce 2ème argument. Notre script correctif intercepte le cas et empêche l'interruption du rendu sur une erreur, mais trace alors un cercle complet à la place. - La méthode standard
turtle.circle(r, a=360)
accepte de plus une valeur de rayon négative, inversant dans ce cas le sens de tracé. C'est utilisé ici pour tracé le 0 en vert. Sauf que ce_turtl ne comprend pas ce cas et ne trace alors rien du tout.
Notons une divergence du standard chez une bonne partie des modèles concernant la méthode turtle.write(). La norme est d'écrire le texte dans un rectangle horizontal prenant la position courante de la tortue comme sommet inférieur gauche. Or beaucoup d'implémentations utilisent le sommet supérieur gauche : le nouveau turtle pour TI-83 Premium CE Edition Python et compatibles, ainsi que les Casio Graph 35+E II et Graph 90+E.
Exemple n°8 : Sapin de Noël
Go to top- Code: Select all
from ttl_fix import *
from math import sqrt
def triangle(t):
for i in range(4):
turtle.forward(t/(i%4 == 0 and 2 or sqrt(2)))
turtle.left(i==1 and 90 or not(i%2) and 135)
def etoiles():
turtle.pencolor("yellow")
turtle.pensize(2)
for i in range(8):
etoile(-60-30*(i%4)+(i>=4 and 220), (-80,10,-40,60)[i%4])
def etoile(x,y):
turtle.up()
turtle.goto(x,y)
turtle.down()
for i in range(12):
turtle.forward(10)
turtle.left(i%2 and -60 or 120)
turtle.up()
turtle.goto(0,60)
turtle.down()
turtle.pencolor("green")
turtle.pensize(5)
for i in range(4):
triangle(50+20*i)
turtle.up()
turtle.goto(0,30-40*i)
turtle.down()
turtle.pencolor("brown")
turtle.backward(10)
for i in range(4):
turtle.forward(i%2 and 40 or 20)
turtle.left(90)
etoiles()
try: turtle.show() #TI-83 Premium CE
except: pass
Bizarrement ici aussi, La TI-Nspire CX II se met soudainement à ne plus respecter les instructions relatives à l'épaisseur du tracé, alors qu'elles marchaient plus haut...
Exemple n°9 : Supernova PhiX 177
Go to top- Code: Select all
from ttl_fix import *
def poly_reg_a(l, a):
h0 = turtle.heading()
while True:
turtle.forward(l)
turtle.left(a)
if abs(h0 - turtle.heading()) < .1:
break
turtle.colormode(255)
turtle.pensize(2)
turtle.penup()
turtle.goto(-90,16)
turtle.pendown()
turtle.pencolor((246,89,164))
try:
turtle.fillcolor((180,20,90))
turtle.begin_fill()
except: pass
poly_reg_a(180, 160)
try:
turtle.end_fill()
except: pass
try: turtle.show() #TI-83 Premium CE
except: pass
turtle.heading()
.Exemple n°10 : Champ de zinnias en été
Go to top- Code: Select all
from ttl_fix import *
from random import randint, seed
def rotate_list(l):
l[1:],l[0] = l[0:-1],l[-1]
def poly_reg_a(l, a):
h0 = turtle.heading()
while True:
turtle.forward(l)
turtle.left(a)
if abs(h0 - turtle.heading()) < .1:
break
seed(33)
turtle.colormode(255)
turtle.pensize(1)
turtle.hideturtle()
turtle.speed(0)
c=[255,127,0]
cf=[127,255,0]
for k in range(18):
turtle.penup()
turtle.goto(randint(-200,120), randint(-100,100))
turtle.pendown()
turtle.pencolor(tuple(c))
try:
turtle.fillcolor(tuple(cf))
turtle.begin_fill()
except: pass
poly_reg_a(80, 162)
try:
turtle.end_fill()
except: pass
rotate_list(c)
rotate_list(cf)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°11 : Courtepointe de grand-mère
Go to top- Code: Select all
from ttl_fix import *
def rotate_list(l):
l[1:],l[0] = l[0:-1],l[-1]
def poly_reg_a(l, a):
h0 = turtle.heading()
while True:
turtle.forward(l)
turtle.left(a)
if abs(h0 - turtle.heading()) < .1:
break
turtle.hideturtle()
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(255)
c = [255, 127, 0]
for j in range(4):
for i in range(4):
turtle.penup()
turtle.goto(i*88-172, j*85-142)
turtle.pendown()
turtle.pencolor(tuple(c))
poly_reg_a(80, 140)
rotate_list(c)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°12 : Vitrail de Notre-Dame
Go to top- Code: Select all
from ttl_fix import *
from math import sqrt
def rotate_list(l):
l[1:],l[0] = l[0:-1],l[-1]
def reg_poly(l, n):
for i in range(n):
turtle.forward(l)
turtle.left(360/n)
def square(l):
reg_poly(l, 4)
turtle.pencolor(0,0,0)
turtle.colormode(255)
turtle.speed(0)
turtle.pensize(3)
turtle.hideturtle()
d=200
c=[0,255,127]
turtle.penup()
turtle.goto(-d/2,-d/2)
turtle.setheading(0)
turtle.pendown()
for i in range(8):
try:
turtle.fillcolor(tuple(c))
turtle.begin_fill()
except: pass
square(d)
try:
turtle.end_fill()
except: pass
turtle.penup()
turtle.forward(d/2)
turtle.left(45)
turtle.pendown()
d/=sqrt(2)
rotate_list(c)
try: turtle.show() #TI-83 Premium CE
except: pass
Conclusion
Go to topLa conformité au standard de turtle n'est certes pas parmi les meilleures, mais c'est sans comparaison avec ce que valait ce_turtl. La conformité est très proche de celle des TI-Nspire CX II, et de plus une bonne partie des défauts restants ne sont pas majeurs dans le sens où ils sont aisément contournables sans avoir à écrire de code conséquent.
Qui plus est Texas Instruments s'offre même le luxe d'aller jusqu'à inclure les méthodes de remplissage de formes, à ce jour une exclusivité toute concurrence confondue !
Des possibilités et facilités de tracés largement accrues en conséquence, de quoi inviter encore plus les élèves à tester et créer !
Aucun problème sur TI-Nspire CX II, mais par contre sur TI-83 Premium CE Edition Python et compatibles la taille du heap fait qu'il ne faut pas abuser des méthodes de remplissage.
En effet à partir d'un appel .begin_fill(), l'ensemble des étapes intermédiaires de la tortue est stocké en mémoire afin de pouvoir en effectuer le remplissage suite au prochain appel .end_fill().
Des formes à remplir trop complexes ou trop nombreuses déclencheront une erreur de mémoire insuffisante, et les exemples précédents de remplissages les plus complexes n'en étaient pas bien loin.
C'est franchement dommage et rageant de devoir ainsi se brider dans l'exploitation de cette formidable possibilité...
Téléchargements
Go to top- Modules complémentaires de tracé relatif à la tortue : ce_turtl (l'ancien) turtle (le nouveau)
- pack de mises à jour 5.7 pour TI-83 Premium CE TI-84 Plus CE, ou séparément :
- Système 5.7 pour TI-83 Premium CE TI-84 Plus CE
- Application Python 5.7 (nécessite le système 5.7 pour fonctionner)
- Modules complémentaires de tracé par pixels ou dans un repère ti_draw ti_image
Source : https://education.ti.com/en/product-res ... 4ce-python