View Full Version : [Python] Aiuto esercizio di "How to Think Like a Python Programmer"
Ciao a tutti.
Dopo diversi fallimenti, sto tentando di imparare qualcosa su un linguaggio di programmazione, in questo caso il Python.
http://www.greenteapress.com/thinkpython/html/book005.html#toc50 , esercizio 3.
Avendo già a disposizione queste funzioni:
import math
from TurtleWorld import *
TurtleWorld()
bob = Turtle()
bob.delay = 0.01
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
"""(in degrees). t is a turtle.
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
come posso fare a realizzare la funzione per disegnare i fiori?
L'unica cosa funzionante che sono riuscito a fare è la definizione della funzione:
def flower(t, r, petals): :muro:
Grazie per l'aiuto.
^TiGeRShArK^
18-01-2008, 21:31
ma scusa..
per il poco che ricordo di python....
le virgolette triple nella funzione arc non dovrebbero essere alla fine della stringa? :fagiano:
cmq spè che mi scarico 'sto turtleworld che non ho mai sentito e vedo :p
ma scusa..
per il poco che ricordo di python....
le virgolette triple nella funzione arc non dovrebbero essere alla fine della stringa? :fagiano:
cmq spè che mi scarico 'sto turtleworld che non ho mai sentito e vedo :p
Sí, il commento l'ho aggiunto mentre scrivevo il messaggio.
È chiaramente sbagliato, ma non era presente nelle versioni che ho passato all'interprete.
^TiGeRShArK^
18-01-2008, 21:49
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 180)
#fai girare la tartaruga di 90°
TurtleWorld()
bob = Turtle()
bob.delay = 0.01
flower(bob, 50, 4)
dovrebbe essere qualcosa del genere ovviamente inserendo il comando che fa girare la tartaruga di 90° a sinistra e *in teoria dovrebbe andare* :fagiano:
dovrebbe essere qualcosa del genere ovviamente inserendo il comando che fa girare la tartaruga di 90° a sinistra e *in teoria dovrebbe andare* :fagiano:
Questo è il problema. Ho provato tante soluzioni (la prima funzione era simile, se non uguale a quella tua) che in teoria dovrebbero andare, ma in pratica non disegnano i fiori.
^TiGeRShArK^
18-01-2008, 23:03
Questo è il problema. Ho provato tante soluzioni (la prima funzione era simile, se non uguale a quella tua) che in teoria dovrebbero andare, ma in pratica non disegnano i fiori.
ehmm...
se hai un raggio x e fai un arco di 180° allora ti ritrovi esattamente in corrispondenza del punto di partenza, dopo aver disegnato un arco, però traslato di 2x lungo la direzione perpendicolare (con verso a sinistra) della posizione inziale della tartaruga.
La direzione della tartaruga sarà a quel punto parallela rispetto a quella iniziale, ma il verso sarà opposto.
Quindi ruotando di 90° verso destra e ripetendo il procedimento avremo che sarà traslata di 2x nella direzione verso cui era rivolta prima di essere girata di 90°.
Finendo il giro si avrà una situazione di questo tipo (rappresentando solo i diametri degli archi):
------
| |
| |
------
con la tartaruga che sarà ritornata al punto di partenza disegnando i 4 archi che formano i petali del fiore.
A quel punto generalizzare la funzione per ogni numero di petali dovrebbe essere banale così ad occhio.
per non saper ne leggere ne scrivere in python sono riuscito a ottenere una cosa simile :fagiano:
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 90)
lt(turtle, 90)
arc(turtle, radius, 90)
lt(turtle, (360/petals+90))
TurtleWorld()
bob = Turtle()
bob.delay = 0.001
flower(bob, 90, 7)
^TiGeRShArK^
19-01-2008, 12:45
per non saper ne leggere ne scrivere in python sono riuscito a ottenere una cosa simile :fagiano:
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 90)
lt(turtle, 90)
arc(turtle, radius, 90)
lt(turtle, (360/petals+90))
TurtleWorld()
bob = Turtle()
bob.delay = 0.001
flower(bob, 90, 7)
infatti hai usato la banale generalizzazione e il left turn che per qualche strano motivo (:muro: ) quei geni hanno chiamato lt anzichè left turn :muro:
Ho sempre odiato chi chiama i metodi e le variabili con nomi non significativi :mad:
Cmq il mio codice, con un numero di petali pari a 4 ed aggiungendo il left turn funziona perfettamente ;)
infatti hai usato la banale generalizzazione e il left turn che per qualche strano motivo (:muro: ) quei geni hanno chiamato lt anzichè left turn :muro:
Ho sempre odiato chi chiama i metodi e le variabili con nomi non significativi :mad:
Cmq il mio codice, con un numero di petali pari a 4 ed aggiungendo il left turn funziona perfettamente ;)
ma come fai a disegnare un petalo con un solo arco? :fagiano:
ps. da uno che usa tk che nomi dei metodi ti aspettavi? :asd:
^TiGeRShArK^
19-01-2008, 13:16
ma come fai a disegnare un petalo con un solo arco? :fagiano:
ps. da uno che usa tk che nomi dei metodi ti aspettavi? :asd:
..hai provato a lanciare il mio codice per 4 petali con l'aggiunta di lt(turtle, 90)? :p
^TiGeRShArK^
19-01-2008, 13:19
anzi... :mbe:
guarda che figata :D
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 180)
lt(turtle, 360/petals)
TurtleWorld()
bob = Turtle()
bob.delay = 0.01
flower(bob, 50, 8)
http://img267.imageshack.us/img267/8735/fiorefl6.png (http://imageshack.us)
è belliffimo :fagiano:
:asd:
anzi... :mbe:
guarda che figata :D
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 180)
lt(turtle, 360/petals)
TurtleWorld()
bob = Turtle()
bob.delay = 0.01
flower(bob, 50, 8)
http://img267.imageshack.us/img267/8735/fiorefl6.png (http://imageshack.us)
è belliffimo :fagiano:
:asd:
nono tu devi provare questo :sofico:
import math
from TurtleWorld import *
def polyline(t, length, n, angle):
"""Draw n line segments with the given length and
angle (in degrees) between them. t is a turtle.
"""
for i in range(n):
fd(t, length)
lt(t, angle)
def arc(t, r, angle):
"""Draw an arc with the given r (radius) and angle
(in degrees). t is a turtle."""
arclength = 2 * math.pi * r * angle / 360
n = int(arclength / 4)
length = arclength / n
polyline(t, length, n, float(angle)/n)
def flower(turtle, radius, petals):
for i in range(petals):
arc(turtle, radius, 120)
lt(turtle, 120)
arc(turtle, radius, 120)
lt(turtle, (360/petals+120))
TurtleWorld()
bob = Turtle()
bob.delay = 0.001
flower(bob, 90, 9)
^TiGeRShArK^
19-01-2008, 13:36
nono tu devi provare questo :sofico:
certo che è intrippante sta tartarughina :asd:
certo che è intrippante sta tartarughina :asd:
mi ricordo di averci giochicchiato con un oggetto simile quando ero giovane..
ehmm...
se hai un raggio x e fai un arco di 180° allora ti ritrovi esattamente in corrispondenza del punto di partenza, dopo aver disegnato un arco, però traslato di 2x lungo la direzione perpendicolare (con verso a sinistra) della posizione inziale della tartaruga.
La direzione della tartaruga sarà a quel punto parallela rispetto a quella iniziale, ma il verso sarà opposto.
Quindi ruotando di 90° verso destra e ripetendo il procedimento avremo che sarà traslata di 2x nella direzione verso cui era rivolta prima di essere girata di 90°.
Finendo il giro si avrà una situazione di questo tipo (rappresentando solo i diametri degli archi):
------
| |
| |
------
con la tartaruga che sarà ritornata al punto di partenza disegnando i 4 archi che formano i petali del fiore.
A quel punto generalizzare la funzione per ogni numero di petali dovrebbe essere banale così ad occhio.
Il problema, come hai notato, è che funziona solo con quattro petali.
Forse l'unica soluzione è prendere goniometro, calcolatrice e squadra, calcolare le misure e scrivere la funzione.
^TiGeRShArK^
19-01-2008, 19:36
Il problema, come hai notato, è che funziona solo con quattro petali.
Forse l'unica soluzione è prendere goniometro, calcolatrice e squadra, calcolare le misure e scrivere la funzione.
no.. quello di cui ho postato l'immagine è fatto in quel modo con 8 petali :fagiano:
e cmq l'avevo già scritto io che serviva una banale generalizzazione per farlo funzionare per tutti i casi..
cosa che ha fatto konte nel suo codice :p
ciao approfitto di questo 3d per chiedere:
stavo provando a far partire questo cam scritto in python e rilasciato sotto licenza mit
però mi da errore su un indentazione ma non capisco come risolverlo...
qualcuno me lo sà dire???
variabilepippo
01-02-2008, 11:58
Non si "approfitta" di un thread, se ne apre uno nuovo, non costa nulla farlo ed in tal modo si contribuisce a mantenere ordinato il forum.
Ziosilvio
04-02-2008, 10:03
Ciao a tutti.
Dopo diversi fallimenti, sto tentando di imparare qualcosa su un linguaggio di programmazione, in questo caso il Python.
http://www.greenteapress.com/thinkpython/html/book005.html#toc50 , esercizio 3.
Avendo già a disposizione queste funzioni:
CUT
come posso fare a realizzare la funzione per disegnare i fiori?
Anzitutto, mi sa che gli angoli dovranno essere due: uno per il numero dei petali (che è semplicemente 360°/n) e uno per la loro ampiezza, che chiamiamo alpha.
Proviamo a far disegnare alla tartarughina la parte inferiore di un petalo orizzontale.
Possiamo farlo dicendole di
- girare a destra di alpha/2, e poi
- tracciare un arco di ampiezza alpha.
A questo punto, la tartarughina è girata a sinistra di alpha/2 rispetto a est.
Per farle fare la parte superiore, dobbiamo farle ripetere la procedura, specularmente rispetto all'asse orizzontale, e in senso inverso.
Quindi, nel momento in cui inizia a disegnare, deve essere rivolta di alpha/2 a destra rispetto a ovest.
E questo, glielo possiamo far fare con un giro verso sinistra di 180°-alpha.
Adesso si può ripetere il tracciamento dell'arco; alla fine del quale, la tartarughina sarà girata di alpha/2 a sinistra rispetto a ovest.
Per farla di nuovo andare verso est, basta farla girare a sinistra di 180°-(alpha/2).
guarda che l'avevo già postata la soluzione :fagiano:
Ziosilvio
04-02-2008, 19:38
guarda che l'avevo già postata la soluzione :fagiano:
Io però l'esercizio l'avevo visto in un momento in cui non mi riusciva di focalizzare l'attenzione, e mi ero riproposto di risolverlo in sèguito.
Spero di averlo fatto...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.