/*
/*
*/
//
function faparabola(M,C){
var cc=[":",(C[1]+M[1])/2,(C[2]+M[2])/2];
return ["Q",M[1],M[2],cc[1],cc[2] ];
}
//
function faparabolaf(M,C){
var cc=[":",C[1],C[2]];
return ["Q",M[1],M[2],cc[1],cc[2] ];
}
//
// Questa e' la funzione di esecuzione della curva
// basata sugli ARCHI DI PARABOLA.
//
function fadisegnop(ondulata,qualdisegno){
var j,n,nonfa,dopo,ild;
var ilpath=document.getElementById(qualdisegno);
n=ondulata.length;
ild=" M "+ondulata[1][1]+" "+ondulata[1][2]+" ";
dopo=false;
for(j=3;n>j;j+=1){
nonfa=(!Array.isArray(ondulata[j])) ||
(!Array.isArray(ondulata[j-1])) ;
if(!nonfa){
if(dopo){ild+=" M "+ondulata[j][1]+
" "+ondulata[j][2]+" ";
dopo=false;}
else if(j==n-1)ild+=prosvg(faparabolaf(
ondulata[j-1],ondulata[j]));
else if(!Array.isArray(ondulata[j+1])
)ild+=prosvg(faparabolaf(
ondulata[j-1],ondulata[j]));
else ild+=prosvg(faparabola(
ondulata[j-1],ondulata[j]));
}
else dopo=true;
}
if(ilpath.getAttribute("d")==null){
ilpath.innerHTML=ild;}
else ilpath.setAttribute("d",ild);
return ild;
}
/**/
//
// Questa e' la funzione fondamentale per gli ARCHI DI CERCHIO.
// Dati tre punti crea un vettore di lunghezza 8 che puo' essere
// o un segmento segnalato da L o un arco di cerchio
// segnalato da una A.
//
function facerchio(B,M,C){
var bx,by,brq,cx,cy,crq,dn,ox,oy,pr=0;
bx=B[1]-M[1];
by=B[2]-M[2];
brq=bx*bx+by*by;
cx=C[1]-M[1];
cy=C[2]-M[2];
crq=cx*cx+cy*cy;
dn=2*(by*cx-bx*cy);
if(dn>=0)dn=1/(dn+1e-9);
else dn=1/(dn-1e-9);
ox=(by*crq-cy*brq)*dn;
oy=(cx*brq-bx*crq)*dn;
rr=Math.ceil(64*Math.sqrt(ox*ox+oy*oy))/64;
if(rr>1000000)return [" L ",C[1],C[2] ];
if(ox*by>oy*bx)pr=1;
return [" A ",rr,rr,0,0,pr,C[1],C[2]] }
//
// Traduce in stringa usabile dal path un vettore di 8 elementi
//
function prosvg(vet){
var j,n,ss=" ";
if(Array.isArray(vet)){ n=vet.length;
for(j=0;n>j;j++)ss+=vet[j]+" ";}
return ss;
}
//
// Questa e' la funzione di esecuzione della curva
// basata sugli ARCHI DI CERCHIO.
//
function fadisegno(ondulata,qualdisegno){
var j,n,nonfa,dopo,ild;
var ilpath=document.getElementById(qualdisegno);
n=ondulata.length;
ild=" M "+ondulata[1][1]+" "+ondulata[1][2]+" ";
dopo=false;
for(j=3;n>j;j+=2){
nonfa=(!Array.isArray(ondulata[j])) ||
(!Array.isArray(ondulata[j-1])) ||
(!Array.isArray(ondulata[j-2])) ;
if(!nonfa){
if(dopo){ild+=" M "+ondulata[j][1]+
" "+ondulata[j][2]+" ";
dopo=false;}
else ild+=prosvg(facerchio(ondulata[j-2],
ondulata[j-1],ondulata[j]));
}
else dopo=true;
}
// ild+=" Z";
ilpath.setAttribute("d",ild);
return ild;
}
/**/
//
// Funzione analoga alla fadisegnop e alla fadisegno.
//
// Ma non disegna una curva ma disegna palline piu' o meno
// grandi attorno ai punti da usare per fare la curva.
//
function fapalline(ondulata,qualdisegno){
var j,n,nonfa,rr,ild;
var ilpath=document.getElementById(qualdisegno);
n=ondulata.length;
rr=3;
ild=" M "+(ondulata[1][1]-rr)+" "+ondulata[1][2]+
" a "+rr+" "+rr+" 0 0 0 "+(2*rr)+ " 0"+
" a "+rr+" "+rr+" 0 0 0 "+(-2*rr)+" 0 ";
rr+=0.75;
for(j=3;n>j;j+=2){
nonfa=(!Array.isArray(ondulata[j])) ||
(!Array.isArray(ondulata[j-1])) ||
(!Array.isArray(ondulata[j-2])) ;
if(nonfa)rr=3;
else{ild+=" M "+(ondulata[j][1]-rr)+" "+ondulata[j][2]+
" a "+rr+" "+rr+" 0 0 0 "+(2*rr)+ " 0"+
" a "+rr+" "+rr+" 0 0 0 "+(-2*rr)+" 0 ";rr+=0.5;
rr=Math.min(rr,12);
}
}
ilpath.setAttribute("d",ild);
return ild;
}
/**/
//
// Segue questa regola: ogni punto e' un vettore e, se usa
// gli archi di cerchio, usa i punti dispari come estremi
// dell'arco e i punti pari come punto interno di controllo.
// Come regola generale non usa mai l'elemento zero di
// un vettore e l'elemento 1 e' l'ascissa e il 2
// e' l'ordinata.
// Questa convenzione la uso per potere lavorare
// facilmente anche in tre o quattro dimensioni e potere
// disegnare sempre solo le prime due coordinate
//
// FUNZIONI DI SERVIZIO PER APPLICARE QUESTA CONVENZIONE
//
// Funzione per convertire il vettore di punti
// multidimensionali con eventuli interruzione di punti
// in un vettore di coordinate bidimensionali
// senza interruzione di punti.
//
function invettorezz(multidim){
var j,k=0,n,vet=[];
n=multidim.length;
for(j=0;n>j;j++){
if(Array.isArray(multidim[j])){
vet[k]=multidim[j][1];k++;
vet[k]=multidim[j][2];k++;
}
}
return vet;
}
//
// Funzione per convertire un vettore di coordinate solo
// bidimensionali in un vettore di punti multidimensionali
// che in questo caso sono anche loro bidimensionali.
//
function davettorezz(vet,scala){
var j,k=1,multidim=["Puntimultidim"];
n=vet.length;
for(j=1;n>j;j+=2){
multidim[k]=[" ("+(k-1)+") ",
scala*vet[j-1],scala*vet[j]];
k++;}
return multidim;
}
//
// Cambia la scala del disegno :
// vxmax e vymaz sono le dimensioni della immagine SVG
//
function scala(ond,xsca,ysca,vxmax,vymax){
var j,sx,sy,dsx,dsy,frid=0.95,xmin=1.e9,ymin=1.e9;
var xmax=-1.e9,ymax=-1.e9,n=ond.length,sond=[];
for(j=0;n>j;j++){
if(Array.isArray(ond[j])){
x=ond[j][1]*xsca;
y=ond[j][2]*ysca;
xmin=Math.min(x,xmin);
xmax=Math.max(x,xmax);
ymin=Math.min(y,ymin);
ymax=Math.max(y,ymax);
sond[j]=
[ond[j][0],ond[j][1]*xsca,ond[j][2]*ysca];
}
else sond[j]=ond[j];
}
sx=frid*(1+Math.floor(16*(vxmax/(xmax-xmin+0.00001)-1))/16);
sy=frid*(1+Math.floor(16*(vymax/(ymax-ymin+0.00001)-1))/16);
dsx=vxmax/2-sx*(xmax+xmin)/2;
dsy=vymax/2-sy*(ymax+ymin)/2;
//
for(j=0;n>j;j++){
if(Array.isArray(sond[j])){
sond[j]=
[sond[j][0],Math.round(16*(sond[j][1]*sx+dsx))/16,
Math.round(16*(sond[j][2]*sy+dsy))/16];
}
}
//
return sond;
}
//
/**/
//
// Qui definisco una funzione che genera una sinusoide
// amplificata da una funzione esponenziale e leggermente
// perturbata da un rumore cositituito da una aggiunta random...
//
// In questo modo ogni volta che la funzione viene chiamata
// si ottiene una curla leggermente diversa...
//
// Esempio di vettore per punti multidimensionali.
//
var ond=["Ondulata",[" 1) ",400,75],
[" 2) ",775,450],[" 3) ",400,825],
[" 4) ",665,715],[" 5) ",775,450]];
//
// Per mettere a punto le funzioni di disegno dell'arco
// definisco questa funzione piuttosto balorda ma utile
// per mettere alla prova le varie opzioni.
//
function provaondulatoria(xnpassi){
var j,tt,xx,yy,npassi,incre,ond=["Ondula"];
npassi=2*Math.round(xnpassi);
// alert("Fa "+npassi+" passi");
incre=1200/(npassi/3.7);
for(j=1;npassi>j;j++){
tt=(j-1)*(Math.PI/12);
xx=20+incre*tt;
xx=Math.round(32*xx)/32;
yy=450+50*Math.exp(tt*0.07)*Math.sin(tt)+10*Math.random();
yy=Math.round(32*yy)/32;
if(j%20==0) ond[j]=" (salto) ";
else ond[j]=[" ("+(j-1)+") ",xx,yy];}
return ond;
}
//
var d_esempio="M 100 100 "+
"a 60 60 0 0 0 120 0 a 60 60 0 0 0 -120 0" ;
//
var questaversione=["20140914","Archi di parabola e di cerchio" ];
/*-*/