Page 1 sur 1

Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 13:36
de critor
Dans sa prochaine mise à jour gratuite désormais imminente pour Graph 35+E II et Graph 90+E, Casio va rajouter de formidables possibilités graphiques à son application Python sous la forme de deux modules importables :
  • matplotl (en fait un matplotlib.pyplot)
  • turtle
Nous allons traiter aujourd'hui de la compatibilité du module turtle, par rapport aux solutions concurrentes (calculatrice NumWorks) et au Python complet pour ordinateur.

11075Nous ne disposons certes pas d'une préversion de la mise à jour de Casio. Toutefois, ce dernier a déjà diffusé et illustré plusieurs exemples qui permettent déjà de se faire une petite idée.

On commence par une petite rosace; tout possesseur de Graph 35+E II sait que Casio adore ça : ;)
CasioNumWorksordi
Code: Tout sélectionner
from turtle import *

speed(0)
for i in range(12):
  left(30)
  for i in range(8):
    forward(30)
    left(45)

Le code d'exemple fourni par Casio passe ici sans problème sur NumWorks et sur ordi. :)



On poursuit maintenant avec le flocon de Koch :
CasioNumWorksordi
Code: Tout sélectionner
from turtle import *

def koch(n, l):
  if n==0:
    forward(l)
  else:
    koch(n-1, l/3)
    left(60)
    koch(n-1, l/3)
    right(120)
    koch(n-1, l/3)
    left(60)
    koch(n-1, l/3)

pencolor("blue")
penup()
goto(-180, -50)
pendown()
koch(4, 360)

Ici encore aucun problème, compatibilité totale ! :)



Nous arrivons maintenant à un soleil. Mais ici hélas, le code de Casio ne marche pas sur NumWorks :
Code: Tout sélectionner
from math import exp
from turtle import *
for i in range(1,37):
  red=(exp(-0.5 * ((i-6)/12)**2))
  green=(exp(-0.5 * ((i-18)/12)**2))
  blue=(exp(-0.5 * ((i-30)/12)**2))
  pencolor([red, green, blue])
  for i in range(1, 5):
    forward(60)
    right(90)
    right(10)

Le problème semble ici être que la Casio et la NumWorks n'utilisent pas par défaut le même système de coordonnées pour les composantes couleurs en turtle :
  • nombre flottant de 0.0 à 1.0 sur Casio
  • nombre entier de 0 à 255 sur NumWorks
Qui a raison ? Il semble que ce soit Casio, l'ordinateur n'ayant aucun problème à exécuter ce code.

Notons que sur les implémentations Python complètes on peut régler le comportement souhaité à l'aide des appels respectifs turtle.colormode(1.0) et turtle.colormode(255).
Toutefois cette fonction n'est hélas pas incluse chez NumWorks.

En conséquence, nous proposons le code corrigé ci-dessous, avec une fonction intermédiaire mypencolor() qui corrigera les coordonnées si nécessaire, et qui à la différence marchera aussi sur NumWorks :
CasioNumWorksordi
Code: Tout sélectionner
from math import exp
from turtle import *

def mypencolor(t):
  cmax = 255
  try:
    pencolor((2, 2, 2))
  except:
    cmax = 1
  if(cmax == 1 and max(t)>1):
    t = tuple(u/255 for u in t)
  elif(cmax == 255 and any(isinstance(u, float) for u in t)):
    t=tuple(int(255*u) for u in t)
  pencolor(t)

for i in range(1,37):
  red=(exp(-0.5 * ((i-6)/12)**2))
  green=(exp(-0.5 * ((i-18)/12)**2))
  blue=(exp(-0.5 * ((i-30)/12)**2))
  mypencolor([red, green, blue])

  for i in range(1, 5):
    forward(60)
    right(90)
  right(10)

Si tu trouves une façon plus simple de rajouter la compatibilité NumWorks au code Casio, n'hésite pas à nous la partager. :)




Enfin nous terminons avec une coquille d'escargot et malheureusement même problème, le code de Casio marche partout sauf sur NumWorks :
Code: Tout sélectionner
from turtle import *
from math import *

penup()
goto(0, -20)
pendown()
for i in range(1,37):
  red=(exp(-0.5 * ((i-6)/12)**2))
  green=(exp(-0.5 * ((i-18)/12)**2))
  blue=(exp(-0.5 * ((i-30)/12)**2))
  pencolor([red,green,blue])
  circle(50-i)
  right(10)

En conséquence, même correction en attendant mieux :
CasioNumWorksordi
Code: Tout sélectionner
from turtle import *
from math import *

def mypencolor(t):
  cmax = 255
  try:
    pencolor((2, 2, 2))
  except:
    cmax = 1
  if(cmax == 1 and max(t)>1):
    t = tuple(u/255 for u in t)
  elif(cmax == 255 and any(isinstance(u, float) for u in t)):
    t=tuple(int(255*u) for u in t)
  pencolor(t)

penup()
goto(0, -20)
pendown()
for i in range(1,37):
  red=(exp(-0.5 * ((i-6)/12)**2))
  green=(exp(-0.5 * ((i-18)/12)**2))
  blue=(exp(-0.5 * ((i-30)/12)**2))
  mypencolor([red,green,blue])
  circle(50-i)
  right(10)

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 14:32
de critor
On voit quand même que certaines rares couleurs sont mauvaises sur NumWorks, ressortant de l'ensemble puisque n'ayant rien à voir avec les teintes voisines :


Il doit y avoir un cas particulier que mypencolor() ne détecte ou corrige pas.

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 14:49
de critor
C'est bon, corrigé, c'était de ma faute : :)

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 17:50
de Bisam
Hmm, syntaxic sugar...
Code: Tout sélectionner
def mypencolor(t):
  cmax = 255
  try:
    pencolor((2, 2, 2))
  except:
    cmax = 1
  if cmax == 1 and max(t)>1:
    t = tuple(u/255 for u in t)
  elif cmax == 255 and any(isinstance(u, float) for u in t)):
    t = tuple(int(255*u) for u in t)
  pencolor(t)

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 17:53
de critor
Ah merci, c'est sympa, justement j'adore le sucre. ;)

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 19:08
de redgl0w
Yes je l'ai fait dans le mauvais sens :troll:

Image

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 06 Avr 2020, 19:20
de critor
Ah, comment tu as fait ? :)

Re: Python turtle : test compatibilité Casio NumWorks

Message non luPosté: 07 Avr 2020, 07:55
de redgl0w
critor a écrit:Ah, comment tu as fait ? :)

J'ai codé :troll:

Image

J'ai corrigé :

Image