JavascriptProva

sabato 9 gennaio 2016

Un "overloading" di costruttori per JavaScript

Un'idea per fare una specie di overloading dei costruttori in JavaScript...


function funzione(){
 alert(arguments.length);
}
funzione(1,2,3);
Con questa prova, variando il numero dei parametri passati alla funzione ottengo un valore diverso di arguments.length, mentre se metto un qualunque numero di parametri attesi dalla funzione arguments.length resta sempre zero.
Ecco che quindi posso manipolare la mia funzione della retta per due punti;
function RettaPerDuePunti(Punto1,Punto2,Colore)
può diventare anche
function RettaPerDuePunti(X1,Y1,X2,Y2,Colore)
...che permette di tracciare una retta per due punti senza bisogno di istanziare i punti.

Provo ad eseguire la manipolazione...

function RettaPerDuePunti(){
 var matrice=[];
 var prevY;
 var Y;
 var Z;
 var H=1;
 var delta;
 if(arguments.length==3){
  this.pt1=arguments[0];
  this.pt2=arguments[1];
  this.X1=this.pt1.X;
  this.Y1=this.pt1.Y;
  this.X2=this.pt2.X;
  this.Y2=this.pt2.Y;
  this.Colore=arguments[arguments.length-1];
 }
 else if (arguments.length==5){
  
  this.X1=arguments[0];
  this.Y1=arguments[1];
  this.X2=arguments[2];
  this.Y2=arguments[3]
  this.Colore=arguments[arguments.length-1];
 }
 
 
 
 this.lunghezza=Math.sqrt(Math.pow((this.Y2-this.Y1),2)+Math.pow((this.X2-this.X1),2));
 this.traccia=function(){
  
  //se la coordinata X del primo punto è minore della coordinata X del secondo punto...
  if(this.X1<this.X2){ 
   for(var i=this.X1;i<=this.X2;i++){
    var elemento=document.createElement("DIV");
    matrice.push(elemento);
    
    //per la X di ogni punto dell'intervallo si calcola Y 
    //secondo la formula:
    /* (y-y1)/(y2-y1) = (x-x1)/(x2-x1)
    
       (y-y1) = (x-x1)/(x2-x1)*(y2-y1)
       
       y=(x-x1)/(x2-x1)*(y2-y1)+y1
       
    */
    Y=(i-this.X1)/(this.X2-this.X1)*(this.Y2-this.Y1)+this.Y1
    Z=Y;
    
    //CODICE PER TRACCIARE UNA LINEA RIPIDA CONTINUA
    // Si traccia un DIV di ordinata Y = y1 e di altezza calcolata in base alla
    //differenza fra y2 e y1
    /*
    Se y2 è maggiore di y1 si deve tracciare un DIV che parta dal pixel appena superiore a y1 e che sia di altezza pari alla differenza
    fra y2 e y1 diminuita di un pixel
    
    Se y2 è minore di y1 si deve tracciare un DIV che parta dal pixel in questione (Z resta uguale a Y) (ordinata Z) e che abbia un'
    altezza pari alla differenza fra y2 e y1.
    */
    //CALCOLO della differenza (delta) fra la coordinata Y di un punto e quella del punto precedente (prevY)
    if(prevY!=null) {
     delta=Y-prevY;
     
    
     if(delta>1) {
      Z=Y-delta+1;
      H=delta;
     }
     if(delta<-1) H=-delta;
    }
   
    elemento.setAttribute("style","width:1px;height:"+H+"px;background-color:"+this.Colore+";position:absolute;left:"+i+"px;top:"+Z+"px;");
    prevY=Y;
    document.body.appendChild(elemento);
  
    
   }
  }
  
  //se la coordinata X del secondo punto è minore di quella del primo punto
  else if(this.X1>this.X2){ 
   for(var i=this.X1;i>=this.X2;i-=1){
    var elemento=document.createElement("DIV"); 
    matrice.push(elemento);
    Y=(i-this.X1)/(this.X2-this.X1)*(this.Y2-this.Y1)+this.Y1
    Z=Y;
    //CALCOLO
    if(prevY!=null) {
     delta=Y-prevY;
     if(delta>1) {
      Z=Y-delta+1;
      H=delta;
     }
     if(delta<-1) H=-delta;
    }
   
    elemento.setAttribute("style","width:1px;height:"+H+"px;background-color:"+this.Colore+";position:absolute;left:"+i+"px;top:"+Z+"px;");
    prevY=Y;
    document.body.appendChild(elemento);
   }
  }
  else if(this.X1==this.X2){
   if(this.Y1<this.Y2){
    var e=Traccia(this.X1,this.Y1,1,Y2-this.Y1,this.Colore);
    matrice.push(e);
   }
   else if(this.Y1>this.Y2){
    var e=Traccia(this.X2,this.Y2,1,this.Y1-this.Y2,this.Colore);
    matrice.push(e);
   }
  }
  
  
 }
 this.traccia();
 
 this.cancella=function(){
  for(var n=0;n<matrice.length;n++){
   document.body.removeChild(matrice[n]);
  }
 }
} 

Nessun commento:

Posta un commento