/* Usato da questo doc...
*/
//
// Seleziona la coppia di coordinate da usare per fare
// il disegno bidimensionale e memorizza il risultato
// nel vettore contenente i quattro punti necessari
// per costruire i due archi di parabola definiti con
// l'algoritmo di Bézier.
// Da notare che il secondo ed il quarto punto servono
// solo per definire la direzione di spostamento rettilineo
// ovvero tangenziale, dal primo e dal terzo punto e dunque 
// Pa, quando la fase vale 2, potrebbe essere non un punto 
// vicinissimo al punto 1 o, se la fase vale 4, un punto 
// vicinissimo al punto 3 , ma potrebbe anche essere la 
// velocita' possedute dalla particella nel primo o nel 
// terzo punto e quindi andrebbe aggiunto al valore del
// primo punto se la fase vale 2 o del terzo se
// la fase vale 4.
// ----
// Ho scelto questa impostazione per consentire, nel 
// caso di traiettorie tridimensionali, la creazione
// di disegni ovviamente bidimensionali, ottenuti
// "fotografando" gli spostamenti in x,y da un punto
// di vista a z infinito o gli spostamenti x,z da un 
// punto di vista a y infinito o gli spostamenti y,z
// da un punto di vista a x infinito.
//
function bidim(Pxy,Pa,fase){
   Pxy[fase]=["xy",Pa[1],Pa[2]];
   // alert(fase+") "+Pxy);
   return true; }
//   
// Ad ogni coppia di punti consecutivi associa due 
// archi di parabola fornendo i punti di controllo
// della quadrica di Bézier usata nella
// grafica SVG.
// Se la sequenza di punti viene interrotta ossia
// se un elemento della lista dei punti non e' un
// punto, la traiettoria viene considerata terminata
// e gli eventuali punti successivi servono a 
// definire una nuova traiettoria di un'altra particella.
//
function fatraiettoria(punti,fraz){
   var Q,j=0,nn=punti.length;
   var disegno=["Disegno "],nd=0;
   var fase=1,Pxy=["xy",[1],[2],[3],[4]];
   var dn,dx12,dy12,dx13,dy13,dx34,dy34;
   var Pix,Piy,P2x,P2y,P3x,P3y,P4x,P4y;
   if(2>nn) return disegno;
   for(j=1;nn>j;j++){
      if(Array.isArray(punti[j])){
          bidim(Pxy,punti[j],fase);
          if(fase==2){
             dx12=Pxy[2][1]-Pxy[1][1];
             dy12=Pxy[2][2]-Pxy[1][2];
             dn=Math.sqrt(dx12*dx12+dy12*dy12+1.e-100);
             dx12=dx12/dn;
             dy12=dy12/dn;
             Pix=Pxy[1][1];
             Piy=Pxy[1][2];
             nd++;disegno[nd]="M";
             nd++;disegno[nd]=[0,Pix,Piy];
             Q="Q";
             }
          else if(fase==4){
             dx34=Pxy[4][1]-Pxy[3][1];
             dy34=Pxy[4][2]-Pxy[3][2];
             dn=Math.sqrt(dx34*dx34+dy34*dy34+1.e-100);
             dx34=dx34/dn;
             dy34=dy34/dn;
             dx13=Pxy[3][1]-Pix;
             dy13=Pxy[3][2]-Piy;
             dn=fraz*Math.sqrt(dx13*dx13+dy13*dy13+1.e-100);
             P2x=Pix+dn*dx12;
             P2y=Piy+dn*dy12;
             P4x=Pxy[3][1]-dn*dx34;
             P4y=Pxy[3][2]-dn*dy34;
             P3x=(P2x+P4x)/2;
             P3y=(P2y+P4y)/2;
             Pix=Pxy[3][1];
             Piy=Pxy[3][2];
             nd++;disegno[nd]=Q;
             nd++;disegno[nd]=[0,P2x,P2y];
             nd++;disegno[nd]=[0,P3x,P3y];
             nd++;disegno[nd]=[0,P4x,P4y];
             nd++;disegno[nd]=[0,Pix,Piy];
             dx12=dx34;
             dy12=dy34;
             Q=" ";
             fase=2;
             }
          fase++;   
          }
      else fase=1;
      }
   return disegno;
   }
//
// Trasforma la traiettoria ad archi di parabola in una spezzata
//
function faspezzata(lista){
   var j,las=["Spezzata "],nn=lista.length;
   for(j=1;nn>j;j++){
       if(Array.isArray(lista[j]))las[j]=lista[j];
       else if(lista[j]=="Q")las[j]="L";
       else las[j]=lista[j];
       }
   return las;
   }
