/*
*/ //*/ // 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