CODICE IN LINGUAGGIO DI PROGETTO PER GENERARE UN ALBERO DI PITAGORA di 30° o di 45°

PREMESSA

Dato un quadrato di vertici A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4), si possono disegnare tutti i punti interni facendo scorrere, ad esempio, il lato AB verso il alto CD.
Nella figura a destra il segmento PQ rappresenta una posizione del lato AB mentre scorre.
Possiamo osservare che :

Px = Ax + s(Dx-Ax)
Py = Ay + s(Dy-Ay)

Qx = Bx + s(Cx-Bx)
Qy = Cy + s(Cy-By)

Dove s, 0 ≤ s ≤ 1, esprime il rapporto fra AP e AD.


Procederemo quindi secondo i seguenti passi:

1) TROVARE I TRASFORMATI DEI VERTICI DEL QUADRATO

2) DISEGNARE I PUNTI INTERNI DEL QUADRATO GENERATORE

 

PASSO 1

Le equazioni che useremo per trovare il trasformato di ogni punto sono [cfr. Costruzione]:

x' = a(x-x0) + b(y-y0) + x0
y' = a'(x-x0) + b'(y-y0) + y0

Dove:
(x0, y0)
     sono le coordinate del centro di rotazione
a = k * cos(T)
     con k = rapporto di omotetia; T angolo di rotazione espresso in radianti
b = -k * Sin(T)
     con k = rapporto di omotetia; T angolo di rotazione espresso in radianti

COSTANTI CHE USIAMO

Const lato = 40
    Misura, in pixel, del lato del quadrato di partenza. Potete aumentarlo o diminuirlo.
Per rappresentare un punto sullo schermo dovrete moltiplicare le sue coordinate per il lato, oltre che operare un'opportuna traslazione.
ESEMPIO: Per disegnare P(xa,ya), e se la vostra finestra grafica misura w × h, potete scrivere
Pset(w/2 + Round(lato * xa), h - Round(lato * ya))
Const j = 15
    Numero di iterazioni della procedura. All'inizio, per provare, conviene j = 0, j = 1 e così via.
Const rosso, verde, blu
    componenti rosso, verde e blu del colore, comprese fra 0 e 255. Scegliete i vostri colori preferiti.

VARIABILI GLOBALI CHE USIAMO

T As Double
    angolo, in radianti, della prima rotazione
T1 As Double
    angolo, in radianti, della seconda rotazione
k1 As Double
    rapporto della prima omotetia
k2 As Double
    rapporto della seconda omotetia

Partenza

  Inizio

    Usa il colore di componenti rosso, verde, blu
Poni:


ANGOLI 30° 60°


