/* Libreria utilifunzioni anche per SVG

Libreria per ampliare il documento e usare grafica SVG

*/
//
var utilifunzioni={versione:"Per aggiungere nuovi elementi: 20151020",
    contatore:0,idnome:"aggiunto"}
//
//  Amplia dinamicamente il documento HTML aggiungendo
//  le marche che si vogliono ed eventualmente 
//  con vari attributi...
//
utilifunzioni.aggiungiele=function(padre,iltipo,stringhinner){      
    var jat,figlio,listattributi=[["style","color:navy"]]; 
    if(arguments.length>3)listattributi=arguments[3];
    figlio = document.createElement(iltipo);
    for(jat=0;listattributi.length>jat;jat++){
       figlio.setAttribute(listattributi[jat][0],
                          listattributi[jat][1]);}
    utilifunzioni.contatore++;
    figlio.setAttribute("id",utilifunzioni.idnome+
              utilifunzioni.contatore);
    figlio.innerHTML=stringhinner;
    padre.appendChild(figlio);}
//
// Crea tanti elementi iframe
//
utilifunzioni.tantiframe=function(elpadre,listasiti){
    //
    // listasiti deve essere una array di stringhe
    // di indirizzi a cui si vuole puntare.
    // Si possono cambiare gli attributi di ogni iframe 
    // aggiungendo un terzo argomento facoltativo.
    //
    var jj,jat,lancora,arg,ilcentro,ilbr,ilframe,argiframe;
    argiframe=[["width","636"],["height","200"],
               ["style","background:ivory;"]]; 
    if(arguments.length>2){arg=arguments[2];
       if(arg.length>2)argiframe=arg;}
    for(jj=0;listasiti.length>jj;jj++){
        ilcentro=document.createElementNS(
           "http://www.w3.org/1999/xhtml","center");
        lancora=document.createElementNS(
           "http://www.w3.org/1999/xhtml","a");
        lancora.setAttributeNS(null,"href",listasiti[jj]);
        lancora.setAttributeNS(null,"target","alato");
        lancora.innerHTML=listasiti[jj];
        ilcentro.appendChild(lancora);
        ilbr=document.createElementNS(
           "http://www.w3.org/1999/xhtml","br");
        ilframe=document.createElementNS(
           "http://www.w3.org/1999/xhtml","iframe");
        for(jat=0;argiframe.length>jat;jat++){
           ilframe.setAttributeNS(null,
           argiframe[jat][0],argiframe[jat][1]);}
        ilframe.setAttributeNS(null,"src",listasiti[jj]);
        ilframe.innerHTML="Iframe non va!";
        ilcentro.appendChild(ilbr);
        ilcentro.appendChild(ilframe);
        elpadre.appendChild(ilcentro);
        }
    return listasiti.length;
    }
//
// Qui aggiunge un elemento SVG contenente un rettangolo
// e con possibilita' di fare link ad un indirizzo 
// voluto o standard.
// Il risultato e' il vettore degli id creati.
// Il n.0 e' quello del rect ossia il rettangolo.
// Il n.1 e' quello della a ossia l'aggancio.
// Il n.2 e' quello dell'elemento svg.
// 
utilifunzioni.aggiungisvg=function(padre){      
    var jat,figlio,arg,listattributi,firect,
        listarect,aggancio,xaggancio,laid=[];
    listattributi=[["width",50],["height",50],
        ["viewBox","0 0 100 100"]];
    if(arguments.length>1){arg=arguments[1];
      if(arg.length>1)listattributi=arg;}
    xaggancio="http://www.elegio.it/doc/";
    if(arguments.length>2){arg=arguments[2];
      if(arg.length>5)xaggancio=arg;}
    listarect=[["x",5],["y",5],
               ["width",90],["height",90],["fill","cyan"],
               ["stroke","red"],["stroke-width",5]]; 
    if(arguments.length>3){arg=arguments[3];
       if(arg.length>2)listarect=arg;}
    firect=document.createElementNS(
        "http://www.w3.org/2000/svg","rect");
    for(jat=0;listarect.length>jat;jat++){
       firect.setAttributeNS(null,listarect[jat][0],
                           listarect[jat][1]);}
    utilifunzioni.contatore++;
    laid[0]=utilifunzioni.idnome+utilifunzioni.contatore;
    firect.setAttributeNS(null,"id",laid[0]);
    aggancio=document.createElementNS(
        "http://www.w3.org/2000/svg","a");
    aggancio.setAttributeNS("http://www.w3.org/1999/xlink",
       "href",xaggancio);
    utilifunzioni.contatore++;
    laid[1]=utilifunzioni.idnome+utilifunzioni.contatore;
    aggancio.setAttributeNS(null,"id",laid[1]);
    aggancio.appendChild(firect);
    //
    figlio=document.createElementNS(
           "http://www.w3.org/2000/svg","svg");
    for(jat=0;listattributi.length>jat;jat++){
       figlio.setAttributeNS(null,listattributi[jat][0],
                          listattributi[jat][1]);}
    utilifunzioni.contatore++;
    laid[2]=utilifunzioni.idnome+utilifunzioni.contatore;
    figlio.setAttributeNS(null,"id",laid[2]);
    figlio.appendChild(aggancio);
    //
    padre.appendChild(figlio);
    return laid;
    }
