/*
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))); } /**/