function Coord(vetVertice)
{
   /*Private:*/

   /*Matrice RAW contenente [Vertice Originale]*/
   this.vett3D_originale = vetVertice;

   /*Matrice RAW contenente [Vertice Ruotato]*/
   this.vett3D_ruotato = new Array(3);

   /*Matrice Rotazionale contenente la "Storia" di tutte le rotazioni avvenute*/
   this.matrix_rotazionale = null;

   /*Metodo per la Moltiplicazione di 2 matrici*/
   /*Devono essere passate 2 matrici A,B. L'operazione sara' Mat_Rotazionale=(A*B)*/
   this.moltiplica_matrixs = Moltiplica_Matrici_Coord;

   /*Applica al Vertice Originale le Rotazioni descritte dalla Matrice Rotazionale*/
   /*L'operazione sara' vertice_ruotato=(Mat_Rotazionale*vertice_originale)*/
   this.applica_rotazioni = Applica_Rotazioni_Coord;

   /*Public:*/

   /*Matrice RAW contenente Vertice 2D ottenuto da Conversione 3D -> 2D*/
   this.vett2D = null;

   /*Matrice RAW contenente Vertice 3D ottenuto da Conversione 2D -> 3D*/
   this.vett3D = null;

   /*Metodo di Inizializzazione Vertice*/
   this.init = InitCoord;

   /*Metodo per Traslare il Vertice alle Coordinate XYZ*/
   this.traslaXYZ = traslaXYZCoord;

   /*Metodo per la rotazione del Vertice*/
   /*Devono essere passati un angolo e un tipo di operazione*/
   /*Se l'operazione e' 0 la rotazione viene eseguita come ultima rotazione*/
   /*Se l'operazione e' 1 la rotazione viene eseguita come prima rotazione*/
   this.ruotaX = ruotaXCoord; //attorno all'asse x
   this.ruotaY = ruotaYCoord; //attorno all'asse y
   this.ruotaZ = ruotaZCoord; //attorno all'asse z

   /*Metodo per la Conversione 3D -> 2D del Vertice*/
   /*Il risultato della conversione e' immesso in "vett2D"*/
   this.conv3D2D = conversione3D2D;

   /*Metodo per la Conversione 2D -> 3D del Vertice*/
   /*Deve essere passato un punto nel formato [x,y]*/
   /*Il risultato della conversione e' immesso in "vett3D"*/
   this.conv2D3D = conversione2D3D;

   /*Metodo che Ritorna il Punto di Vista*/
   /*Il risultato viene immesso in "vett3D"*/
   this.get_punto_di_vista = Ritorna_PV_Coord;
}

function InitCoord()
{
   /*Matrice RAW contenente [Vertice Ruotato]*/
   for(var i=0;i<3;i++) this.vett3D_ruotato[i] = this.vett3D_originale[i];

   /*Matrice Rotazionale contenente la "Storia" di tutte le rotazioni avvenute*/
   /*Inizializzo con Matrice Unita' 3x3*/
   this.matrix_rotazionale = new Array(3);
   for(var a=0;a<3;a++)
   {
      this.matrix_rotazionale[a] = new Array(3);
      for(var b=0;b<3;b++)
      {
         if(a == b) this.matrix_rotazionale[a][b] = 1;
         else this.matrix_rotazionale[a][b] = 0;
      }
   }

   /*Matrice RAW contenente Vertice 2D ottenuto da Conversione 3D -> 2D*/
   this.vett2D = null;

   /*Matrice RAW contenente Vertice 3D ottenuto da Conversione 2D -> 3D*/
   this.vett3D = null;
}

function Moltiplica_Matrici_Coord(matA,matB)
{
   var swap = new Array(3);
   for(var a=0;a<3;a++) 
   {
      swap[a] = new Array(3);
      for(var b=0;b<3;b++) swap[a][b] = 0;
   }

   for(var a=0;a<3;a++)
   {
      for(var b=0;b<3;b++)
      {
         for(var i=0;i<3;i++) swap[a][b] = swap[a][b] + matA[a][i]*matB[i][b];
      }
   }

   this.matrix_rotazionale = swap;
}

function Applica_Rotazioni_Coord()
{
   for(var i=0;i<3;i++) this.vett3D_ruotato[i] = this.vett3D_originale[0]*this.matrix_rotazionale[i][0] + this.vett3D_originale[1]*this.matrix_rotazionale[i][1] + this.vett3D_originale[2]*this.matrix_rotazionale[i][2];
}

function traslaXYZCoord(vettXYZ)
{
   this.vett3D_originale = vettXYZ;
}

function ruotaXCoord(omega,tipo)
{
   var SenOmega = Math.sin(Math.PI*omega/180);
   var CosOmega = Math.cos(Math.PI*omega/180);

   var mat = [[1,0,0],[0,CosOmega,-SenOmega],[0,SenOmega,CosOmega]];

   if(tipo == 0) this.moltiplica_matrixs(this.matrix_rotazionale,mat);
   else this.moltiplica_matrixs(mat,this.matrix_rotazionale);
}

function ruotaYCoord(omega,tipo)
{
   var SenOmega = Math.sin(Math.PI*omega/180);
   var CosOmega = Math.cos(Math.PI*omega/180);

   var mat = [[CosOmega,0,SenOmega],[0,1,0],[-SenOmega,0,CosOmega]];

   if(tipo == 0) this.moltiplica_matrixs(this.matrix_rotazionale,mat);
   else this.moltiplica_matrixs(mat,this.matrix_rotazionale);
}

function ruotaZCoord(omega,tipo)
{
   var SenOmega = Math.sin(Math.PI*omega/180);
   var CosOmega = Math.cos(Math.PI*omega/180);

   var mat = [[CosOmega,-SenOmega,0],[SenOmega,CosOmega,0],[0,0,1]];

   if(tipo == 0) this.moltiplica_matrixs(this.matrix_rotazionale,mat);
   else this.moltiplica_matrixs(mat,this.matrix_rotazionale);
}

function conversione3D2D()
{
   /*Applico Rotazioni descritte dalla Matrice Rotazionale*/
   this.applica_rotazioni();

   /*Procedura di Conversione*/
   var distPV=3000;
   var distPIANO=500;

   var t=(distPV-distPIANO)/(this.vett3D_ruotato[2]+distPV);
   var x2d=t*this.vett3D_ruotato[0];
   var y2d=t*this.vett3D_ruotato[1];

   this.vett2D = [x2d,y2d];
}

function conversione2D3D(punto)
{
   /*Procedura di Conversione*/
   this.vett3D = [punto[0],punto[1],-500];
}

function Ritorna_PV_Coord()
{
   this.vett3D = [0,0,-3000];
}