/* Libreria Javascript della Parabola

Libreria Js per trovare i punti importanti della parabola

Vedere: http://www.elegio.it/javascript/
*/
//
// Dati i tre punti di controllo di Bézier
// determina i coefficienti della parabola
// espressa in forma parametrica, funzione
// di un parametro che quando vale zero
// specifica il punto Iniziale e quando
// vale 1 specifica il punto Terminale.
//
function faparametrica(I,M,T){
   var Ix,Iy,Mx,My,Tx,Ty,para;
   Ix=I[1];Iy=I[2];Mx=M[1];My=M[2];Tx=T[1];Ty=T[2];
   para=["Parabola parametrica ",
        ["Ascissa  ",Ix,2*(Mx-Ix),(Ix-2*Mx+Tx)],
        ["Ordinata ",Iy,2*(My-Iy),(Iy-2*My+Ty)]];
   return para;
   }
//
// Coordinate del punto in funzione del parametro:
//
function puntopara(para,p){
   return [p,para[1][1]+p*(para[1][2]+p*para[1][3]),
           para[2][1]+p*(para[2][2]+p*para[2][3])];
   } 
//
// Lunghezza dell'arco di parabola da un valore
// all'altro del parametro calcolata in modo 
// numerico effettuando np passi:
//
function lungarcoparanum(para,p1,p2,np){
    var j,pp,Pa,Pb,dx,dy,dista=0;
    Pa=puntopara(para,p1);
    for(j=1;np>=j;j++){
       pp=p1+(p2-p1)*j/np;
       Pb=puntopara(para,pp);
       dx=Pb[1]-Pa[1];
       dy=Pb[2]-Pa[2];
       dista+=Math.sqrt(dx*dx+dy*dy);
       Pa=Pb;}
    return dista;
    }
//
// Lunghezza dell'arco di parabola calcolata con una 
// formula matematica analitica...
//
function lindef(x,b2,aq){
    // Dai libri...
    var b,sq,ii;
    b=b2/2;
    sq=Math.sqrt(x*x+2*b*x+aq);
    ii=((aq-b*b)*Math.log(sq+x+b)+(x+b)*sq)/2;
    return ii;
    }
//
// Fa tutto...
//
function lungarcopara(para,p1,p2){
    var x1,x2,y1,y2;
    var rq,aq,b2,b,sq,x,i1,i2;
    x1=para[1][2];x2=para[1][3];
    y1=para[2][2];y2=para[2][3];
    rq=4*(x2*x2+y2*y2);
    aq=(x1*x1+y1*y1)/rq;
    b2=4*(x1*x2+y1*y2)/rq;
    b=b2/2;
    x=p2;
    sq=Math.sqrt(x*x+2*b*x+aq);
    i2=((aq-b*b)*Math.log(sq+x+b)+(x+b)*sq)/2;
    x=p1;
    sq=Math.sqrt(x*x+2*b*x+aq);
    i1=((aq-b*b)*Math.log(sq+x+b)+(x+b)*sq)/2;
    id=Math.sqrt(rq)*(i2-i1);
    return id;
    }
//
// 

Per trovare i punti notevoli della parabola

