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