//
// Aggiunge un elemento figlio dell'elemento padre
// che deve essere un svg.
// Gli attributi dell'eventuale terzo argomento
// vanno definti come coppie del nome dell'attributo 
// e suo valore. Per esempio:
// [["fill","red"],["d","M 15,25 l 100,130 -50,0 z"]]
// se chetipo vale "path" che ha l'attributo "d".
//
utilifunzioni.ampliasvg=function(elpadre,chetipo){
    //
    // chetipo deve essere un elemento figlio di svg
    // Per esempio un g contenuto in un svg.
    // Normalmente chetipo deve valere "path".
    // Se si usa un terzo argomento, viene usato
    // per definire gli attributi dell'elemento figlio.
    //
    var jat,arg,fipath,listapath,laid=[];
    listapath=[["fill","none"],["stroke","blue"],
               ["stroke-width",1],["d","M 5 5 L 500 500 "]]; 
    if(arguments.length>2){arg=arguments[2];
       if(arg.length>2)listapath=arg;}
    fipath=document.createElementNS(
           "http://www.w3.org/2000/svg",chetipo);
    for(jat=0;listapath.length>jat;jat++){
       fipath.setAttributeNS(null,listapath[jat][0],
                           listapath[jat][1]);}
    utilifunzioni.contatore++;
    laid[0]=utilifunzioni.idnome+utilifunzioni.contatore;
    fipath.setAttributeNS(null,"id",laid[0]);
    elpadre.appendChild(fipath);
    return laid;
    }
//

Per la grafica del path con spostamenti relativi