// // Costruisce la parabola polinomiale // usando i dati della parabola parametrica. // Fornisce anche i coefficienti per calcolare // il parametro che, usato nella espressione // parametrica, darebbe l'ascissa e l'ordinata // del punto specificato, posto sulla // parabola polinomiale. // La parabola polinomiale viene memorizzata // come una qualsiasi conica ma per essere una // parabola la conica deve avere il termine // misto legato in modo esatto ai due termini // di secondo grado. // Come terzo dato fornisce il coseno ed il // seno della rotazione della parabola. // function faparabola(para){ var x0,x1,x2,y0,y1,y2,rd,ta,tb; var cs,sn,a,b,c,p0=0,px=0,py=0; x0=para[1][1];x1=para[1][2];x2=para[1][3]; y0=para[2][1];y1=para[2][2];y2=para[2][3]; rd = 1/( 1.0e-100 + x2*x2 + y2*y2); ta = x2*y0 - y2*x0; tb = x2*y1 - y2*x1; a = rd*(ta*ta - tb*( x1*y0 - y1*x0 )); b = rd*(2*y2*ta - y1*tb ); c = rd*(x1*tb - 2*x2*ta ); rd = Math.sqrt(rd); cs = y2*rd; sn = -x2*rd; if(tb*tb>0){ p0 = -ta/tb; px = -y2/tb; py = x2/tb;} return ["Parabola polinomiale", ["Coefficienti ",a,b,c,cs*cs,2*sn*cs,sn*sn], ["Parametro ",p0,px,py], ["Rotazione ",cs,sn,false]]; } // function mostraparabola(para){ var ss="Parabola polinomiale", xbr="\u003cbr/\u003e"; ss+=xbr+"a = "+para[1][1]+xbr; ss+="b = "+para[1][2]+xbr; ss+="c = "+para[1][3]+xbr; ss+="d = "+para[1][4]+xbr; ss+="e = "+para[1][5]+xbr; ss+="f = "+para[1][6]+xbr; ss+="Coef.Parametro: p0 = "+para[2][1]+xbr; ss+="Coef.Parametro: px = "+para[2][2]+xbr; ss+="Coef.Parametro: py = "+para[2][3]+xbr; ss+="Rotazione: cs = "+para[3][1]+xbr; ss+="Rotazione: sn = "+para[3][2]+xbr; if(para[3][3]) ss+="Parabola RADDRIZZATA"+xbr; else ss+="Parabola NON raddrizzata"+xbr; return ss; } // function faparadritta(gpara){ var A,B,C,a,b,c,sn,cs; var dpara=["Parabola raddrizzata", ["Coefficienti ",0,0,1,0,0,0], ["Parametro ",0,0,0], ["Rotazprima ",0,0,true]]; a=gpara[1][1]; b=gpara[1][2]; c=gpara[1][3]; sn=gpara[3][2]; cs=gpara[3][1]; A=1/(b*sn-c*cs); B=(c*sn+b*cs)/(b*sn-c*cs); C=a/(b*sn-c*cs); dpara[1][1]=C; dpara[1][2]=B; dpara[1][4]=A; dpara[3][1]=cs; dpara[3][2]=sn; return dpara; } // function puntiparadritta(dp){ var dpara; var A,B,C,V,F,N,U,W; if(dp[3][3]) dpara=dp; else dpara=faparadritta(dp); A=dpara[1][4]; B=dpara[1][2]; C=dpara[1][1]; V=["V ",-B/(2*A),C-B*B/(4*A)]; F=["F ",-B/(2*A),C+(1-B*B)/(4*A)]; N=["N ",-B/(2*A),C-(1+B*B)/(4*A)]; U=["U ",-B/(2*A)+1/(2*A),C+(1-B*B)/(4*A)]; W=["W ",-B/(2*A)-1/(2*A),C+(1-B*B)/(4*A)]; return ["Xpraddrizzata ",V,F,N,U,W]; } // function mostrapunti(xpara){ var ss="Punti importanti della parabola ", xbr="\u003cbr/\u003e"; ss+=xpara[0]+xbr+xpara[1]+xbr; ss+=xpara[2]+xbr; ss+=xpara[3]+xbr; ss+=xpara[4]+xbr; ss+=xpara[5]+xbr; return ss; } // // Punti notevoli della parabola // function puntipara(gpara){ var j,cs,sn,pd=puntiparadritta(gpara); var punti=["PuntImportanti ", ["v "],["f "],["n "],["u "],["w "]]; cs=gpara[3][1]; sn=gpara[3][2]; for(j=1;6>j;j++){ punti[j][1]=pd[j][1]*cs-pd[j][2]*sn; punti[j][2]=pd[j][2]*cs+pd[j][1]*sn; } return punti; } // function saluto(){ // alert("Ciao !"); kontatore=0; } // //

Pilota la sperimentazione di questa libreria

// function calcola(assegna,risultati){ var j,Ix,Iy,Mx,My,Tx,Ty; var I,M,T,ppara,polpar,paradri,pundri,punt; var np=100,arcopan,arcopa; if(!Array.isArray(promemoria) ){ // alert("Inizializzo"); promemoria=[0]; listainput=document.getElementsByName(assegna);} if(!Array.isArray(promemorisulta) ){ // alert("Prima registrazione dei risultati"); promemorisulta=[0]; listarisultati=document.getElementsByName(risultati);} with(Math){ Ix=eval(listainput[0].value); Iy=eval(listainput[1].value); I=["Iniziale",Ix,Iy]; Mx=eval(listainput[2].value); My=eval(listainput[3].value); M=["Medio",Mx,My]; Tx=eval(listainput[4].value); Ty=eval(listainput[5].value); T=["Terminale",Tx,Ty]; } listarisultati[0].innerHTML="Marche da usare "+ listainput.length+" ("+kontatore+")\u003cbr/\u003eValori: I=["+ Ix+","+Iy+"] M=["+Mx+","+My+"] T=["+Tx+","+Ty+"] "; ppara=faparametrica(I,M,T); listarisultati[1].innerHTML=ppara; polpar=faparabola(ppara); listarisultati[2].innerHTML=mostraparabola(polpar); paradri=faparadritta(polpar); listarisultati[3].innerHTML=mostraparabola(paradri); pundri=puntiparadritta(paradri); listarisultati[4].innerHTML=mostrapunti(pundri); punt=puntipara(polpar); listarisultati[5].innerHTML=mostrapunti(punt); arcopan=lungarcoparanum(ppara,0,1,np); listarisultati[6].innerHTML= "Lunghezza dell'arco di parabola calcolato\u003cbr/\u003e"+ "numericamente facendo "+np+" passi = "+arcopan; arcopa=lungarcopara(ppara,0,1); listarisultati[7].innerHTML= "Esatta lunghezza dell' arco di parabola = "+arcopa; kontatore++; } /*
http://www.elegio.it/javascript/tutto-parabola.xhtml
*/