Codice




var passaggi=1;
var primo=40;
var secondo=450;
var terzo=560;
var quarto=450;
var coso=speriamo(primo,secondo,terzo,quarto);
var vett=[primo,secondo,coso[0],coso[1],terzo,quarto];


function init( ) {
          var tela=$('koch');
          Event.observe(tela,'click',passo,false);
          var context=tela.getContext('2d');

          context.beginPath( );
          context.moveTo(primo,secondo);
          context.lineTo(coso[0],coso[1]);
          context.lineTo(terzo,quarto);
          context.closePath( );
          context.fillStyle='cyan';
          context.fill( );
          context.strokeStyle='blue';
          context.stroke( );
}


function speriamo(a,b,c,d) {
          var scarto=1;
          var i,j;
          var m=(c-a)/(d-b);
          var l=Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));
          if(Math.abs(m)>=1){
                    for(j=0;j<600;j++){
                              i=(c*c+d*d-a*a-b*b)/(2*c-2*a)-(1/m)*j;
                              var distab=Math.sqrt((a-i)*(a-i)+(b-j)*(b-j));
                              if(Math.abs(distab-l)<scarto){
                                        if( ((a<c)&&(b<=d)&&((j-b)/(d-b)<(i-a)/(c-a))) || ((a<c)&&(b>d)&&((j-b)/(d-b)>(i-a)/(c-a))) || ((a>c)&&(b<d)&&(j>(i-a)*(d-b)/(c-a)+b)) || ((a>c)&&(b>=d)&&(j>(i-a)*(d-b)/(c-a)+b)) || (a==c&&b<d&&i<a) || (a==c&&b>d&&i>a) ){
                                                  var getxy=[i,j];
                                                  return(getxy);
                                                  break;
                                        }
                    }
                    }
          }else{
                    for(i=0;i<600;i++){
                              j=(c*c+d*d-a*a-b*b)/(2*d-2*b)-m*i;
                              var distab=Math.sqrt((a-i)*(a-i)+(b-j)*(b-j));
                              if(Math.abs(distab-l)<scarto){
                                        if( ((a<c)&&(b<=d)&&((j-b)/(d-b)<(i-a)/(c-a))) || ((a<c)&&(b>d)&&((j-b)/(d-b)>(i-a)/(c-a))) || ((a>c)&&(b<d)&&(j>(i-a)*(d-b)/(c-a)+b)) || ((a>c)&&(b>=d)&&(j>(i-a)*(d-b)/(c-a)+b)) || (a==c && b < d && i < a) || (a==c&&b>d&&i>a) ){
                                                  var getxy=[i,j];
                                                  return(getxy);
                                                  break;
                                        }
                              }
                    }
          }
}


function passo( ) {
          var npunti=3*Math.pow(4,passaggi-1);
          var tela=$('koch');
          var context=tela.getContext('2d');
          var i,j;
          var metti=[];
          for(i=0; i<npunti; i++){
                    var xunterzo,yunterzo,xdueterzi,ydueterzi;
                    if(vett[2+2*i]!==undefined){
                              xunterzo=(vett[2+2*i]+2*vett[0+2*i])/3;
                              yunterzo=(vett[3+2*i]+2*vett[1+2*i])/3;
                              xdueterzi=(2*vett[2+2*i]+vett[0+2*i])/3;
                              ydueterzi=(2*vett[3+2*i]+vett[1+2*i])/3;
                              var scoiattolo=speriamo(xunterzo,yunterzo,xdueterzi,ydueterzi);
                              metti.push(vett[0+2*i],vett[1+2*i],Math.round(xunterzo),Math.round(yunterzo),scoiattolo[0],scoiattolo[1],Math.round(xdueterzi),Math.round(ydueterzi));
                    }else{
                              xunterzo=(vett[0]+2*vett[0+2*i])/3;
                              yunterzo=(vett[1]+2*vett[1+2*i])/3;
                              xdueterzi=(2*vett[0]+vett[0+2*i])/3;
                              ydueterzi=(2*vett[1]+vett[1+2*i])/3;
                              var scoiattolo=speriamo(xunterzo,yunterzo,xdueterzi,ydueterzi);
                              metti.push(vett[4],vett[5],Math.round(xunterzo),Math.round(yunterzo),scoiattolo[0],scoiattolo[1],Math.round(xdueterzi),Math.round(ydueterzi));

                    }
          }
          metti.push(vett[0],vett[1]);

          context.beginPath( );
          context.moveTo(metti[0],metti[1]);
          for(j=0; j<4*npunti+1; j++){
                    if(metti[j+2]!==undefined){
                              context.lineTo(metti[2*j+2],metti[2*j+3]);
                    }else{
                              context.moveTo(70,230);
                    }
          }
          context.closePath( );
          context.fillStyle='cyan';
          context.fill( );
          context.strokeStyle='blue';
          context.stroke( );
          passaggi++;
          vett=metti;
}


Event.observe(window,'load',init,false);

Licenza CC