import math import turtle def impostazioni(): turtle.title("Frattali") turtle.bgcolor("#000") turtle.hideturtle() class Frattale(turtle.Pen): def __init__(self, colore="yellow", velocità=0, riempi=True): super(Frattale, self).__init__() self.colore = colore self.riempi = riempi self.velocità = velocità self.speed(self.velocità) self.color(self.colore) self.hideturtle() def posizione(self, x, y): self.pu() self.setpos(x, y) self.pd() class Koch(Frattale): """ Curva di Koch """ def disegna(self, l=3, s=250, n=4, p=1): """ 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) """ spigolo = 2 * s * math.sin(math.pi / l) self.posizione(s, 0) if self.riempi is True: self.begin_fill() self.rt(180 - (90 * (l - 2) / l)) for i in range(l): self.__curva(spigolo, n, p) self.rt(360 / l) self.lt(180 - (90 * (l - 2) / l)) if self.riempi is True: self.end_fill() self.posizione(0, 0) def __curva(self, s, n, p): if n < 1: self.fd(s) return 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) self.lt(60 * p) self.__curva(s / 3, n - 1, p) class Hilbert(Frattale): """ Curva di Hilbert (curva di Peano) """ def disegna(self, s=4, n=6, p=1): """ 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) """ self.posizione(-33 * s * p, -33 * s * p) if self.riempi is True: self.begin_fill() self.__curva(s, n, p) if self.riempi is True: self.end_fill() self.posizione(0, 0) def __curva(self, s, n, p): if n == 0: return self.lt(p * 90) self.__curva(s, n - 1, -p) self.fd(s) self.rt(p * 90) self.__curva(s, n - 1, p) self.fd(s) self.__curva(s, n - 1, p) self.rt(p * 90) self.fd(s) self.__curva(s, n - 1, -p) self.lt(p * 90) class Sierpinski(Frattale): """ Triangolo di sierpinski """ def disegna(self, n, s=400, x=-200, y=-150): """ 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) """ self.posizione(x, y) if n == 1: if self.riempi is True: self.begin_fill() for i in range(3): self.fd(s) self.lt(120) if self.riempi is True: self.end_fill() else: 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)