//
// Assegnata la lista dei punti da disegnare  
// ossia il disegno, fa in modo che le coordinate
// dei punti stiano in un rettangolo prescelto.
//
function inquadra(punti,width,height){
    var j,fa,xm,ym,nn=punti.length;
    var xmin=1.e100,xmax=-1.e100;
    var ymin=1.e100,ymax=-1.e100;
    var pnorma=["Punti inquadrati"];
    //
    for(j=1;nn>j;j++){
        pnorma[j]=punti[j];
        if(Array.isArray(punti[j])){
            xmin=Math.min(xmin,punti[j][1]);
            xmax=Math.max(xmax,punti[j][1]);
            ymin=Math.min(ymin,punti[j][2]);
            ymax=Math.max(ymax,punti[j][2]);
            }
        }
    //
    if(xmin>=xmax)return pnorma;
    fa=width/(xmax-xmin);
    xm=(xmax+xmin)/2;
    if(ymin>=ymax)return pnorma;
    fa=2*Math.min(fa,height/(ymax-ymin));
    ym=(ymax+ymin)/2;
    for(j=1;nn>j;j++){
        if(Array.isArray(pnorma[j])){
            pnorma[j][1]=Math.round(width+fa*(pnorma[j][1]-xm))/2;
            pnorma[j][2]=Math.round(height+fa*(pnorma[j][2]-ym))/2;
            }
        }
    return pnorma;
    }
//
// Trascrive la lista di punti e stringhe di controllo
// arrotondando le coordinate dei punti dato che e' inutile
// specificare frazioni di pixel...
//
function ntond(x){
   return (Math.round(2*x)/2);}
//
function fastringatonda(lista){
   var j,ss="",nn=lista.length;
   for(j=1;nn>j;j++){
       if(Array.isArray(lista[j])) ss+=
         ntond(lista[j][1])+" "+ntond(lista[j][2])+" ";
       else ss+=lista[j]+" ";
       }
   return ss;
   }
//
// Nota l'id del path da modificare, gli da' il disegno:
//
function cambiapath(idpath,disegno){
   var ilpath=document.getElementById(idpath);
   ilpath.setAttribute("d",disegno);
   }
//
// ===========================================================================
//
// Crea dati a caso ma tondi.
//
function tondo(n){
    var rr=Math.round(500*Math.random());
    return n+rr;
    }
//
var t=")Esempio ",z="Punto ",s="Salto ";
//
// Esempi di traiettorie...
//
var esempio1=[1+t,
   [z,-320,20],[z,230,20],[z,tondo(100),tondo(2600)],[z,tondo(300),tondo(2300)],
   [z,tondo(500),tondo(1400)],[z,tondo(700),tondo(1300)],
   [z,tondo(1400),tondo(400)],[z,tondo(800),tondo(2500)],[z,tondo(4700),tondo(1700)],
   [z,tondo(4900),tondo(1800)],
   s,
   [z,tondo(2800),tondo(1800)],[z,tondo(2600),tondo(1700)],[z,tondo(800),1900],
   [z,tondo(10),tondo(10)],
   s,
   [z,tondo(1800),tondo(10)],[z,tondo(1800),tondo(20)],[z,tondo(1600),tondo(1660)],
   [z,tondo(50),tondo(1700)], [z,tondo(10),tondo(1800)],[z,tondo(90),tondo(90)],
   [z,tondo(160),tondo(10)],[z,tondo(890),tondo(190)],[z,tondo(4690),tondo(20)],
   [z,tondo(4800),tondo(-590)]
   ];
//
var esempio2=[2+t,
   [z,20,20],[z,230,20],[z,tondo(100),tondo(600)],[z,tondo(300),tondo(1300)],
   [z,tondo(500),tondo(1400)],[z,tondo(700),tondo(1300)],
   [z,tondo(1400),tondo(400)],[z,tondo(800),tondo(1500)],[z,tondo(1700),tondo(1700)],
   [z,tondo(1800),tondo(1800)]
   ];
//
var esempio3=[3+t,[z,20,1000],[z,30,990],[z,3500,1000],[z,3510,1010]];
//
function ciao(pdove,dovepath){
    var lista=document.getElementsByName(pdove);
    var inquadrato,ddd;
    lista[0].innerHTML="Per disegnare coppie di archi di parabola";
    lista[1].innerHTML=esempio1;
    ddd=fatraiettoria(esempio1,1/4);
    lista[2].innerHTML="Senza delimitare le traiettorie : "+fastringatonda(ddd);
    inquadrato=inquadra(ddd,4000,2000)
    ddd=fastringatonda(inquadrato);
    lista[3].innerHTML="Passa questa al path: "+ddd;
    cambiapath(dovepath,ddd);
    cambiapath("l"+dovepath,fastringatonda(faspezzata(inquadrato)));
    }
/*
*/