ANGOLI 45°

    k1 = 0.5
    T = 2.618

  [2.618 è l'angolo, espresso in radianti, di 150° in senso antiorario e la contrazione è di 0.5]

    k2 = 0.866
    T1 = 3.927

  [3.927 è l'angolo, espresso in radianti, di 240° in senso antiorario e la contrazione è di 0.866]

    k1 = 0.7071
     T = 2.356

  [2.356 è l'angolo, espresso in radianti, di 135° in senso antiorario e la contrazione è di 0.707]

    k2 = 0.707
    T1 = 3.927

  [3.927 è l'angolo, espresso in radianti, di 225° in senso antiorario e la contrazione è di 0.707]


    Chiama la procedura ricorsiva Pitagora passando come parametri, nell'ordine:

j: il numero di ripetizioni della procedura
le coordinate di A, B, C, D
Nel nostro caso: Chiama Pitagora(j, 0, 0, 1, 0, 1, 1, 0, 1)

Fine


Procedura Pitagora(n As Integer, x1 As Double, y1 As Double, x2 As Double, y2 As Double, x3 As Double, y3 As Double, x4 As Double, y4 As Double)

Inizio
Dichiara, come variabili si tipo double:

x1q1, y1q1   [trasformati di (x1,y1) nella trasformazione numero 1]
x1q2, y1q2   [trasformati di (x2,y2) nella trasformazione numero 1]
x1q3, y1q3   [trasformati di (x3,y3) nella trasformazione numero 1]
x1q4, y1q4   [trasformati di (x4,y4) nella trasformazione numero 1]

x1q5, y1q5   [trasformati di (x1,y1) nella trasformazione numero 2]
x1q6, y1q6   [trasformati di (x2,y2) nella trasformazione numero 2]
x1q7, y1q7   [trasformati di (x3,y3) nella trasformazione numero 2]
x1q8, y1q8   [trasformati di (x3,y4) nella trasformazione numero 2]

a, b       [coefficienti della trasformazione numero 1]
a1, b1   [coefficienti della trasformazione numero 2]

xP, yP, xQ, yQ   [coordinate dei punti P e Q come da figura]

s   [parametro che varierà fra 0 e 1]
Se n = 0 allora

  [Si disegnano i quadrati pieni]

s = 0

Ripeti


   xP = x1 + s * (x4 - x1)
   yP = y1 + s * (y4 - y1)
   xQ = x2 + s * (x3 - x2)
   yQ = y2 + s * (y3 - y2)
   Disegna la retta per i punti (xP,yP), (xQ,yQ)
   s = s + 0.01
   
Fino a quando s >= 1
Altrimenti

  [Prima trasformazione. Rotazione di 150° in senso antiorario e di centro (x4,y4) seguita da omotetia con lo stesso centro e rapporto 0.5]

a = k1 * Cos(T)
b = -k1 * Sin(T)
a1 = k1* Sin(T)
b1 = k1 * Cos(T)

  [Trovo il trasformato di (x1,y1)]

x1q1 = a * (x1 - x4) + b * (y1 - y4) + x4
y1q1 = a1 * (x1 - x4) + b1 * (y1 - y4) + y4

  [Trovo il trasformato di (x2,y2)]

x1q2 = a * (x2 - x4) + b * (y2 - y4) + x4
y1q2 = a1 * (x2 - x4) + b1 * (y2 - y4) + y4

  [Trovo il trasformato di (x3,y3)]

x1q3 = a * (x3 - x4) + b * (y3 - y4) + x4
y1q3 = a1 * (x3 - x4) + b1 * (y3 - y4) + y4

  [Trovo il trasformato di (x4,y4) che resta fisso, infatti è in centro di similitudine]

x1q4 = x4
y1q4 = y4

  [Seconda trasformazione. Rotazione di 240° in senso antiorario intorno a (x3,y3) seguita da omotetia con lo stesso centro e rapporto 0.866]

a = k2 * Cos(T1)
b = -k2 * Sin(T1)
a1 = k2 * Sin(T1)
b1 = k2 * Cos(T1)

  [Trovo il trasformato di (x1,y1)]

x1q5 = a * (x1 - x3) + b * (y1 - y3) + x3
y1q5 = a1 * (x1 - x3) + b1 * (y1 - y3) + y3

  [Trovo il trasformato di (x2,y2)]

x1q6 = a * (x2 - x3) + b * (y2 - y3) + x3
y1q6 = a1 * (x2 - x3) + b1 * (y2 - y3) + y3

  [Trovo il trasformato di (x4,y4)]

x1q8 = a * (x4 - x3) + b * (y4 - y3) + x3
y1q8 = a1 * (x4 - x3) + b1 * (y4 - y3) + y3

  [Trovo il trasformato di (x3,y3) che resta fisso, infatti è il centro di similitudine]

x1q7 = x3
y1q7 = y3

  [Si disegnano i quadrati pieni]

s = 0

Ripeti


   xP = x1 + s * (x4 - x1)
   yP = y1 + s * (y4 - y1)
   xQ = x2 + s * (x3 - x2)
   yQ = y2 + s * (y3 - y2)
   Disegna la retta per i punti (xP,yP), (xQ,yQ)
   s = s + 0.01
   
Fino a quando s >= 1

  [Si richiamano ricorsivamente le procedure sui due quadrati ottenuti, facendo attenzione all'ordine dei vertici!]

Chiama Pitagora(n - 1, x1q4, y1q4, x1q1, y1q1, x1q2, y1q2, x1q3, y1q3)
Chiama Pitagora(n - 1, x1q6, y1q6, x1q7, y1q7, x1q8, y1q8, x1q5, y1q5)
Fine se
Fine sottoprogramma Pitagora


Alberi di Pitagora: Introduzione   Pit45°   Pit30°   Codice   Di Natale   Casuali    Generalizzati   Di Natale generalizzati


 

Introduzione
Definizione

Realizzazione

Tipi di frattali
Caratteristiche
Alberi lSystem
Alberi iterativi
Altri Iterativi
Indice
Home
Contatti

©2002 - 2012 www.webfract.it