PDA

View Full Version : [Python] Aiuto esercizio di "How to Think Like a Python Programmer"


Occasus
16-01-2008, 16:54
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.

Occasus
18-01-2008, 13:18
up:fagiano:

^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

Occasus
18-01-2008, 21:35
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:

Occasus
18-01-2008, 22:04
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.

k0nt3
19-01-2008, 11:21
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 ;)

k0nt3
19-01-2008, 12:54
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:

k0nt3
19-01-2008, 13:32
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:

k0nt3
19-01-2008, 13:44
certo che è intrippante sta tartarughina :asd:
mi ricordo di averci giochicchiato con un oggetto simile quando ero giovane..

Occasus
19-01-2008, 17:49
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

guyver
01-02-2008, 11:11
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).

k0nt3
04-02-2008, 17:11
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...