// Passa per i punti pari 0,2,4,6,...e smussa i dispari. // Ossia serve per passare da una spezzata lineare // ossia bisognera' premettere una "l" ( lineare ) // alla semispezzata quadrica, indicata da "q" // ossia con uso di archi di parabola. // La continuita' della curva deve essere ottenuta // usando dati appropriati del vettore di punti vp. // // Se si vuole usare la direttiva "q" bisogna obbligatoriamente // usare questa funzione, altrimenti si crea un pasticcio // perche' la direttiva "q" richiede DUE punti ma ENTRAMBI // riferiti al punto di partenza dell'arco parabolico. // Viceversa la direttiva "l" richiede UN SOLO punto // riferito ad punto di partenza del segmento lineare. // utilifunzioni.tondispari=function(vp){ var j,np,vr=[]; np=vp.length; for(j=0;np>j;j++)vr[j]=[vp[j][0],vp[j][1]]; if(np%2==1){vr[np-1][0]=vr[np-1][0]/2; vr[np-1][1]=vr[np-1][1]/2; vr[np]=[vr[np-1][0],vr[np-1][1]]; np++;} for(j=1;np>j;j+=2){ vr[j][0]+=vr[j-1][0]; vr[j][1]+=vr[j-1][1];} return vr; } // // Quadruplica ( quasi ) i punti di una spezzata lineare. // Si tratta di una funzione meno complicata dell'altra // che ha bisogno delle direzioni del primo e dell'ultimo // punto della spezzata. // utilifunzioni.quadripunti=function(v){ var j,k=2,qz=1.e-20; var jf,ss,vx,vy,xx,yy,rr,pa,pb,pm,w=[]; ss=Math.sqrt(v[0][0]*v[0][0]+v[0][1]*v[0][1]+qz); xx=v[0][0]+v[1][0]; yy=v[0][1]+v[1][1]; rr=0.25/Math.sqrt(xx*xx+yy*yy+qz); xx=xx*rr;yy=yy*rr; w[0]=[v[0][0]-xx*ss,v[0][1]-yy*ss]; w[1]=[xx*ss,yy*ss]; vx=xx;vy=yy; jf=v.length-1; for(j=1;jf>j;j++){ ss=Math.sqrt(v[j][0]*v[j][0]+v[j][1]*v[j][1]+qz); xx=v[j][0]+v[j+1][0]; yy=v[j][1]+v[j+1][1]; rr=0.25/Math.sqrt(xx*xx+yy*yy+qz); xx=xx*rr;yy=yy*rr; pa=[vx*ss,vy*ss]; pb=[v[j][0]-xx*ss,v[j][1]-yy*ss]; pm=[(pa[0]+pb[0])/2,(pa[1]+pb[1])/2]; w[k]=[pa[0],pa[1]]; w[k+1]=[pm[0]-pa[0],pm[1]-pa[1]]; w[k+2]=[pb[0]-pm[0],pb[1]-pm[1]]; w[k+3]=[v[j][0]-pb[0],v[j][1]-pb[1]]; vx=xx;vy=yy;k+=4; } ss=Math.sqrt(v[jf][0]*v[jf][0]+v[jf][1]*v[jf][1]+qz); w[k]=[vx*ss,vy*ss]; w[k+1]=[v[jf][0]-w[k][0],v[jf][1]-w[k][1]]; return w; } // // Dati i punti v della traiettoria e le sue direzioni // iniziali dini e finali dfin, quadruplica i punti // della traiettoria precalcolata in modo che poi // la si possa disegnare con archi di parabola // aggiustando i dati con la funzione tondispari. // Sia dini che dfin sono punti ossia coppie di // coordinate cartesiane che servono solo ad indicare // le direzioni e dunque possono essere messi a // distanza arbitraria dato che, appunto, // indicano solo la direzione a monte del punto // iniziale e a valle del punto finale. // utilifunzioni.xtrapunti=function(v,dini,dfin){ var j,k=0,qz=1.e-20; var jf,ss,vx,vy,xx,yy,rr,pa,pb,pm,w=[]; xx=dini[0];yy=dini[1]; rr=0.25/Math.sqrt(xx*xx+yy*yy+qz); vx=xx*rr;vy=yy*rr; jf=v.length-1; for(j=0;jf>j;j++){ ss=Math.sqrt(v[j][0]*v[j][0]+v[j][1]*v[j][1]+qz); pa=[vx*ss,vy*ss]; xx=v[j][0]+v[j+1][0]; yy=v[j][1]+v[j+1][1]; rr=0.25/Math.sqrt(xx*xx+yy*yy+qz); vx=xx*rr;vy=yy*rr; pb=[v[j][0]-vx*ss,v[j][1]-vy*ss]; pm=[(pa[0]+pb[0])/2,(pa[1]+pb[1])/2]; w[k]=[pa[0],pa[1]];k++; w[k]=[pm[0]-pa[0],pm[1]-pa[1]];k++; w[k]=[pb[0]-pm[0],pb[1]-pm[1]];k++; w[k]=[v[j][0]-pb[0],v[j][1]-pb[1]];k++; } ss=Math.sqrt(v[jf][0]*v[jf][0]+v[jf][1]*v[jf][1]+qz); pa=[vx*ss,vy*ss]; xx=dfin[0];yy=dfin[1]; rr=0.25/Math.sqrt(xx*xx+yy*yy+qz); vx=xx*rr;vy=yy*rr; pb=[v[jf][0]-vx*ss,v[jf][1]-vy*ss]; pm=[(pa[0]+pb[0])/2,(pa[1]+pb[1])/2]; w[k]=[pa[0],pa[1]];k++; w[k]=[pm[0]-pa[0],pm[1]-pa[1]];k++; w[k]=[pb[0]-pm[0],pb[1]-pm[1]];k++; w[k]=[v[jf][0]-pb[0],v[jf][1]-pb[1]]; return w; } // // Questa funzione consente di usare anche coordinate // polari ( raggio ed angolo ) invece che cartesiane. // Per attuare la trasformazione del punto dato in // coordinate polari bisogna definire il punto come // una array di una array ossia racchiudere la coppia // di coordinate in doppie parentesi quadre. // // L'angolo va dato in gradi ossia l'angolo retto e' 90. // Per esempio se scrivo: // [[25,-18],[-7,15],[[100,30]],[6,9],[23,17]] // la depolarizza considera in coordinate polari // il punto [[100,30]] con angolo di 30 gradi e lo // trasforma in coordinate cartesiane. // utilifunzioni.depolarizza=function(vet){ var j,k,r,w,el,nev,n=vet.length,vv=[]; for(j=0;n>j;j++){ if(Array.isArray(vet[j])){nev=vet[j].length; if(nev>1){vv[j]=[]; for(k=0;nev>k;k++)vv[j][k]=vet[j][k];} else {el=vet[j][0]; if(Array.isArray(el)){r=el[0]; // Se gli elementi sono almeno due // traduce da polari in cartesiane. if(el.length>1){w=Math.PI*el[1]/180; vv[j]=[r*Math.cos(w),r*Math.sin(w)];} else vv[j]=[[r]];} else vv[j]=[el];}} else vv[j]=vet[j];} return vv; } // // Una curva puo' essere fatta di varie linee di vario // tipo, spezzate lineari o quadriche e tra una curva // e l'altra ci possono essere salti o definizioni // di posizioni assolute, non relative. // La concarray concatena almeno 2 o piu' array alcune // delle quali contenenti eventualmente stringhe di // direttive tipo "M", "L", "Q", "m", "l", "q". // Naturalmente e' possibile usare anche dati numerici // in ogni strina ossia per esempio scrivere // "m 34,-47" per fare uno spostamento relativo al // punto finale della curva precedente. // utilifunzioni.concarray=function(ara,arb){ var conca,j,n=arguments.length; conca=ara.concat(arb); if(n>2)for(j=2;n>j;j++)conca=conca.concat(arguments[j]); return conca; } /*

AMEN LIBRERIA CREZIONE ELEMENTI VARI, SVG inclusi

*/ //