Pour accompagner en douceur la transition du Scratch au Python en Seconde, la plupart des solutions Python sur calculatrices graphiques offrent turtle, une bibliothèque permettant du tracé relatif comme en Scratch. On peut citer :
- 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 la bibliothèque officielle turtle (anciennement ce_turtl) à l'environnement Python
- 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), sur lesquelles on peut rajouter une bibliothèque turtle officielle
- et KhiCAS
Aujourd'hui justement approfondissons ce dernier point, parlons du turtle de KhiCAS. Conçu par Bernard Parisse, enseignant-chercheur à l'Université de Grenoble, KhiCAS est la déclinaison sur calculatrices du logiciel de Mathématiques intégré Xcas. Disponible pour calculatrices NumWorks N0110, TI-Nspire CX, Casio Graph 35+E II et Graph 90+E, KhiCAS te donne donc accès à une interface unifiée ainsi qu'à des fonctionnalités haut de gamme peu importe la marque ou le modèle de ta calculatrice !
Ce formidable environnement de Mathématiques et de sciences t'apporte bien des choses. Nous pouvons citer dans tous les cas :
Dans ses éditions pour TI-Nspire CX et NumWorks N0110, KhiCAS apporte pas mal de compléments :
L'environnement Python sur ces modèles est extrêmement riche, bien davantage que les solutions Python intégrées par les constructeurs. On peut citer nombre de bibliothèques :
Ce formidable environnement de Mathématiques et de sciences t'apporte bien des choses. Nous pouvons citer dans tous les cas :
- la reprise du moteur de calcul formel GIAC développé pour Xcas par le même auteur.
- la possibilité de programmer dans 2 langages :
- le langage Xcas historique
- le langage Xcas avec une couche de compatibilité syntaxique Python
Dans ses éditions pour TI-Nspire CX et NumWorks N0110, KhiCAS apporte pas mal de compléments :
- possibilité de composer et convertir ses unités
- une bibliothèque de constantes physiques
- plusieurs applications elles-même intégrées, dont entre autres :
- tableur / feuille de calcul
- tableau périodique des éléments
- calcul financier
- 2 langages de programmation supplémentaires :
- Python via un interpréteur Micropython
- Javascript via un interpréteur QuickJS
L'environnement Python sur ces modèles est extrêmement riche, bien davantage que les solutions Python intégrées par les constructeurs. On peut citer nombre de bibliothèques :
- cas et xcas pour appeler le moteur de calcul formel GIAC directement depuis tes scripts Python
- cmath pour traiter directement tes calculs sur les nombres complexes en Python
- linalg pour l'algèbre linéaire
- arit pour l'arithmétique
- ulab.scipy pour le calcul scientifique
- ulab.numpy pour le calcul matriciel et vectoriel
- plusieurs bibliothèque de tracés :
- turtle pour les tracés relatifs à la Scratch
- matplotlib pour les tracés dans un repère
- graphic pour les tracés par pixels, accompagnée de casioplot pour la compatibilité avec les scripts graphiques Casio et kandinsky pour la compatibilité avec les scripts graphiques NumWorks
- et bien d'autres : gc, math, micropython, nsp, pylab, random, sys, time, ubinascii, ucollections, uctypes, uerrno, uhashlib, uheapq, uio, ujson, ure, ustruct, uzlib
La dernière mise à jour de KhiCAS améliore justement les possibilités de la bibliothèque turtle. Elle est disponible à ce jour :
- uniquement en version alpha pour TI-Nspire CX
- en version stable pour NumWorks N0110
- Contenu bibliothèque
- Tests de conformité comparatifs (toutes solutions turtle)
- 17 exemples comparatifs (toutes solutions turtle)
- La dalle aux ammonites
- Le défilé automobile
- L'escargot de lumière
- Les flocons de Koch
- La linea
- Pavage d'une lagogne
- Le triangle de Penrose
- La courtepointe de Mamie
- Les vitraux rhombiques
- Les roses par 12
- Les triangles de Sierpiński
- Sous le soleil exactement
- Le labyrinthe du Minotaure
- Le carreau de carreaux
- Les étoiles jumelles
- La toile de l'araignée
- ♫ Le tournesol, le tournesol, ... ♫
- Conclusion[/i]
- Téléchargements[/i]
A) Contenu bibliothèque
Go to topCommençons donc par explorer le contenu de la bibliothèque turtle :
Effectivement il y a bien des nouveauté, nous passons de 66 à 69 éléments. Nous disposons de 3 nouvelles méthodes :
- Code: Select all
import turtle
l = dir(turtle)
l
len(l)
Effectivement il y a bien des nouveauté, nous passons de 66 à 69 éléments. Nous disposons de 3 nouvelles méthodes :
.clear()
pour effacer l'affichage sans réinitialiser la position de la tortue.pos()
, un alias court de.position()
que l'on avait déjà pour récupérer la position de la tortue.towards(x, y)
pour obtenir l'angle d'orientation permettant d'atteindre les coordonnées fournies
Cela peut certes te paraître peu, bien que .towards() permette déjà d'aborder facilement des scripts bien plus ambitieux comme nous verrons plus bas.
Mais ça c'est juste pour les méthodes rajoutées ; il va rester à voir si il y a eu des améliorations sur le fonctionnement des méthodes déjà présentes.
Mais ça c'est juste pour les méthodes rajoutées ; il va rester à voir si il y a eu des améliorations sur le fonctionnement des méthodes déjà présentes.
B) Tests de conformité comparatifs (toutes solutions turtle)
Go to topTentons pour le moment un autodiagnostic plus général des différences entres les ancienne et nouvelle bibliothèques turtle de KhiCAS, c'est-à-dire la vérification de tout ce qui peut différer du standard.
Voici 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 :
Voici ce que nous racontent les scripts sur les différentes solutions turtle :
Voici 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 towards
try: turtle.towards
except:
_turtle_error(15)
# 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(16)
_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(17)
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()",
"No towards()",
"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 == 16:
msg += str(len(_missing_fct)) + " " + " ".join(_missing_fct)
if k == 17:
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 les différentes solutions turtle :
On confirme donc avec la nouvelle version KhiCAS l'ajout des 3 méthodes jusqu'alors manquantes.
Mais surtout il n'y a donc dans l'état actuel des scripts plus aucune erreur détectée automatiquement, chose exceptionnelle si l'on compare aux solutions officielles, et signe d'un soin minutieux !
Mais surtout il n'y a donc dans l'état actuel des scripts plus aucune erreur détectée automatiquement, chose exceptionnelle si l'on compare aux solutions officielles, et signe d'un soin minutieux !
Mais ça, c'est pour les problèmes détectables par des vérifications automatisées. Voyons maintenant d'éventuels écarts visuels sur quelques exemples de scripts.
Afin de pouvoir comparer équitablement avec les solutions officielles visiblement parfois bien moins conformes au standard turtle tout en conservant une unique version de chaque script utilisable sur l'ensemble des solutions, voici un script qu'il suffira d'importer à la place de chaque bibliothèque turtle et qui, lorsque celle-ci sera modifiable, corrigera la plupart des erreurs détectées :
Afin de pouvoir comparer équitablement avec les solutions officielles visiblement parfois bien moins conformes au standard turtle tout en conservant une unique version de chaque script utilisable sur l'ensemble des solutions, voici un script qu'il suffira d'importer à la place de chaque bibliothèque turtle et qui, lorsque celle-ci sera modifiable, corrigera 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 & 0x1000:
turtle.fillcolor, turtle.begin_fill, turtle.end_fill = idty, nop, nop
if _turtle_errors & 2:
def _pencolor_(*argv):
if len(argv): turtle.color(argv)
else: return turtle.color()[0]
turtle.pencolor = _pencolor_
if _turtle_errors & 4:
def _color_(*argv):
if len(argv) == 2:
turtle.pencolor(argv[0])
turtle.fillcolor(argv[1])
elif len(argv):
turtle.pencolor(argv)
else:
return (turtle.pencolor(), turtle.fillcolor())
turtle.color = _color_
_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):
n = len(argv)
if not(n): return turtle._color()
elif n==2: turtle._color(argv[0], argv[1])
else: turtle._color(n > 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):
n = len(argv)
if not(n): return turtle._color()
c = turtle._fixcolor(n == 3 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
# fix towards()
if _turtle_errors & 0x8000:
from math import atan2, pi
def _towards(x, y):
x0, y0 = turtle.pos()
return atan2(y - y0, x - x0) * 180 / pi
turtle.towards = _towards
C) 17 exemples comparatifs (toutes solutions turtle)
Go to topMaintenant que nous avons de quoi faire tourner une unique version de chaque script sur l'ensemble des machines, poursuivons donc l'exploration de l'ensemble des solutions turtle avec quelques exemples de script.
Nous allons en profiter pour nous en donner à cœur joie avec les formidables fonctions de remplissage rajoutées dans l'avant-dernière version de KhiCAS, sur le thème de #LesMathématiquesSontBelles.
C'est donc l'occasion de voir si il y avait d'autres problèmes qui n'ont pas pu être détectés automatiquement, et si ils sont toujours présents dans la dernière version.
Plusieurs des exemples qui vont suivre sont inspirés de publications de Bert Wikkerink pour TI-Nspire CX II et très librement et fortement adaptés pour être fonctionnels dans le contexte du heap Python bien plus restreint des TI-83 Premium CE et compatibles.
Nous allons en profiter pour nous en donner à cœur joie avec les formidables fonctions de remplissage rajoutées dans l'avant-dernière version de KhiCAS, sur le thème de #LesMathématiquesSontBelles.
C'est donc l'occasion de voir si il y avait d'autres problèmes qui n'ont pas pu être détectés automatiquement, et si ils sont toujours présents dans la dernière version.
Plusieurs des exemples qui vont suivre sont inspirés de publications de Bert Wikkerink pour TI-Nspire CX II et très librement et fortement adaptés pour être fonctionnels dans le contexte du heap Python bien plus restreint des TI-83 Premium CE et compatibles.
- La dalle aux ammonites
- Le défilé automobile
- L'escargot de lumière
- Les flocons de Koch
- La linea
- Pavage d'une lagogne
- Le triangle de Penrose
- La courtepointe de Mamie
- Les vitraux rhombiques
- Les roses par 12
- Les triangles de Sierpiński
- Sous le soleil exactement
- Le labyrinthe du Minotaure
- Le carreau de carreaux
- Les étoiles jumelles
- La toile de l'araignée
- ♫ Le tournesol, le tournesol, ... ♫
Exemple n°1 : La dalle aux ammonites
Go to topC'est donc parti pour quelques exemples afin d'approfondir les améliorations de la nouvelle bibliothèque turtle pour TI-83 Premium CE Edition Python et compatibles, ainsi que les points forts et faibles par rapport aux autres modèles de calculatrices.
Précisons que les problèmes récurrents ne seront pas systématiquement réévoqués sur chaque exemple.
Un petit peu au Nord de Digne-les-bains en rive droite de la Bléone se trouve la dalle aux ammonites. Comme il est strictement interdit d'en prélever, voici de quoi en reproduire une sur ta calculatrice :
Précisons que les problèmes récurrents ne seront pas systématiquement réévoqués sur chaque exemple.
Un petit peu au Nord de Digne-les-bains en rive droite de la Bléone se trouve la dalle aux ammonites. Comme il est strictement interdit d'en prélever, voici de quoi en reproduire une sur ta calculatrice :
- Code: Select all
from ttl_fix import *
from math import pi
turtle.speed(0)
turtle.pencolor((0,0,0))
turtle.pendown()
turtle.pensize(1)
turtle.goto(0,-8)
x,y = turtle.pos()
turtle.left(115)
for i in range(132):
turtle.forward(10)
try:
h = turtle.towards(x,y)
turtle.setheading(h)
except: pass
d=10*pi
turtle.forward(d)
turtle.backward(d)
turtle.right(90)
try: turtle.show() #TI-83 Premium CE
except: pass
KhiCAS ainsi que le turtle officiel de la NumWorks avaient un tracé incorrect ici, car la méthode .towards() était absente de leur implémentation de turtle. Et malheureusement, la bibliothèque turtle n'est dans ces deux cas pas altérable à l'exécution ce qui empêchait notre script de corriger.
Concernant KhiCAS ce manque est maintenant comblé, et visiblement parfaitement fonctionnel !
Concernant KhiCAS ce manque est maintenant comblé, et visiblement parfaitement fonctionnel !
Exemple n°2 : Le défilé automobile
Go to topNous t'emmenons maintenant au défilé avec les logos de plusieurs grands constructeurs... automobiles :
- Code: Select all
from ttl_fix import *
def rpoly(c, n):
for k in range(n):
turtle.forward(c)
turtle.left(360 / n)
def audi(r):
ir = 2 * r // 13
turtle.penup()
turtle.left(90)
turtle.forward(r//2 - 2*ir)
turtle.right(90)
turtle.forward(-ir)
turtle.pendown()
turtle.pensize(3)
for i in range(4):
turtle.penup()
turtle.forward(3 * ir)
turtle.pendown()
turtle.circle(2 * ir)
def mercedez_benz(r):
ir = r // 2
turtle.penup()
turtle.forward(ir)
turtle.left(90)
turtle.forward(ir)
turtle.pendown()
turtle.pensize(2)
x, y = turtle.pos()
turtle.setheading(210)
for i in range(3):
turtle.goto(x,y)
turtle.forward(ir)
turtle.left(120)
turtle.setheading(0)
turtle.circle(-ir)
def citroen(r):
x,y=turtle.pos()
turtle.setheading(0)
turtle.color((255,0,0), (255,0,0))
turtle.begin_fill()
rpoly(r, 4)
turtle.end_fill()
turtle.fillcolor((255,255,255))
for i in range(2):
turtle.setheading(45)
turtle.begin_fill()
for k in range(2):
turtle.forward(.71 * r)
turtle.left(k and 172 or -90)
for k in range(2):
turtle.forward(5 * r / 6)
turtle.left(106)
turtle.end_fill()
y += r / 3
turtle.penup()
turtle.goto(x,y)
turtle.pendown()
def mitsubichi(r):
ir = r // 3
turtle.penup()
turtle.left(90)
turtle.forward(ir)
turtle.right(90)
turtle.forward(r // 2)
turtle.pendown()
for i in range(3):
turtle.setheading(60 + 120*i)
turtle.color((255,0,0), (255,0,0))
turtle.begin_fill()
for k in range(4):
turtle.forward(ir)
turtle.left((k%2) and 120 or 60)
turtle.end_fill()
def jeep(r):
a=54
ir = r/0.47552825814758/4 #sin(radians(a))/cos(radians(a))
a=ir/0.85
d=0.93*ir
turtle.penup()
turtle.forward(r//2)
turtle.right(90)
turtle.forward(ir - r)
turtle.pendown()
x, y = turtle.pos()
turtle.setheading(234)
turtle.forward(ir)
turtle.left(126)
turtle.fillcolor((180,180,180))
turtle.begin_fill()
rpoly(a, 5)
turtle.end_fill()
for i in range(5):
col = i < 3 and (0,0,0) or (255,255,255)
for j in range(2):
turn = j and turtle.left or turtle.right
turtle.goto(x,y)
turtle.setheading(90 + 72*i)
turtle.fillcolor(col)
turtle.begin_fill()
turtle.forward(d)
turn(172)
turtle.forward(0.85*d)
turn(44)
turtle.forward(0.2*d)
turtle.end_fill()
col = [255 - col[k] for k in range(3)]
turtle.speed(0)
turtle.colormode(255)
r = 92
for iy in range(2):
for ix in range(3):
i = iy*3+ix
if i < 5:
y, x = (2*iy - 1) * r//2 - 48, (ix - 1)*r - 50
turtle.penup()
turtle.goto(x, y)
turtle.setheading(0)
turtle.pensize(1)
turtle.pencolor((0,0,0))
turtle.pendown()
(mercedez_benz,jeep,mitsubichi,citroen,audi)[i](r)
try: turtle.show() #TI-83 Premium CE
except: pass
Sur cet exemple, KhiCAS reste l'une des solutions turtle qui s'en tire hélas le moins bien.
Toutefois on peut remarquer une petite amélioration depuis la dernière fois ; la couleur de remplissage passé en 2ème paramètre de la méthode
Toutefois on peut remarquer une petite amélioration depuis la dernière fois ; la couleur de remplissage passé en 2ème paramètre de la méthode
.color(,)
n'est plus ignorée et est maintenant gérée correctement.Exemple n°3 : L'escargot de lumière
Go to topSi tu es dans le Sud de la France tu sais qu'il ne pleut pas souvent (par contre, quand il pleut... il pleut !). Alors voici pour toi un escargot bariolé :
- Code: Select all
from math import exp
from ttl_fix import *
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(1.0)
turtle.penup()
turtle.goto(0, -20)
turtle.pendown()
turtle.right(90)
for i in range(20):
c = [exp(-.5 * ((i - k) / 12)**2) for k in (6, 18, 30)]
cb = [v/2 for v in c]
turtle.color(cb, c)
try: turtle.begin_fill()
except: pass
turtle.circle(27 + i)
try: turtle.end_fill()
except: pass
turtle.right(10)
try: turtle.show() #TI-83 Premium CE
except: pass
Ici pour la même raison, KhiCAS se range maintenant avec les meilleures solutions turtle !
Exemple n°4 : Les flocons de Koch
Go to topEncore une fois si tu es dans le Sud de la France, tu n'a pas dû voir de neige depuis des années... Faison donc neiger dans ta calculatrice maintenant, faisons neiger des flocons de Koch :
- 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)
turtle.speed(0)
turtle.colormode(255)
c = [127, 255, 0]
l = 80
for j in range(2):
for i in range(3):
n = j and 3 + i or 2 - i
s = 5 - n
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
Ici par contre, toujours le problème de mauvaise couleur pour le dernier flocon tracé avec KhiCAS.
Mais cela reste malgré tout mieux que d'autres solutions officielles.
Mais cela reste malgré tout mieux que d'autres solutions officielles.
Exemple n°5 : La linea
Go to top- Code: Select all
try: #TI-83 Premium CE
from ti_system import disp_clr
disp_clr()
except: pass
from ttl_fix import *
def spiral(k,a,l):
x0, y0 = turtle.pos()
h0 = turtle.heading()
while True:
for s in l:
turtle.forward(s*k)
turtle.left(180-a)
x, y = turtle.pos()
if abs(x - x0) + abs(y - y0) + abs(turtle.heading() - h0) <= 1:
break
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(255)
turtle.color((0,0,0),(255,255,0))
try:
for i in range(-1, 2, 2):
turtle.penup()
turtle.goto(80*i - ((i > 0) and 40 or 50), 0)
turtle.pendown()
try: turtle.begin_fill()
except: pass
spiral((i > 0) and 9 or 30, (i > 0) and 90 or 36, (i > 0) and (1,2,3,4,5,6,7,8,9) or (1,2,3))
try: turtle.end_fill()
except: pass
except MemoryError as e: print(e)
try: turtle.show() #TI-83 Premium CE
except: pass
Certes cette fois-ci KhiCAS remplit la forme de gauche de la bonne couleur, mais ne remplit bizarrement plus correctement celle de droite...
Exemple n°6 : Pavage d'une lagogne
Go to topPartons maintenant à la pêche avec un script très hautement impressionnant par rapport aux contraintes de heap des TI-83 Premium CE et compatibles ; ici nous sommes vraiment sur le fil de la limite des possibilités concernant ces modèles.
Voici donc une lagogne littéralement pavée de poissons :
Voici donc une lagogne littéralement pavée de poissons :
- Code: Select all
from math import sqrt
from ttl_fix import *
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(255)
turtle.pencolor((0,0,0))
a=16
try:
j = 0
while -5 < j < 4:
col = ((0,0,255),(255,0,0),(255,180,0))[j%3]
i = 0
while -2 + (j % 2) < i < 2:
for c in range(3):
turtle.penup()
turtle.goto(sqrt(3)*3*a*(i*2-(j%2)), 3*a*j)
turtle.setheading(-30 + 120*c)
turtle.pendown()
turtle.fillcolor(col)
turtle.begin_fill()
for k in range(-17, 18):
l = a*sqrt(7)
tf = ((1,141.787), (0,l), (1,-100.893), (0,a), (1,120), (0,a/2), [1,-120], [0,-a], [0,a], [1,120], (0,a/2), (1,60), (0,a), (1,-120), (0,a), (1,100.893), (0,l), [1,-40.893])[abs(k)]
if k==6 or k==9 or k==17: tf[1] -= 180
elif k==7 or k==8: tf[1] *= -1
(turtle.forward, turtle.left)[tf[0]](tf[1])
turtle.end_fill()
turtle.forward(6*a)
turtle.backward(5*a)
turtle.penup()
turtle.right(90)
l = a*sqrt(3)/6
for k in range(2):
turtle.forward(l)
turtle.pencolor((255,255,255))
turtle.dot(a//4)
turtle.pencolor((0,0,0))
turtle.dot(a//8)
turtle.backward(l)
turtle.left(180)
i = -i + (i <= 0)
j = -j - (j >= 0)
except Exception as e: print(e)
try: turtle.show() #TI-83 Premium CE
except: pass
Malheureusement pas d'amélioration ici, les poissons continuent à ne pas se comporter correctement sous KhiCAS.
Exemple n°7 : Le triangle de Penrose
Go to topTu n'as jamais touché à un triangle de Penrose ? Et bien voici de quoi en afficher le plan dans ta calculatrice, tu n'auras plus qu'à l'imprimer en 3D, si tu arrives à comprendre où est le devant et l'arrière :
- Code: Select all
from math import sqrt
from ttl_fix import *
def hook(a, c):
turtle.penup()
turtle.goto(0,-15)
turtle.setheading(a)
turtle.forward((l - 4*b) / sqrt(3))
turtle.right(150)
turtle.pendown()
lf = ((turtle.left, 60),[turtle.forward,b],(turtle.left,120),(turtle.forward,l-b),[turtle.right,120],[turtle.forward,l-3*b])
try:
turtle.fillcolor(c)
turtle.begin_fill()
except: pass
for k in range(-len(lf) + 1, len(lf)):
tf = lf[abs(k)]
if k == 1: tf[1] = l
elif k == 4: tf[0] = turtle.left
elif k == 5: tf[1] = b
tf[0](tf[1])
try: turtle.end_fill()
except: pass
turtle.speed(0)
turtle.pensize(2)
turtle.colormode(255)
l=180
b=23
for i in range(112):
turtle.pencolor(232 - int(i * 23 / 11), 249 - int(i * 29 / 55), 255)
turtle.penup()
turtle.goto(-192, 111 - 2*i)
turtle.pendown()
turtle.forward(384)
turtle.pencolor((0,0,0))
turtle.pensize(1)
hook(330, (255,255,0))
hook(90, (0,0,255))
hook(210, (255,0,0))
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°8 : La courtepointe de Mamie
Go to topVoici maintenant la courtepointe brodée avec amour et soin par Mamie :
- 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 = [191, 127, 0]
cf = [127, 255, 0]
i = 0
while i > -3:
j = 0
while j > -2:
turtle.penup()
turtle.goto((i - 1)*88, (j - 1)*85 + 28)
turtle.pendown()
turtle.color(c, cf)
try: turtle.begin_fill()
except: pass
poly_reg_a(80, 140)
try: turtle.end_fill()
except: pass
rotate_list(c)
rotate_list(cf)
j = -j + (j <= 0)
i = -i + (i <= 0)
try: turtle.show() #TI-83 Premium CE
except: pass
ancien |
C'est bon ici, KhiCAS choisit enfin des fils de la bonne couleur pour broder la courtepointe !
Exemple n°9 : Les vitraux rhombiques
Go to topVoici maintenant une belle rosace rhombique pour décorer le bâtiment de ton choix.
Nous utilisons ici la méthode .dot() permettant de remplir un disque de diamètre donné, afin de générer de quoi avoir une couleur de fond d'écran sur nos calculatrices, suffit-il juste de lui spécifier un diamètre suffisamment grand :
Nous utilisons ici la méthode .dot() permettant de remplir un disque de diamètre donné, afin de générer de quoi avoir une couleur de fond d'écran sur nos calculatrices, suffit-il juste de lui spécifier un diamètre suffisamment grand :
- Code: Select all
from ttl_fix import *
turtle.speed(0)
turtle.colormode(255)
turtle.pencolor((0,0,255))
turtle.dot(320)
turtle.pencolor((0,0,0))
turtle.pensize(2)
col = ((255,0,0),(255,255,0),(0,255,0),(255,255,255),(255,0,255))
a=60
for i in range(10):
c = col[i%5]
turtle.color(c, c)
turtle.begin_fill()
for j in range(5):
turtle.forward(a)
turtle.right(72)
turtle.end_fill()
turtle.right(36)
for i in range(10):
c = [v//3 for v in col[i%5]]
turtle.pencolor(c)
for j in range(5):
turtle.forward(a)
turtle.right(72)
turtle.right(36)
try: turtle.show() #TI-83 Premium CE
except: pass
Bonne nouvelle ici encore, KhiCAS nous peint enfin les vitraux de la bonne couleur !
Par rapport au fond bleu, notons que c'est cette nouvelle version de KhiCAS qui adopte le comportement correct. Selon le standard turtle, la méthode .dot() attend en paramètre le diamètre du disque à tracer. Ce sont les modèles Texas Instruments qui le considèrent à tort comme un rayon et remplissent alors tout l'écran.
Par rapport au fond bleu, notons que c'est cette nouvelle version de KhiCAS qui adopte le comportement correct. Selon le standard turtle, la méthode .dot() attend en paramètre le diamètre du disque à tracer. Ce sont les modèles Texas Instruments qui le considèrent à tort comme un rayon et remplissent alors tout l'écran.
Exemple n°10 : Les roses par 12
Go to topVoici maintenant une rose, cette fois-ci sur un fond d'écran en dégradé radial. Nous utiliserons pour cela cette fois-ci une boucle de .dot() :
- Code: Select all
from math import pi, sin, cos, sqrt
from ttl_fix import *
def rpoly(c, n):
a=360/n
for k in range(n):
turtle.forward(c)
turtle.left(a)
def carre(c): rpoly(c, 4)
turtle.speed(0)
turtle.colormode(255)
turtle.penup()
r=80
alpha=(15 * pi / 180)
for i in range(320):
c=int(255/320*i)
turtle.pencolor(c,c,c)
try: turtle.dot(320-i)
except: pass
turtle.goto(20,-76)
turtle.color((255,255,255),(0,0,0))
for i in range(4):
a=r*sin(alpha)*2
d=a/sqrt(2)
turtle.pendown()
for i in range(12):
turtle.right(15)
try: turtle.begin_fill()
except: pass
carre(d)
try: turtle.end_fill()
except: pass
turtle.left(45)
turtle.penup()
turtle.forward(a)
turtle.pendown()
turtle.penup()
turtle.left(75)
turtle.forward(d)
turtle.right(60)
r=r*cos(alpha)-a/2
try: turtle.show() #TI-83 Premium CE
except: pass
KhiCAS nous colorie enfin les pétales correctement !
Et sur la taille du disque de fond d'écran, c'est KhiCAS qui fait comme il faut.
Et sur la taille du disque de fond d'écran, c'est KhiCAS qui fait comme il faut.
Exemple n°11 : Les triangles de Sierpiński
Go to topRevenons aux fractales et à la récursivité avec les triangles de Sierpiński. As-tu déjà réussi à les compter ? Et bien voici de quoi commencer sur ta calculatrice :
- 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.colormode(255)
turtle.speed(0)
turtle.pensize(1)
turtle.penup()
turtle.goto(-110, -95)
turtle.pendown()
turtle.pencolor((255,0,0))
sierp(6, 220)
turtle.penup()
turtle.forward(400)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°12 : Sous le soleil exactement
Go to topPlaçons-nous maintenant sous le soleil exactement, profitant ainsi de toutes les couleurs de la lumière blanche :
- Code: Select all
from math import exp
from ttl_fix import *
def rpoly(c, n):
a=360/n
for k in range(n):
turtle.forward(c)
turtle.left(a)
def carre(c): rpoly(c, 4)
turtle.speed(0)
turtle.pensize(1)
turtle.colormode(1.0)
n = 36
for i in range(n):
k=.4 + 4*i/255
cp = [.7*exp(-.5 * ((n - i - k) / (n / 3))**2) for k in (6, 18, 30)]
turtle.pencolor(cp)
try:
turtle.fillcolor((k,k,0))
turtle.begin_fill()
except: pass
carre(60)
try: turtle.end_fill()
except: pass
turtle.right(360 / n)
try: turtle.show() #TI-83 Premium CE
except: pass
Du changement ici encore sur KhiCAS, notre soleil émet maintenant dans les bonnes longueurs d'onde !
Exemple n°13 : Le labyrinthe du Minotaure
Go to topExplorons maintenant dans la labyrinthe du Minotaure :
- Code: Select all
from ttl_fix import *
turtle.speed(0)
turtle.colormode(255)
turtle.pendown()
turtle.right(48)
turtle.pencolor((0,0,0))
for i in range(98):
turtle.forward(2*i)
turtle.left(90.5)
try: turtle.show() #TI-83 Premium CE
except: pass
Ah c'est bon cette fois-ci, le labyrinthe se construit maintenant correctement sur KhiCAS Dédale et Minos seront contents.
Exemple n°14 : Le carreau de carreaux
Go to top- Code: Select all
from math import sqrt
from ttl_fix import *
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.colormode(255)
turtle.pencolor(0,0,0)
turtle.speed(0)
turtle.pensize(3)
d=190
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
Exemple n°15 : Les étoiles jumelles
Go to top- Code: Select all
try: # TI-83 Premium CE
from ti_system import disp_clr
disp_clr()
except: pass
from ttl_fix import *
def rpoly(c, n):
a=360/n
for k in range(n):
turtle.forward(c)
turtle.left(a)
def rosace(c, n1, a, n2):
try: turtle.begin_fill()
except: pass
for i in range(n2):
turtle.left(a)
rpoly(c, n1)
try: turtle.end_fill()
except: pass
turtle.colormode(255)
turtle.pencolor((0,0,0))
try: turtle.dot(320)
except: pass
turtle.color((255,255,255),(255,255,0))
turtle.speed(0)
turtle.pensize(1)
try:
for i in range(-1, 2, 2):
turtle.penup()
turtle.goto(80*i, 0)
turtle.pendown()
rosace((i > 0) and 21 or 30, (i > 0) and 12 or 8, 30, 12)
turtle.pensize(2)
turtle.pencolor((0,0,255))
except MemoryError as e: print(e)
try: turtle.show() #TI-83 Premium CE
except: pass
Enfin ici aussi KhiCAS nous colorie les étoiles de la bonne couleur.
Sur la taille du disque de fond d'écran c'est ici aussi KhiCAS qui a raison et pas TI.
Sur la taille du disque de fond d'écran c'est ici aussi KhiCAS qui a raison et pas TI.
Exemple n°16 : La toile de l'araignée
Go to topSuivons maintenant le fil de l'araignée :
- Code: Select all
from ttl_fix import *
def spiral(a,b):
turtle.pencolor((0,0,0))
try: turtle.dot(320)
except: pass
turtle.pencolor((255,255,0))
for i in range(189):
for j in range(6):
turtle.forward(i/a)
turtle.left(23)
turtle.left(b)
try: turtle.dot(2)
except: pass
turtle.speed(0)
turtle.colormode(255)
turtle.pensize(1)
a=17
b=194
spiral(a,b)
try: turtle.show() #TI-83 Premium CE
except: pass
Exemple n°17 : ♫ Le tournesol, le tournesol, ... ♫
Go to topTerminons enfin avec un exemple absolument bluffant de réalisme pour du turtle, nous allons faire pousser un tournesol devant toi :
- Code: Select all
from math import pi, sin, cos, sqrt
from ttl_fix import *
def spiral():
phi = (1+sqrt(5))/2
a =0
r = 0
dr = 0.15
turtle.penup()
for i in range(300):
turtle.forward(r)
turtle.pencolor((0,0,0))
try: turtle.dot(3)
except: pass
turtle.pencolor((205,133,63))
try: turtle.dot(2)
except: pass
turtle.goto(0,0)
turtle.setheading(0)
a+=360/phi
turtle.right(a)
if a>=360:
r+=dr
a-=360
def feuille(core,a):
try: turtle.begin_fill()
except: pass
turtle.right(a/2)
turtle.forward(core)
turtle.left(a)
turtle.forward(core)
turtle.left(180-a)
turtle.forward(core)
turtle.left(a)
turtle.forward(core)
try: turtle.end_fill()
except: pass
turtle.speed(0)
turtle.colormode(255)
turtle.pencolor((30,144,255))
try: turtle.dot(320)
except: pass
d=25
core=40
turtle.pencolor((160,82,45))
try: turtle.dot(40)
except: pass
c=((255,215,0),(255,255,0))
for i in range(2):
turtle.color(c[0], c[i])
for h in range(10*i,370,20):
r=h * pi / 180
x=d*cos(r)
y=d*sin(r)
turtle.penup()
turtle.goto(x,y)
turtle.pendown()
turtle.setheading(h)
feuille(core,32)
spiral()
try: turtle.show() #TI-83 Premium CE
except: pass
Ah, enfin notre tournesol commence à ressembler à un tournesol sur KhiCAS.
Sur le disque de fond d'écran, rappelons que c'est KhiCAS qui a raison.
Par contre, on déplore encore la délimitation incorrecte des graines dans le cœur.
Sur le disque de fond d'écran, rappelons que c'est KhiCAS qui a raison.
Par contre, on déplore encore la délimitation incorrecte des graines dans le cœur.
Conclusion
Go to topSelon notre outil de tests, KhiCAS pour TI-Nspire CX et NumWorks N0110 est bien mieux conforme au standard Python-turtle que l'ensemble des solutions turtle officielles, et semble en conséquence bien mieux se comporter en pratique sur une majorité de nos exemples. nous semble offrir à ce jour la meilleure bibliothèque Python turtle toutes solutions confondues.
Les méthodes de remplissage, absentes des implémentations officielles de Casio et NumWorks t'ouvrent la porte à de formidables progrès.
Certes il y a encore quelques défauts et donc écarts par rapport au tracé obtenu avec la bibliothèque standard sur ordinateur, mais KhiCAS a l'avantage d'être régulièrement maintenu et de bénéficier de plusieurs mises à jour par an.
Les progrès sont déjà très significatifs par rapport à la version précédente, et nul doute qu'ils vont se poursuivre !
Les méthodes de remplissage, absentes des implémentations officielles de Casio et NumWorks t'ouvrent la porte à de formidables progrès.
Certes il y a encore quelques défauts et donc écarts par rapport au tracé obtenu avec la bibliothèque standard sur ordinateur, mais KhiCAS a l'avantage d'être régulièrement maintenu et de bénéficier de plusieurs mises à jour par an.
Les progrès sont déjà très significatifs par rapport à la version précédente, et nul doute qu'ils vont se poursuivre !
Téléchargements
Go to topTéléchargement / installation :