2013-08-04 22:58:13 +02:00
|
|
|
import math
|
|
|
|
import turtle
|
2012-12-25 22:47:25 +01:00
|
|
|
|
2013-08-25 20:17:37 +02:00
|
|
|
|
2012-12-25 22:47:25 +01:00
|
|
|
def impostazioni():
|
|
|
|
turtle.title("Frattali")
|
|
|
|
turtle.bgcolor("#000")
|
|
|
|
turtle.hideturtle()
|
2013-08-25 20:17:37 +02:00
|
|
|
|
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
class Frattale(turtle.Pen):
|
2013-08-25 20:17:37 +02:00
|
|
|
|
|
|
|
def __init__(self, colore="yellow", velocità=0, riempi=True):
|
2013-08-04 22:58:13 +02:00
|
|
|
super(Frattale, self).__init__()
|
2012-12-25 22:47:25 +01:00
|
|
|
self.colore = colore
|
|
|
|
self.riempi = riempi
|
|
|
|
self.velocità = velocità
|
|
|
|
self.speed(self.velocità)
|
|
|
|
self.color(self.colore)
|
|
|
|
self.hideturtle()
|
2013-08-25 20:17:37 +02:00
|
|
|
|
2012-12-25 22:47:25 +01:00
|
|
|
def posizione(self, x, y):
|
|
|
|
self.pu()
|
|
|
|
self.setpos(x, y)
|
|
|
|
self.pd()
|
2013-08-25 20:17:37 +02:00
|
|
|
|
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
class Koch(Frattale):
|
|
|
|
"""
|
2013-08-25 20:17:37 +02:00
|
|
|
Curva di Koch
|
2013-08-04 22:58:13 +02:00
|
|
|
"""
|
2012-12-25 22:47:25 +01:00
|
|
|
def disegna(self, l=3, s=250, n=4, p=1):
|
2013-08-04 22:58:13 +02:00
|
|
|
"""
|
|
|
|
Disegna la curva nel canvas.
|
|
|
|
*l: numero di lati;
|
|
|
|
*s: misura del lato in pixel;
|
|
|
|
*n: numero di ricorsioni;
|
|
|
|
*p: parità della curva, 1 o -1;
|
|
|
|
|
|
|
|
Es. Koch.disegna(3, 250, 4, 1)
|
|
|
|
"""
|
2013-08-25 20:17:37 +02:00
|
|
|
spigolo = 2 * s * math.sin(math.pi / l)
|
2013-08-04 22:58:13 +02:00
|
|
|
self.posizione(s, 0)
|
2013-08-25 20:17:37 +02:00
|
|
|
if self.riempi is True:
|
2013-07-08 01:41:34 +02:00
|
|
|
self.begin_fill()
|
2013-08-25 20:17:37 +02:00
|
|
|
self.rt(180 - (90 * (l - 2) / l))
|
2012-12-25 22:47:25 +01:00
|
|
|
for i in range(l):
|
2013-08-04 22:58:13 +02:00
|
|
|
self.__curva(spigolo, n, p)
|
2012-12-25 22:47:25 +01:00
|
|
|
self.rt(360 / l)
|
2013-08-25 20:17:37 +02:00
|
|
|
self.lt(180 - (90 * (l - 2) / l))
|
|
|
|
if self.riempi is True:
|
|
|
|
self.end_fill()
|
|
|
|
self.posizione(0, 0)
|
2012-12-25 22:47:25 +01:00
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
def __curva(self, s, n, p):
|
2012-12-25 22:47:25 +01:00
|
|
|
if n < 1:
|
|
|
|
self.fd(s)
|
|
|
|
return
|
2013-08-25 20:17:37 +02:00
|
|
|
self.__curva(s / 3, n - 1, p)
|
|
|
|
self.lt(60 * p)
|
|
|
|
self.__curva(s / 3, n - 1, p)
|
|
|
|
self.rt(120 * p)
|
|
|
|
self.__curva(s / 3, n - 1, p)
|
2012-12-25 22:47:25 +01:00
|
|
|
self.lt(60 * p)
|
2013-08-25 20:17:37 +02:00
|
|
|
self.__curva(s / 3, n - 1, p)
|
|
|
|
|
2012-12-25 22:47:25 +01:00
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
class Hilbert(Frattale):
|
|
|
|
"""
|
|
|
|
Curva di Hilbert (curva di Peano)
|
|
|
|
"""
|
2013-03-23 14:16:46 +01:00
|
|
|
def disegna(self, s=4, n=6, p=1):
|
2013-08-04 22:58:13 +02:00
|
|
|
"""
|
|
|
|
Disegna la curva nel canvas.
|
|
|
|
*s: misura del lato in pixel;
|
|
|
|
*n: numero di ricorsioni;
|
|
|
|
*p: parità della curva, 1 o -1;
|
|
|
|
|
|
|
|
Es. Hilbert.disegna(4, 6, 1)
|
|
|
|
"""
|
2013-08-25 20:17:37 +02:00
|
|
|
self.posizione(-33 * s * p, -33 * s * p)
|
|
|
|
if self.riempi is True:
|
2013-07-08 01:41:34 +02:00
|
|
|
self.begin_fill()
|
2013-08-04 22:58:13 +02:00
|
|
|
self.__curva(s, n, p)
|
2013-08-25 20:17:37 +02:00
|
|
|
if self.riempi is True:
|
2013-07-08 01:41:34 +02:00
|
|
|
self.end_fill()
|
2013-08-25 20:17:37 +02:00
|
|
|
self.posizione(0, 0)
|
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
def __curva(self, s, n, p):
|
|
|
|
if n == 0:
|
|
|
|
return
|
2013-08-25 20:17:37 +02:00
|
|
|
self.lt(p * 90)
|
|
|
|
self.__curva(s, n - 1, -p)
|
2013-08-04 22:58:13 +02:00
|
|
|
self.fd(s)
|
2013-08-25 20:17:37 +02:00
|
|
|
self.rt(p * 90)
|
|
|
|
self.__curva(s, n - 1, p)
|
2013-08-04 22:58:13 +02:00
|
|
|
self.fd(s)
|
2013-08-25 20:17:37 +02:00
|
|
|
self.__curva(s, n - 1, p)
|
|
|
|
self.rt(p * 90)
|
2013-08-04 22:58:13 +02:00
|
|
|
self.fd(s)
|
2013-08-25 20:17:37 +02:00
|
|
|
self.__curva(s, n - 1, -p)
|
|
|
|
self.lt(p * 90)
|
|
|
|
|
|
|
|
|
2013-08-04 22:58:13 +02:00
|
|
|
class Sierpinski(Frattale):
|
|
|
|
"""
|
|
|
|
Triangolo di sierpinski
|
|
|
|
"""
|
2013-03-23 14:16:46 +01:00
|
|
|
def disegna(self, n, s=400, x=-200, y=-150):
|
2013-08-04 22:58:13 +02:00
|
|
|
"""
|
|
|
|
Disegna la curva nel canvas.
|
|
|
|
*n: numero di ricorsioni;
|
|
|
|
*s: misura del lato in pixel;
|
|
|
|
*x,y: coordinate del punto iniziale;
|
|
|
|
|
|
|
|
Es. Sierpinski.disegna(3, 400, -200, -150)
|
|
|
|
"""
|
2012-12-25 22:47:25 +01:00
|
|
|
self.posizione(x, y)
|
2013-08-25 20:17:37 +02:00
|
|
|
if n == 1:
|
|
|
|
if self.riempi is True:
|
2013-07-08 01:41:34 +02:00
|
|
|
self.begin_fill()
|
2012-12-25 22:47:25 +01:00
|
|
|
for i in range(3):
|
|
|
|
self.fd(s)
|
|
|
|
self.lt(120)
|
2013-08-25 20:17:37 +02:00
|
|
|
if self.riempi is True:
|
2013-07-08 01:41:34 +02:00
|
|
|
self.end_fill()
|
2012-12-25 22:47:25 +01:00
|
|
|
else:
|
2013-08-25 20:17:37 +02:00
|
|
|
self.disegna(n - 1, s / 2, x, y)
|
|
|
|
self.disegna(n - 1, s / 2, x + s / 2, y)
|
|
|
|
self.disegna(n - 1, s / 2, x + s / 4, y + (s * (3 ** 0.5)) / 4)
|