Stai in campana!

(la campana e' la zona entro cui il giocatore deve essere molto attento, vigile, perche' deve impedire all'avversario di centrare il canestro con il pallone)

A scuola, nell'ora di ginnastica si giocava a pallacanestro. Il mio ruolo ? ovviamente il play, essendo il piu' basso.



I miei contatti:

La curva di Koch.
di Alvaro Costa.
 25 febbraio, La curva di Koch 

Una cruva bellissima.
Mi ha sempre affascinato dai tempi in cui il professor Minardi ne parlò in una lezione al Cannizzaro.
In questo breve articolo vi spiego come si disegna perchè solo capendo la semplicissima costruzione si possono apprezzarne le proprietà.





Cominciamo con il disegnare un segmento.



Ora dividiamo il segmento in 3 parti uguali e, sul secondo segmento disegniamo un triangolo equilatero.



Abbiamo in questo modo ottenuto una curva costituita da 4 segmenti di stessa lunghezza.
Il prossimo passo è quello di applicare lo stesso passaggio a ciascuno dei 4 segmenti ottenuti.

Vediamo il passaggio su ognuno dei 4 segmenti:

Segmento AB:


Segmento BC:


Segmento CD:


Segmento DE:


La cosa interessante è che la curva che si ottiene ad ogni reiterazione è sempre più spigolosa ma la struttura, per così dire, si conserva. Abbiamo così introdotto il concetto di iterazione che specifica quante volte appunto reiterare il procedimento di costruzione, su ogni segmento che viene individuato dal procedimento.



Bene, se la curiosità vi ha spinto a leggere fino a qui, allora vi chiederete come io abbia fatto a realizzare le immagini che vi ho proposto.
Il più maligno penserà che la abbia prese su internet. Ovviamente no: come sapete mi piace realizzare tutto da me. Ecco allora spiegato come.
Ho scelto di utilizzare javascript perchè mediante le specifiche HTML 5.0 è possibile disegnare su di un canvas.

Risulta chiaro che la struttura del programma che implementa la curva di Koch è ricorsiva.
Immaginiamo pertanto di voler realizzare la curva di Koch su un segmento individuato da punti (x1,y1) e (x2,y2), con numero di iterazioni pari a "n".

Questa la funzione ad alto livello:

function Koch(n,x1,y1,x2,y2) {

   if (n=0) --> disegna il segmento che congiunge i punti (x1,y1) e (x2,y2)
   else {

      // dividi il segmento in 3 parti uguali: AB, BD, DE
      // individua il vertice C del triangolo equilatero che ha per base BD
      // sia AB il segmento delimitato dai punti (x1,y1) e (xp2,yp2)
      // sia BC il segmento delimitato dai punti (xp2,yp2) e (xp3,yp3)
      // sia CD il segmento delimitato dai punti (xp3,yp3) e (xp4,yp4)
      // sia DE il segmento delimitato dai punti (xp4,yp4) e (x2,y2)
      // esegui la curva di Koch sui 4 segmenti individuati:

      Koch(n-1,x1,y1,xp2,yp2)
      Koch(n-1,xp2,yp2,xp3,yp3)
      Koch(n-1,xp2,yp2,xp4,yp4)
      Koch(n-1,xp4,yp4,x2,y2)
      
   }
}

Il problema diviene pertanto unicamente quello di calcolare le coordinate dei punti:

(xp2,yp2), (xp3,yp3), (xp4,yp4)

L'unica difficoltà è quella di considerare che il canvas ha l'ascissa che aumenta verso il basso (e non verso l'alto come nel sistema cartesiano)

Inoltre è facilmente verificabile che occorre dividere il problema in sottocasi in quanto, a secondo di dove si trovano i punti (x1,y1) e (x2,y2) l'angolo che il segmento forma con l'asse delle ascisse può essere uno qualsiasi ma l'arcotangente da risultati tra -pi/2 e pi/2.
Occhio quindi a queste piccole difficoltà e, con qualche semplicissimo passaggio trigonometrico, si arriva alla soluzione.

Eccola:





function Koch(n,x1,y1,x2,y2) {
  if (n==0) {
    drawLine(x1,y1,x2,y2);
  }
  else {
    var xp2,yp2,xp3,yp3,xp4,yp4,alfa,l;
    l=Math.sqrt((x2-x1)*(x2-x1)+(y1-y2)*(y1-y2))/3;
    if (x1<=x2 && y1>=y2) { // caso 1
        alfa=Math.atan((y1-y2)/(x2-x1));
        xp2=x1+l*Math.cos(alfa);
        yp2=y1-l*Math.sin(alfa);
        xp4=x1+2*l*Math.cos(alfa);
        yp4=y1-2*l*Math.sin(alfa);
        xp3=xp2+l*Math.cos(alfa+((Math.PI)/3));
        yp3=yp2-l*Math.sin(alfa+((Math.PI)/3));
    }
    else if (x1>=x2 && y1>=y2) { // caso 2
        alfa=Math.atan((y1-y2)/(x1-x2));
        xp2=x1-l*Math.cos(alfa);
        yp2=y1-l*Math.sin(alfa);
        xp4=x1-2*l*Math.cos(alfa);
        yp4=y1-2*l*Math.sin(alfa);
        xp3=xp2-l*Math.cos(((Math.PI)/3)-alfa);
        yp3=yp2+l*Math.sin(((Math.PI)/3)-alfa);
    }
    else if (x1>=x2 && y1<=y2) { // caso 3
        alfa=Math.atan((y2-y1)/(x1-x2));
        xp2=x1-l*Math.cos(alfa);
        yp2=y1+l*Math.sin(alfa);
        xp4=x1-2*l*Math.cos(alfa);
        yp4=y1+2*l*Math.sin(alfa);
        xp3=xp2-l*Math.cos(((Math.PI)/3)+alfa);
        yp3=yp2+l*Math.sin(((Math.PI)/3)+alfa);
    }
    else if (x1<=x2 && y1<=y2) { // caso 4
        alfa=Math.atan((y2-y1)/(x2-x1));
        xp2=x1+l*Math.cos(alfa);
        yp2=y1+l*Math.sin(alfa);
        xp4=x1+2*l*Math.cos(alfa);
        yp4=y1+2*l*Math.sin(alfa);
        xp3=xp2+l*Math.cos((Math.PI)/3-alfa);
        yp3=yp2-l*Math.sin((Math.PI)/3-alfa);
    }


     // ricorsione
    Koch(n-1,x1,y1,xp2,yp2);
    Koch(n-1,xp2,yp2,xp3,yp3);
    Koch(n-1,xp3,yp3,xp4,yp4);
    Koch(n-1,xp4,yp4,x2,y2);
    }
}






Se vi è piaciuto l'articolo, mettete "Mi Piace" e condividetelo :)