function rr(q){return Math.floor(Math.random()*q);}
var z=document.getElementById("can").getContext("2d");
var DD = z.getImageData(0,0,w,h);
z.putImageData( DD, 0,0);
DEFSNG MS(44100*10)
DEFLNG xmin,xmax
DEFSNG ph,xph' tLL function de Tracé spectral
sub tLL( X as single, Y as single, X1 as single, Y1 as single, V as single, iph as single)
DEFSNG by,t,gg,vv,fr,lenn = ABS((X1-X)*44100)
if lenn>=3 AND X>=0 AND X1>=0 then
ph=iph
if X < xmin then xmin = X
if X1< xmin then xmin = X1
if X > xmax then xmax = X
if X1> xmax then xmax = X1
if X>X1 then
gg=X1: X1=X: X=gg
gg=Y1: Y1=Y: Y=gg
ph+=X-X1
end if
xph = X
gg = (Y1-Y)/(X1-X) /2
X = INT(X*44100)
X1 = INT(X1*44100)
FOR uu = X to X1
t = uu/44100 - xph
fr = gg*(t-ph) + Y
vv = v/lenn*(uu-X)
vv = vv/lenn*(X1-uu)
by = (t+ph)*fr *PI2
by = sin(by) *vv
MS(uu) = MS(uu)+ by *10000
NEXT
end if
end sub
(http://pixeljoint.com/pixels/images/smile/pie/love.gif)
sub creatfile'16bits
File.Open( solva & ".WAV" , fmC)
DEFLNG DURATION = xmax-xmin'en seconde
PRINT STR$(DURATION)&" s"
DEFLNG SAMPLERATE = 44100
DEFLNG DSDS = DURATION * SAMPLERATE
DEFSTR riffid = "RIFF" : File.Write(riffid) '4)
DEFLNG riffsize = DSDS * 2 + 36 : File.Write(riffsize) '4)
DEFSTR waveid = "WAVE" : File.Write(waveid) '4)
DEFSTR chunkid = "fmt " : File.Write(chunkid) '4)
DEFLNG chunksize = 16 : File.Write(chunksize) '4)
DEFSHORT formatt = 1 : File.Write(formatt) ' 2)
DEFSHORT channels = 1 : File.Write(channels) ' 2)
DEFLNG samplerat = SAMPLERATE : File.Write(samplerat) '4)
DEFLNG bytespersec = SAMPLERATE * 2 : File.Write(bytespersec) '4)
DEFSHORT blockalign = 2 : File.Write(blockalign) ' 2)
DEFSHORT bitspersample = 16 : File.Write(bitspersample) ' 2)
DEFSTR dataid = "data" : File.Write(dataid) '4)
DEFLNG datasize = DSDS * 2 : File.Write(datasize) '4)
uu = INT( xmin * SAMPLERATE )
FOR rr = 0 to DSDS
SS = INT(MS(rr+uu))
File.Write(SS)
NEXT
File.CLOSE
end sub
DEFLNG DURATION = INTmax(xmax-xmin)
uu = INT( xmin * SAMPLERATE )
milt=0
FOR rr = 0 to DSDS-1
cc = ABS(MS(rr+uu))
if cc>milt then milt = cc
NEXT
milt = 32767/milt
PRINT " Amplitude * " & STR$(milt)
PRINT " Duree " & STR$(DURATION)&" s "
FOR rr = 0 to DSDS-1
cc = MS(rr+uu)*milt
SS = moy(cc)
File.Write(SS)
NEXT
float voox(float t){
float ti,gg,fr,yi,by;
float x,y,xy;
yi = 40000;
int i,xi;
int dur = 10*SAMPLERATE*400; //10s
float ptrt[11*SAMPLERATE];//matrix de reconstitution matérielle par over intération d'une courbe
for(i=0; i<=11*SAMPLERATE; i++){ ptrt[i] = 10000000; }
for(i=0; i<=dur; i++){
ti = (float)i;
ti = ti/dur*2*PI;
/*x = cos(ti*1.5)*2+2.5;
y = sin(ti*3)*1000;*/
/*x = cos(ti)*cos(ti*4)*2+2.5;
y = sin(ti)*cos(ti*4)*10000;*/
/*x = cos(ti)*2+2.5;
y = sin(ti)*1000;*/
x = cos(ti*21)*5+6;
y = sin(ti*22)*10000;
fr = ( y + yi );
by = sin( x*fr )*.1;
xi = (int)(x*SAMPLERATE);
if ( ptrt[xi] >= i+500000 || ptrt[xi] <= i-500000 ){
ptrt[xi] = i;
ptrg[xi] = ptrg[xi] + (short)( by * 10000 ) ;
}
}
for(i=0; i<=11*SAMPLERATE; i++){ ptrt[i] = -10000000; }
for(i=0; i<=dur; i++){
ti = (float)i;
ti = ti/dur*2*PI;
x = cos(ti*23)*5+6;
y = sin(ti*24)*10000;
fr = ( y + yi );
by = sin( x*fr )*.1;
xi = (int)(x*SAMPLERATE);
if ( ptrt[xi] >= i+500000 || ptrt[xi] <= i-500000 ){
ptrt[xi] = i;
ptrd[xi] = ptrd[xi] + (short)( by * 10000 ) ;
}
}
}
sub voox
PRINT " voox algo de reconstitution d'onde"
DEFSNG t,gg,by, x,y,xy,xd,xp
DEFLNG iz=0,i,xi'LNG
DEFSNG dur = 50 *44100
DEFSNG ptrt(44100*20)'tableau de premier point de reconstitution
xmin = 5
xmax = 7
FOR i=0 to 44100*20-1
ptrt(i) = -5000
NEXT
FOR i=1 to dur
t = i/dur*PI2
x = cos(t*21)'*2
xd = -sin(t*21)*21 'deriver cos(nx) est -sin(nx)*n
xp = sin(t*21)/21 'primitive cos(nx) est sin(nx)/n
xi = moy((x+6)*44100)'INT(
if ptrt(xi) < i-1000 then'ptrt(xi) > i+500 or
y = 1500 - sin(t*22)*100
by = sin( y*PI2*x )' >_< t*10
ptrt(xi) = i
MS(xi) = MS(xi)+ by *1000
end if
if iz <> INT(i/44100) then
iz = INT(i/44100)
LOCATE 3,40: PRINT STR$(iz)
end if
NEXT
end sub
function para(q){
/*return new vect2( ( Math.cos(q*21) )*scal+wd ,//carre grillage
( Math.sin(q*22) )*scal+hd );
return new vect2( ( Math.cos(t) )*scal+wd ,//cercle
( Math.sin(t) )*scal+hd );
return new vect2( ( Math.cos(t)*Math.cos(t*5) )*scal+wd ,//fleur
( Math.sin(t)*Math.cos(t*5) )*scal+hd );
return new vect2( ( Math.cos(t*1.5) )*scal+wd ,//sign infini
( Math.sin(t*3)/2 )*scal+hd );
return new vect2( ( Math.cos(t)-Math.cos(60*t)*Math.sin(t) )*scal+wd ,//chauson au pomme
( Math.sin(t)-Math.sin(60*t)*Math.cos(t) )*scal+hd );
return new vect2( ( Math.cos(t*11)-Math.cos(t*22)*Math.sin(t*20) )*scal+wd ,//visage
( Math.sin(t*11)-Math.sin(t*21)*Math.cos(t*20) )*scal+hd );
return new vect2( ( Math.cos(t*40)*t*t )*scal+wd ,//cercau
( Math.sin(t*40)*t*t )*scal+hd );
return new vect2(//câble_telephonique
( Math.sin(t*4)*(1+ .5*Math.sin(t*5) )+ Math.sin(t*100)*( Math.sin(t*101) )*.1 )*scal+wd ,
( Math.cos(t*4)*(1+ .5*Math.sin(t*5) )+ Math.cos(t*100)*( Math.sin(t*101) )*.1 )*scal+hd );*/
td = 1/dur*PI2
FOR i=1 to dur
t = i/dur*PI2
x = cos(t)*2
y = sin(t)*2
x1 = cos(t+td)*2
y1 = sin(t+td)*2
gg = deriv(x,y,x1,y1)
co = 50000;//iteration
var v = new vect2(0,0),
v1 = new vect2(0,0),
g=0,g1=0,t,al=1,//alternateur de la primitiv
pr1=0,pr2=0, delta=1/co*PI2;
v1 = para(0);
v = para(1*delta);
g = deriv(v1.x,v1.y, v.x,v.y);
drawLine(v1.x,v1.y, v.x,v.y,1);
pr1 = v.y*(v1.x-v.x) + pr2;
pr2=pr1;
g1=g;
v1.x=v.x;
v1.y=v.y;
for(i=2;i<=co;i++){
t = i*delta;
v = para(t);
drawLine(v1.x,v1.y, v.x,v.y,1);//courbe
g = deriv(v1.x,v1.y, v.x,v.y);
if( Math.abs(g-g1)<20){
drawLine(v1.x,g1, v.x,g,0);//deriv
}
if(al*v1.x<al*v.x){pr2=0;al=-al;}
pr1 = v.y*(v1.x-v.x) + pr2;
drawLine(v1.x,pr2, v.x,pr1,2);//primitiv
k = -deriv(v1.x,pr2, v.x,pr1);
drawLine(v1.x,k, v.x,k,3);// deriver de la primitive pr testé
pr2=pr1;
g1=g;
v1.x=v.x;v1.y=v.y;
}
sub voox2'solution trouver à exactement 5min du mat1 le 8/05/2016
PRINT " Voox algo de reconstitution d'onde"
DEFDBL i,xi,t,td,gg,by, x,y,x1,y1, pr1,pr2,al=1
DEFSNG dur = 50 *44100 , scalY=500,Yp=3,Xp=6
DEFSNG xold=-1'évite de réécrir sur le point précédéant
xmin = 4 : xmax = 8
td = 1/dur*PI2 : t = 0
x1 = cos(t*21)*2+Xp
y1 = sin(t*22)*2+Yp
y1 = y1*scalY
FOR i=1 to dur
t = i*td
x = cos(t*21)*2+Xp
y = sin(t*22)*2+Yp
y = y*scalY
'gg = deriv(x,y,x1,y1)
if al*x1 < al*x then
pr2 = 0
al = -al
end if
pr1 = y*(x1-x) + pr2'primitive
pr2 = pr1
x1 = x : y1 = y
xi = INT(x*44100)'moy
if xi <> xold and xi >= 0 then
by = sin( -pr1*PI2 )'+t évite ls escaliers possible,
xold = xi
MS(xi) = MS(xi)+ by *1000
end if
if i MOD 44100 = 1 then'progression
LOCATE 3,40 : PRINT STR$( INT(i/44100)+1 )
end if
NEXT
end sub
function deriv( X as double, Y as double, X1 as double, Y1 as double)as double
DEFDBL jj=0
if X<>X1 then
if X>X1 then
jj=X1: X1=X: X=jj
jj=Y1: Y1=Y: Y=jj
end if
jj = (Y1-Y)/(X1-X) /2
end if
deriv = jj
end function
/* code JavaScript
function deriv(a,b){
if( a.x!=b.x ){
if( a.x>b.x ){ return = (a.y-b.y)/(a.x-b.x)
}else{ return = (b.y-a.y)/(b.x-a.x) }
}else{ return 1000000}
}
*/
////
if xi <> xold and xi >= 0 then
gg = deriv(x,y,x1,y1)/500
if i-1 <ml then'v = '(i MOD 10000)/10000'(i/dur)/dur*(dur-i)
v = (i-1)/ml
elseif i> dur-ml then
v = 1-(i-(dur-ml))/ml
else
v = 1
end if
v = v/(1+gg*gg)
by = sin( -pr1*PI2 ) *v
function voox(mu,xp,yp,sx,sy){//voox(10000, 2,2 ,2,100)//iteration position x,y scal x,y
var v=0,i=0,xi=0,t=0,g=0, pr=0,al=1,
dur = mu*SPLR ,ml=mu*1000,xold=-1,
td = PI2 /dur,
a,b ,vp = new vect2(xp,yp), scal = new vect2(sx,sy);//position
a = echl(para(t) ,vp,scal);
for( i=1; i<=dur; i++){
t = i*td;
b = echl(para(t) ,vp,scal);//calcule du point paramétrique
if(al*a.x < al*b.x){
pr = 0;
al *= -1;
}
pr += b.y*(a.x-b.x);//primitive
xi = splat(b.x);
if( xi != xold && xi >= 0 ){
g = deriv(b,a)/200;//deriver
v = marg(i,ml,dur) /(1+g*g);
sin_out(xi,pr,v);
xold = xi;
}
a=b;
}
}
function sign(x){ if(x<0){ return -1 }else{ return 1 }}
var PIcarr = PI*PI/4;
function ocil_out(i,f,v){
var t = f*PI2;
//var sinu = Math.sin(t);
//var triangl = Math.asin(Math.sin(t))*2/PI;
//var carr = Math.tanh(Math.sin(t)*10);//*1000
var cercl = Math.asin(Math.sin(t));
cercl = sign(Math.cos(t))*Math.sqrt( PIcarr - cercl*cercl )*2/PI;
MS[i] += cercl*v;
}
function espac(a,w,h){//a = "can"
this.el = document.getElementById(a);
this.z = this.el.getContext("2d");
this.el.width = w; this.w = w; this.wd = w/2;
this.el.height= h; this.h = h; this.hd = h/2;
this.bg = function(c){//arrière plant
this.z.fillStyle=c;
this.z.fillRect(0,0,this.w,this.h);
}
}
var U = new espac("can",1000,1000);
/// ////
function effect(co,vari){// co=500//iteration
plan(10);
var i,//vari = (PI/3*4),//PI2;
a,b, g,g1, p=new vect2(0,0),p1=new vect2(0,0), //vecteur courb deriv et rpimitiv
t=0,al=-1,//alternateur de la primitiv
delta = vari/co;
b = para(0);
a = para(delta);
g1 = new vect2(a.x, deriv(b,a));
drawLine(b,a,1);
p1 = new vect2(a.x, p1.y+ a.y*(b.x-a.x) );
b=a;
for(i=2;i<=co;i++){
t = i*delta;
a = para(t);
drawLine(a,b,1);//courbe
g = new vect2(a.x, deriv(b,a));
if( Math.abs(g.y-g1.y)<20){
drawLine(g1,g,0);//deriv
}
if(al*b.x<al*a.x){
p.y = 0;
al *= -1;
}
p = new vect2(a.x, p.y+ a.y*(b.x-a.x) );
drawLine(p1,p,2);//primitiv
/*k = -deriv(p,p1);
drawLine(b.x,k, a.x,k,3);// deriver de la primitive */
b=a; g1=g; p1=p;
}
}
function c(x){ return x*x}
function Vdistenc(a,b){ return Math.sqrt( c(a.x-b.x) + c(a.y-b.y) ) }
var centre = new vect2(0,0),di=0;
function volum_espac(v){//veteur position
//return Math.abs(Math.cos( Vdistenc( v, centre)*5 )) ;//cercle onduler
di = (Vdistenc( v, centre)-0.5)*20;
return 1/(1+di*di*di*di) ;
}
/// ////
v = v* volum_espac(para(t));//sans l'echel
var PI = 3.141592653589793238462643383,
PI2 = 6.28318530717959;
function vect2(x,y){[this.x,this.y]=[x,y]}
function v_(x,y){return new vect2(x,y)}//reduit l'expression, possibiliter deviter le new
function sign(x){ if(x<0){ return -1 }else{ return 1 }}
function rf(x){ return Math.random()*x}//random float
function c(x){ return x*x}
function gaus(x,n){
switch(n){
case 1: return 1/(1+x*x); break;
case 2: return 1/(1+x*x*x*x); break;
case 3: return 1/(1+x*x*x*x*x*x); break;
}
}
function Vdistenc(a,b){ return Math.sqrt( c(a.x-b.x) + c(a.y-b.y))}
function deriv(a,b){
if( a.x!=b.x ){
if( a.x>b.x ){ return (a.y-b.y)/(a.x-b.x)
}else{ return (b.y-a.y)/(b.x-a.x) }
}else{ return 1000000}
}
var SPLR = 44100, PIcarr = PI*PI/4;
function fad(X,Y){ return (X/Y)/Y*(Y-X)}//fading volum début et fin de X sur [0;Y]
function splat(X){ return Math.floor(X*SPLR)}//temps en samplerat entier
function echl(v,vp,s){ return new vect2(v.x*s.x+vp.x,(v.y+vp.y)*s.y)}//mise à l'echelle du vecteur
function marg(i,m,d){//marge de debut et de fin du volum
var v = 1;
if( i-1 < m ){//v = (i MOD 10000)/10000
v = (i-1)/m;
}else if( i > d-m ){
v = 1-(i-(d-m))/m;
}
return v;
}
function para(t){
var x=0,y=0;
x = Math.asin(Math.cos(t))*2/PI;//losange
y = Math.asin(Math.sin(t))*2/PI;
//x = Math.sin(t*11);//grille
//y = Math.sin(t*10);
//x = Math.cos(t*21)*1.9;
//y = Math.sin(t*20)*2;
//x = Math.cos(t)-Math.cos(200*t )*Math.sin(t);
//y = Math.sin(t)-Math.sin(202*t )*Math.cos(t*2);
//x = Math.sin(t*5)*(1+ .9*Math.sin(200.2*t*5) )*2;
//y = Math.cos(t*5)*(1+ .9*Math.sin(200.2*t*5) );
//x = Math.cos(t)-Math.cos(4000*t )*Math.sin(t/2)*2;
//y = Math.sin(t)-Math.sin(4000*t -PI/2)*Math.cos(t/2);
//x = Math.sin(t);//coeur sur PI2
//x = x*x*x;
//y = (Math.cos(t) + Math.cos(t)*Math.cos(t)*Math.cos(t)*Math.cos(t));
//x = Math.cos(t*1.5);//sign infini sur (PI/3*4)
//y = Math.sin(t*3)/2;
return new vect2(x,y);
}
function WAV_specto(du,ca){
/*
duré, cannal[ 1mono 2stereo]
organe de [analyse , conception, structuration]
*/
this.du = du;
this.ca = ca;//géré lécriture disocier des 2 canal
this.DSDS = SPLR*du;
this.MS = new Array(this.DSDS);
for(var p=0;p<this.DSDS;p++){this.MS[p]=0;}//clear
this.out_str = function(){
var i=0,m=0,x=0;
for(i=0;i<this.DSDS;i++){
x = Math.abs(this.MS[i]);
if( x>m ){ m = x}
}
if( m>0 ){ m = 32767/m}
var txt="\n"+this.du+"\n";
for(i=0;i<this.DSDS;i++){
txt = txt + Math.floor( this.MS[i]*m ) + "\n";
}
return txt;
}
this.ocil_out = function(i,f,v){
var t = f*PI2;
var ondul = Math.cos(Math.sin(t)*4);
//var sinu = Math.sin(t);
//var triangl = Math.asin(Math.sin(t))*2/PI;
//var carr = Math.tanh(Math.sin(t)*10);
//var cercl = Math.asin(Math.sin(t));
// cercl = sign(Math.cos(t))*Math.sqrt( PIcarr - cercl*cercl )*2/PI;
this.MS[i] += ondul*v;//cercl*v;
}
this.sin_out = function(i,f,v){//sin de frequence et écrit à position i
this.MS[i] += Math.sin(f*PI2)*v
}
this.t = function( X, Y, X1, Y1, V, iph){// Tracé ligne spectral
var ph=0,xph=0,i=0,t=0,g=0,vv=0,fr=0,
ln=Math.abs(splat(X1-X));
if( ln>=3 && X>=0 && X1>=0 ){
ph = iph;
if( X>X1 ){
[X,X1,Y,Y1]=[X1,X,Y1,Y];
ph += X-X1;
}
g = (Y1-Y)/(X1-X) /2;
[xph,X,X1]= [X,splat(X),splat(X1)];
for( i=X; i<=X1; i++ ){
t = i/SPLR - xph;
fr = g*(t-ph) + Y;
vv = V*fad(i-X,ln);
this.sin_out(i,(t+ph)*fr ,vv);
//this.ocil_out(i,(t+ph)*fr ,vv);
}
}
}
this.volum_espac = function(v){//veteur position
//return Math.abs(Math.cos( Vdistenc( v, centre)*5 ));//cercle onduler
return gaus( (Vdistenc( v, v_(0,0) )-0.5)*20 ,2);
}
this.voox = function(mu,xp,yp,sx,sy,vari){//iteration position x,y scal x,y variation PI2
var v=0,i=0,xi=0,t=0,g=0, pr=0,al=1,
dur = mu*SPLR ,ml=mu*100,xold=-1,
td = vari /dur,//(PI/3*4)
a,b ,vp = v_(xp,yp), scal = v_(sx,sy);//position
a = echl(para(t) ,vp,scal);
for( i=1; i<=dur; i++){
t = i*td;
b = echl(para(t) ,vp,scal);//calcule du point paramétrique
if(al*a.x < al*b.x){ [pr, al]=[0, -al] }//alternateur de la primitive
pr += b.y*(a.x-b.x);//primitive
xi = splat(b.x);
if( xi != xold && xi >= 0 ){
g = deriv(b,a)/200;//deriver
v = marg(i,ml,dur) /(1+g*g);
//v *= this.volum_espac(para(t));//sans l'echel
this.sin_out(xi,pr,v);
xold = xi;
}
a=b;
}
}
}
// /// code procédural
var W = new WAV_specto(10,1);//10s , mono
var txt="\n"+"WAV"+"\n"+ //départ détection
this.du+"\n"+ //duré
this.ca+"\n"; //channel
for(i=0;i<this.DSDS;i++){
x = Math.floor( this.MS[i]*m );
if( x==old ){ txt += "\n"}
else{ txt += x + "\n"}
old=x;
}
return txt;
var AudioContext = window.AudioContext || window.webkitAudioContext,
A = new AudioContext(),S,
AudioB = A.createBuffer(this.ca, this.DSDS, SPLR);
//S.loop = true;
this.playson = function(){
S = A.createBufferSource();
S.buffer = AudioB;
S.connect(A.destination);
S.start(0);//start(0,position);
}
this.pauseson = function(){
S.stop(0);
}
//function cree(){
// var B = AudioB.getChannelData(0);//channel 0 = mono, 1 deuxième piste stéréo
// for(var i=0; i<this.DSDS; i++){
// B[i] = (Math.random()*2-1)*0.1;
// }
//}
<button onclick="pp();" id="bbu">Play</button>
// ///
var buttonpp = 1;
function pp(){
buttonpp *= -1;
if( buttonpp==1 ){
W.pauseson();
PRINT("bbu" ,"Play");
}else{
W.playson();
PRINT("bbu" ,"Pause");
}
}
#texty{
display: none;
}
function imgebuffer(n,a){
//chargement capricieux marche une fois sur 2
var el = document.getElementById(n);
var z = el.getContext("2d");
var II = new Image();
II.src = a;
//II.onload //onload foireux :(
this.B=function(){//Bufferisation dans M
this.w = II.width;
this.h = II.height;
this.wd = this.w/2;
this.hd = this.h/2;
el.width = this.w;
el.height= this.h;
z.canvas.width = this.w;
z.canvas.height= this.h;
this.M = new Array(this.w);
for(var p=0;p<this.w;p++){this.M[p] = new Array(this.h)}
//for(var p=0;p<this.w;p++){for(var q=0;q<this.h;q++){ this.M[p][q] = new Array(3) }}
//this.z.fillStyle="#000";
//this.z.fillRect(0,0,this.w,this.h);
z.drawImage(II,0,0);
var D = z.getImageData(0,0,this.w,this.h);
var r,u,j,k, x,y;
for(j=0; j<D.data.length; j+=4){
k = j/4;
u = Math.floor(k/this.w);
r = k%this.w;
this.M[r][u]=D.data[j]/255;
//this.M[r][u][1]=D.data[j+1]/255;
//this.M[r][u][2]=D.data[j+2]/255;
}
}
this.B();
}
var U = new imgebuffer("can","n&b/a10.png");
// ///manipulation entre wav
this.coller = function(t0,t1,WAV, p,v ,pitch,r,polar){
/*
copier/coller
t0 = position depart
t1 = position fin
WAV = WAV objet source
p = position décriture
v = volum sur l'écriture
pitch = vitesse de lecture note
r = révertion 0-1
polar = polarité 0-1
ajouter un boucheur de trou linéaire pour le repli du pitch infra encadrement puis barycentre du point
ouver à une évolution possible d'interpolation
*/
if(polar!=0){polar=-1}else{polar=1}
[t0,t1,p] = [splat(t0),splat(t0+(t1-t0)/pitch), splat(p)];
var tlen = t1-t0;
if(r!=0){
for(var i=0;i<tlen;i++){
this.MS[tlen-i+p] += polar*WAV.MS[Math.floor(i*pitch+t0)]*v*marg(i,100,tlen);
}
}else{
for(var i=0;i<tlen;i++){
this.MS[i+p] += polar*WAV.MS[Math.floor(i*pitch+t0)]*v*marg(i,100,tlen);
}
}
}
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var source,sam;
function getData() {
source = audioCtx.createBufferSource();
var request = new XMLHttpRequest();
request.open("GET", "sample_importe/hellreaser8.wav", true);
request.responseType = 'arraybuffer';
request.onload = function(){
var audioData = request.response;
audioCtx.decodeAudioData(audioData,
function(buffer){
source.buffer = buffer;
//alert(buffer['duration'] + " / "+ buffer['length']);
//dump(buffer.getChannelData(0));//channel 1
//source.connect(audioCtx.destination);
sam = new WAV_specto(buffer['duration'],1);
sam.MS = buffer.getChannelData(0);
PRINT("texty", sam.out_str() ,0);
PRINT("fini" , "exporte fini",0);
},
function(e){"Error with decoding audio data" + e.err} );
}
request.send();
}
getData();
source.connect(audioCtx.destination);
source.start(0);
/*
//dump(buffer);
[object AudioBuffer]
getChannelData: function getChannelData() {
[native code]
}
copyFromChannel: function copyFromChannel() {
[native code]
}
copyToChannel: function copyToChannel() {
[native code]
}
sampleRate: 44100
length: 137653
duration: 3.1213832199546485
numberOfChannels: 2
*/
function sleep(delay){//waiters
var start = new Date().getTime();
while(new Date().getTime() < start + delay);
}
var MM = new Array(500);
for(var p=0;p<500;p++){MM[p]=Math.sin(p/3)}
function curv(v,v1,v2,t){
if( v.x>=0 && v1.x>0 && v2.x>0 ){
var dx1 = v1.x -v.x;
var dx2 = v.x -v2.x;
var dx3 = v.x*v.x;
var dx4 = v1.x*v1.x;
var dx5 = v2.x*v2.x;
var dy1 = v1.y -v.y;
var dy2 = v2.y -v.y;
var dxx = dx3 -dx4;
var AA = ( dy2*dx1 + dy1*dx2 )/( (dx5-dx3)*dx1 - dxx*dx2 );
var BB = (dy1 + AA*dxx)/dx1;
var CC = v.y -AA*dx3 -BB*v.x;
return AA*t*t +BB*t +CC;
}
}
function interpol(t,a){
var x = 0;
switch(a){
case 0: x = MM[Math.floor(t)]; break;//proche voisin
case 1://linéaire
var v1 = Math.floor(t);
var v2 = v1+1;
var td = t-v1;
var ti = 1-td;
x = MM[v1]*ti+MM[v2]*td;
break;
case 2://curve 3points
var v1 = Math.floor(t)-1;
var v2 = Math.floor(t);
var v3 = Math.floor(t)+1;
x = curv(v_(v1,MM[v1]),v_(v2,MM[v2]),v_(v3,MM[v3]), t);
break;
}
return x;
}
Function deterQuatre as single' détermine le déterminant de la matrix MQ(3,3)
' A*( F*(KP-LO) - G*(JP-LN) + H*(JO-KN) )
'-B*( E*(KP-LO) - G*(IP-LM) + H*(IO-KM) )
'+C*( E*(JP-LN) - F*(IP-LM) + H*(IN-JM) )
'-D*( E*(JO-KN) - F*(IO-KM) + G*(IN-JM) )
' MQ(0,0)*( MQ(1,1)*(MQ(2,2)*MQ(3,3)-MQ(3,2)*MQ(2,3)) - MQ(2,1)*(MQ(1,2)*MQ(3,3)-MQ(3,2)*MQ(1,3)) + MQ(3,1)*(MQ(1,2)*MQ(2,3)-MQ(2,2)*MQ(1,3)) )
'-MQ(1,0)*( MQ(0,1)*(MQ(2,2)*MQ(3,3)-MQ(3,2)*MQ(2,3)) - MQ(2,1)*(MQ(0,2)*MQ(3,3)-MQ(3,2)*MQ(0,3)) + MQ(3,1)*(MQ(0,2)*MQ(2,3)-MQ(2,2)*MQ(0,3)) )
'+MQ(2,0)*( MQ(0,1)*(MQ(1,2)*MQ(3,3)-MQ(3,2)*MQ(1,3)) - MQ(1,1)*(MQ(0,2)*MQ(3,3)-MQ(3,2)*MQ(0,3)) + MQ(3,1)*(MQ(0,2)*MQ(1,3)-MQ(1,2)*MQ(0,3)) )
''-MQ(3,0)*( MQ(0,1)*(MQ(1,2)*MQ(2,3)-MQ(2,2)*MQ(1,3)) - MQ(1,1)*(MQ(0,2)*MQ(2,3)-MQ(2,2)*MQ(0,3)) + MQ(2,1)*(MQ(0,2)*MQ(1,3)-MQ(1,2)*MQ(0,3)) )
deterQuatre = MQ(0,0)*( MQ(1,1)*(MQ(2,2)*MQ(3,3)-MQ(3,2)*MQ(2,3)) - MQ(2,1)*(MQ(1,2)*MQ(3,3)-MQ(3,2)*MQ(1,3)) + MQ(3,1)*(MQ(1,2)*MQ(2,3)-MQ(2,2)*MQ(1,3)) )-MQ(1,0)*( MQ(0,1)*(MQ(2,2)*MQ(3,3)-MQ(3,2)*MQ(2,3)) - MQ(2,1)*(MQ(0,2)*MQ(3,3)-MQ(3,2)*MQ(0,3)) + MQ(3,1)*(MQ(0,2)*MQ(2,3)-MQ(2,2)*MQ(0,3)) )+MQ(2,0)*( MQ(0,1)*(MQ(1,2)*MQ(3,3)-MQ(3,2)*MQ(1,3)) - MQ(1,1)*(MQ(0,2)*MQ(3,3)-MQ(3,2)*MQ(0,3)) + MQ(3,1)*(MQ(0,2)*MQ(1,3)-MQ(1,2)*MQ(0,3)) )-MQ(3,0)*( MQ(0,1)*(MQ(1,2)*MQ(2,3)-MQ(2,2)*MQ(1,3)) - MQ(1,1)*(MQ(0,2)*MQ(2,3)-MQ(2,2)*MQ(0,3)) + MQ(2,1)*(MQ(0,2)*MQ(1,3)-MQ(1,2)*MQ(0,3)) )
end Function
sub construite
ddd.fillrect(0,0,700,700,16777215)
'trai(X(0),Y(0),X(1),Y(1),0,3)
'trai(X(0),Y(0),X(2),Y(2),0,3)
'trai(X(3),Y(3),X(1),Y(1),255,20)
'trai(X(3),Y(3),X(2),Y(2),255,20)
xx1=X(0)
yy1=Y(0)
xx2=X(1)
yy2=Y(1)
xx3=X(2)
yy3=Y(2)
xx4=X(3)
yy4=Y(3)
xx5=X(4)
yy5=Y(4)
'recherche des coefficiants
'X1 = AA*T1 + BB avec T1 = 1
'X2 = AA*T2 + BB avec T2 = 50
'Y1 = AA1*T1 + BB1 avec T1 = 1
'Y2 = AA1*T2 + BB1 avec T2 = 50
RR = T1-T2' déterminant
AA = (xx1-xx2)/RR
BB = (T1*xx2-T2*xx1)/RR
AA1 = (yy1-yy2)/RR
BB1 = (T1*yy2-T2*yy1)/RR
' construction de la courbe par 2 points
xx = xx1
yy = yy1
for rr=1 to 50
xj = AA*rr + BB
yj = AA1*rr + BB1
ddd.Line(xx,yy,xj,yj,13107400)
xx = xj
yy = yj
next
'recherche des coefficiants
' résolution des 2 systèmes de 3 équations
'X1 = AA*T1^2 + BB*T1 + CC avec T1 = 1
'X2 = AA*T2^2 + BB*T2 + CC avec T2 = 50
'X3 = AA*T3^2 + BB*T3 + CC avec T3 = 100
'Y1 = AA1*T1^2 + BB1*T1 + CC1 avec T1 = 1
'Y2 = AA1*T2^2 + BB1*T2 + CC1 avec T2 = 50
'Y3 = AA1*T3^2 + BB1*T3 + CC1 avec T3 = 100
AA = ( (xx3-xx1)*(T2-T1) + (xx2-xx1)*(T1-T3) )/( (T2-T1)*T3^2 - T1^2*(T2-T1) - (T1^2-T2^2)*(T1-T3) )
BB = (xx2-xx1+AA*(T1^2-T2^2))/(T2-T1)
CC = xx1-AA*T1^2 - BB*T1
AA1 = ( (yy3-yy1)*(T2-T1) + (yy2-yy1)*(T1-T3) )/( (T2-T1)*T3^2 - T1^2*(T2-T1) - (T1^2-T2^2)*(T1-T3) )
BB1 = (yy2-yy1+AA1*(T1^2-T2^2))/(T2-T1)
CC1 = yy1-AA1*T1^2 - BB1*T1
' construction de la courbe par 3 points
xx = xx1
yy = yy1
for rr=1 to 100
xj = AA*rr^2 + BB*rr + CC
yj = AA1*rr^2 + BB1*rr + CC1
ddd.Line(xx,yy,xj,yj,255)
xx = xj
yy = yj
next
'Recherche des coefficiants
' on peut posé
'X1 = AA*T1^3 + BB*T1^2 + CC*T1 + DD avec T1 = 1
'X2 = AA*T2^3 + BB*T2^2 + CC*T2 + DD avec T2 = 50
'X3 = AA*T3^3 + BB*T3^2 + CC*T3 + DD avec T3 = 100
'X4 = AA*T4^3 + BB*T4^2 + CC*T4 + DD avec T4 = 150
'Y1 = AA1*T1^3 + BB1*T1^2 + CC1*T1 + DD1 avec T1 = 1
'Y2 = AA1*T2^3 + BB1*T2^2 + CC1*T2 + DD1 avec T2 = 50
'Y3 = AA1*T3^3 + BB1*T3^2 + CC1*T3 + DD1 avec T3 = 100
'Y4 = AA1*T4^3 + BB1*T4^2 + CC1*T4 + DD1 avec T4 = 150
EE = (T2-T1)*(xx3-xx1)+(T1-T3)*(xx2-xx1)
MM = (T1^3-T3^3)*(T2-T1)+(T1^3-T2^3)*(T1-T3)
WW = (T2-T1)*T3^2 - T1^2*(T2-T1) - (T1^2-T2^2)*(T1-T3)
RR = WW*(xx2-xx1) + EE*(T1^2-T2^2)
UU = WW*(T1^3-T2^3) + MM*(T1^2-T2^2)
AA = (T2-T1)*( xx4*WW - EE*T4^2 - xx1*WW + EE*T1^2 ) + RR*(T1-T4)
AA = AA / ( WW*(T2-T1)*(T4^3-T1^3) + MM*(T2-T1)*(T4^2-T1^2) + UU*(T4-T1) )
BB = ( EE+AA*MM ) / WW
CC = ( xx2-xx1+AA*(T1^3-T2^3)+BB*(T1^2-T2^2) )/(T2-T1)
DD = xx1 - AA*T1^3 - BB*T1^2 - CC*T1
'2ème système
EE = (T2-T1)*(yy3-yy1)+(T1-T3)*(yy2-yy1)
MM = (T1^3-T3^3)*(T2-T1)+(T1^3-T2^3)*(T1-T3)
WW = (T2-T1)*T3^2 - T1^2*(T2-T1) - (T1^2-T2^2)*(T1-T3)
RR = WW*(yy2-yy1) + EE*(T1^2-T2^2)
UU = WW*(T1^3-T2^3) + MM*(T1^2-T2^2)
AA1 = (T2-T1)*( yy4*WW - EE*T4^2 - yy1*WW + EE*T1^2 ) + RR*(T1-T4)
AA1 = AA1 / ( WW*(T2-T1)*(T4^3-T1^3) + MM*(T2-T1)*(T4^2-T1^2) + UU*(T4-T1) )
BB1 = ( EE+AA1*MM ) / WW
CC1 = ( yy2-yy1+AA1*(T1^3-T2^3)+BB1*(T1^2-T2^2) )/(T2-T1)
DD1 = yy1 - AA1*T1^3 - BB1*T1^2 - CC1*T1
' construction de la courbe par 4 points
xx = xx1
yy = yy1
for rr=1 to 150
xj = AA*rr^3 + BB*rr^2 + CC*rr + DD
yj = AA1*rr^3 + BB1*rr^2 + CC1*rr + DD1
ddd.Line(xx,yy,xj,yj,16711680)
xx = xj
yy = yj
next
'Recherche des coefficiants
' on peut posé un système de 5 équation
' le système inicial
for rr=0 to 4
MS(rr,0)=T1^(4-rr)
MS(rr,1)=T2^(4-rr)
MS(rr,2)=T3^(4-rr)
MS(rr,3)=T4^(4-rr)
MS(rr,4)=T5^(4-rr)
next
' construction de la comatrix MC(4,4)
for rr=0 to 4
for uu=0 to 4
xj=-1
for xx=0 to 4
if xx=rr then
else
xj++
yj=-1
for yy=0 to 4
if yy=uu then
else
yj++
MQ(xj,yj)=MS(xx,yy)
end if
next
end if
next
MC(rr,uu)=deterQuatre*(-1)^(2+rr+uu)
next
next
' le determinant EE
EE = MS(0,0)*MC(0,0)+MS(1,0)*MC(1,0)+MS(2,0)*MC(2,0)+MS(3,0)*MC(3,0)+MS(4,0)*MC(4,0)
' on multiplie la comatrix par 1/EE
if EE=0 then
else
for rr=0 to 4
for uu=0 to 4
MC(rr,uu)=MC(rr,uu)/EE
next
next
'puit on fait la transposé de la comatrix dans MS
for rr=0 to 4
for uu=0 to 4
MS(rr,uu)=MC(uu,rr)
next
next
'et enfin on élabore les matrix de solution
for rr=0 to 4
PPX(rr) = MS(0,rr)*xx1 + MS(1,rr)*xx2 + MS(2,rr)*xx3 + MS(3,rr)*xx4 + MS(4,rr)*xx5
next
'2ème système
for rr=0 to 4
PPY(rr) = MS(0,rr)*yy1 + MS(1,rr)*yy2 + MS(2,rr)*yy3 + MS(3,rr)*yy4 + MS(4,rr)*yy5
next
' construction de la courbe par 5 points
xx = xx1
yy = yy1
for rr=1 to 200
xj = PPX(0)*rr^4 + PPX(1)*rr^3 + PPX(2)*rr^2 + PPX(3)*rr + PPX(4)
yj = PPY(0)*rr^4 + PPY(1)*rr^3 + PPY(2)*rr^2 + PPY(3)*rr + PPY(4)
ddd.Line(xx,yy,xj,yj,51400)
xx = xj
yy = yj
next
end if
'construction des points
if VP=1 then
for rr=0 to 4
ddd.fillrect(X(rr)-6,Y(rr)-6,X(rr)+6,Y(rr)+6,0)
ddd.fillrect(X(rr)-5,Y(rr)-5,X(rr)+5,Y(rr)+5,9881600)
next
end if
F.Draw(0,0,ddd.bmp)
end sub
(http://i.imgur.com/ayhnRCC.png?1)//équation matriciel
function interpol_matric(c){//c = côté matrice
//Recherche des coefficiants
//on peut posé un système de 5 équation
var EE=0,i=0,q=0;// des variables qui sèrve dans le calcule de la courbe au 4 points
var PPX = new Array(c); // la matrix de solution des coefficiants pour la courbe à plus de 4 points
var PPY = new Array(c);
var MQ = new Array(c);//(3,3) // la matrix 4*4 pour les déterminants intermédière
var MS = new Array(c);//(4,4) // celle du système
var MC = new Array(c);//(4,4) // celle de la comatrix
var xx=new Array(c);//[0,1,2,3,4,5];
var yy=new Array(c);//[1,3,2,0,5,2];
for(i=0; i<c; i++){
MQ[i] = new Array(c);
MS[i] = new Array(c);
MC[i] = new Array(c);
xx[i] = rf(2)-1;
yy[i] = rf(2)-1;
}
function deterQuatre(Q,n){// détermine le déterminant de la matrix Q(n,n)
/*
A E I M
B F J N
C G K O
D H L P
A*( F*(KP-LO) - G*(JP-LN) + H*(JO-KN) )
-B*( E*(KP-LO) - G*(IP-LM) + H*(IO-KM) )
+C*( E*(JP-LN) - F*(IP-LM) + H*(IN-JM) )
-D*( E*(JO-KN) - F*(IO-KM) + G*(IN-JM) )
*/
var determin = 0;
if(n==4){
determin =
Q[0][0]*( Q[1][1]*(Q[2][2]*Q[3][3]-Q[3][2]*Q[2][3])
- Q[2][1]*( Q[1][2]* Q[3][3]-Q[3][2]*Q[1][3])
+ Q[3][1]*( Q[1][2]* Q[2][3]-Q[2][2]*Q[1][3]) )
- Q[1][0]*( Q[0][1]*(Q[2][2]*Q[3][3]-Q[3][2]*Q[2][3])
- Q[2][1]*( Q[0][2]* Q[3][3]-Q[3][2]*Q[0][3])
+ Q[3][1]*( Q[0][2]* Q[2][3]-Q[2][2]*Q[0][3]) )
+ Q[2][0]*( Q[0][1]*(Q[1][2]*Q[3][3]-Q[3][2]*Q[1][3])
- Q[1][1]*( Q[0][2]* Q[3][3]-Q[3][2]*Q[0][3])
+ Q[3][1]*( Q[0][2]* Q[1][3]-Q[1][2]*Q[0][3]) )
- Q[3][0]*( Q[0][1]*(Q[1][2]*Q[2][3]-Q[2][2]*Q[1][3])
- Q[1][1]*( Q[0][2]* Q[2][3]-Q[2][2]*Q[0][3])
+ Q[2][1]*( Q[0][2]* Q[1][3]-Q[1][2]*Q[0][3]) );
}else if(n>4){
var j=0;
var MA = new Array(n-1); for(var r=0; r<n-1; r++){MA[r] = new Array(n-1)}
for(var r=0; r<n; r++){
j=-1;
for(var x=0; x<n; x++){
if( x!=r ){
j++;
for(var y=1; y<n; y++){
MA[j][y-1] = Q[x][y];
}
}
}
determin += Q[r][0] * deterQuatre(MA,n-1)*Math.pow(-1,2+r);
}
}
return determin;
}
// le système inicial
for(i=0; i<c; i++){
for(q=0; q<c; q++){
MS[i][q] = Math.pow(q,c-1 -i);//T paramétrique variable
}}
//construction de la comatrix MC(4,4)
var xj=0,yj=0;
for(i=0; i<c; i++){
for(q=0; q<c; q++){
xj=-1;
for(var x=0; x<c; x++){
if( x!=i ){
xj++;
yj=-1;
for(var y=0; y<c; y++){
if( y!=q ){
yj++;
MQ[xj][yj] = MS[x][y];
}
}
}
}
MC[i][q] = deterQuatre(MQ,c-1)*Math.pow(-1,2+i+q);
}}
// le determinant EE
for(i=0; i<c; i++){
EE += MS[i][0]*MC[i][0];
}
// on multiplie la comatrix par 1/EE
if( EE!=0 ){
for(i=0; i<c; i++){
for(q=0; q<c; q++){
MC[i][q] /= EE;
MS[q][i] = MC[i][q];//puit on fait la transposé de la comatrix dans MS
}}
//et enfin on élabore les matrix de solution
for(i=0; i<c; i++){
PPX[i] = 0;
PPY[i] = 0;
for(q=0; q<c; q++){
PPX[i] += MS[q][i]*xx[q];
PPY[i] += MS[q][i]*yy[q];
}
}
//graphique
for(i=0; i<c; i++){//trace les points d'origine
U.point(v_(xx[i],yy[i]),0);
}
// construction de la courbe par 5 points
e1=v_(xx[0],yy[0]);
for(i=0; i<=10000; i++){
t = i/10000*(c-1);
xj = 0;
yj = 0;
for(q=0; q<c; q++){
xj += PPX[q]*Math.pow(t,c-1 -q);
yj += PPY[q]*Math.pow(t,c-1 -q);
}
e = v_(xj,yj);
U.l(e1,e,2);
e1=e;
}
}
}
function deter7(Q){
var AA=Q[0][0],AB=Q[0][1],AC=Q[0][2],AD=Q[0][3],AE=Q[0][4],AF=Q[0][5],AG=Q[0][6],BA=Q[1][0],BB=Q[1][1],BC=Q[1][2],BD=Q[1][3],BE=Q[1][4],BF=Q[1][5],BG=Q[1][6],CA=Q[2][0],CB=Q[2][1],CC=Q[2][2],CD=Q[2][3],CE=Q[2][4],CF=Q[2][5],CG=Q[2][6],DA=Q[3][0],DB=Q[3][1],DC=Q[3][2],DD=Q[3][3],DE=Q[3][4],DF=Q[3][5],DG=Q[3][6],EA=Q[4][0],EB=Q[4][1],EC=Q[4][2],ED=Q[4][3],EE=Q[4][4],EF=Q[4][5],EG=Q[4][6],FA=Q[5][0],FB=Q[5][1],FC=Q[5][2],FD=Q[5][3],FE=Q[5][4],FF=Q[5][5],FG=Q[5][6],GA=Q[6][0],GB=Q[6][1],GC=Q[6][2],GD=Q[6][3],GE=Q[6][4],GF=Q[6][5],GG=Q[6][6];
return AA*(BB*(CC*(DD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))+FD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-GD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG)))
-DC*(CD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-GD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG)))
+EC*(CD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG)))
-FC*(CD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))+ED*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG)))
+GC*(CD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))+ED*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-FD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG))))
-CB*(BC*(DD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))+FD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-GD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG)))
-DC*(BD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))-GD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG)))
+EC*(BD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))-GD*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG)))
-FC*(BD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))+ED*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))-GD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG)))
+GC*(BD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG))+ED*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG))-FD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG))))
+DB*(BC*(CD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-GD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG)))
-CC*(BD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))-GD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG)))
+EC*(BD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))-CD*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG)))
-FC*(BD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-CD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))+ED*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG)))
+GC*(BD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))-CD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG))+ED*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG))-FD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG))))
-EB*(BC*(CD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG)))
-CC*(BD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))-GD*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG)))
+DC*(BD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))-CD*(BE*(FF*GG-GF*FG)-FE*(BF*GG-GF*BG)+GE*(BF*FG-FF*BG))+FD*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG)))
-FC*(BD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-CD*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))+DD*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG)))
+GC*(BD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-CD*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG))+DD*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG))-FD*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG))))
+FB*(BC*(CD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))+ED*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG)))
-CC*(BD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))+ED*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))-GD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG)))
+DC*(BD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-CD*(BE*(EF*GG-GF*EG)-EE*(BF*GG-GF*BG)+GE*(BF*EG-EF*BG))+ED*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG)))
-EC*(BD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-CD*(BE*(DF*GG-GF*DG)-DE*(BF*GG-GF*BG)+GE*(BF*DG-DF*BG))+DD*(BE*(CF*GG-GF*CG)-CE*(BF*GG-GF*BG)+GE*(BF*CG-CF*BG))-GD*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG)))
+GC*(BD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG))-CD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG))+DD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG))-ED*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG))))
-GB*(BC*(CD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))+ED*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-FD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG)))
-CC*(BD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG))+ED*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG))-FD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG)))
+DC*(BD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))-CD*(BE*(EF*FG-FF*EG)-EE*(BF*FG-FF*BG)+FE*(BF*EG-EF*BG))+ED*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG))-FD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG)))
-EC*(BD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-CD*(BE*(DF*FG-FF*DG)-DE*(BF*FG-FF*BG)+FE*(BF*DG-DF*BG))+DD*(BE*(CF*FG-FF*CG)-CE*(BF*FG-FF*BG)+FE*(BF*CG-CF*BG))-FD*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG)))
+FC*(BD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG))-CD*(BE*(DF*EG-EF*DG)-DE*(BF*EG-EF*BG)+EE*(BF*DG-DF*BG))+DD*(BE*(CF*EG-EF*CG)-CE*(BF*EG-EF*BG)+EE*(BF*CG-CF*BG))-ED*(BE*(CF*DG-DF*CG)-CE*(BF*DG-DF*BG)+DE*(BF*CG-CF*BG)))))
-BA*(AB*(CC*(DD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))+FD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-GD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG)))
-DC*(CD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-GD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG)))
+EC*(CD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG)))
-FC*(CD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))+ED*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG)))
+GC*(CD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))+ED*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-FD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG))))
-CB*(AC*(DD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))+FD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-GD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG)))
-DC*(AD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))-GD*(AE*(EF*FG-FF*EG)-EE*(AF*FG-FF*AG)+FE*(AF*EG-EF*AG)))
+EC*(AD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))-GD*(AE*(DF*FG-FF*DG)-DE*(AF*FG-FF*AG)+FE*(AF*DG-DF*AG)))
-FC*(AD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))+ED*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))-GD*(AE*(DF*EG-EF*DG)-DE*(AF*EG-EF*AG)+EE*(AF*DG-DF*AG)))
+GC*(AD*(DE*(EF*FG-FF*EG)-EE*(DF*FG-FF*DG)+FE*(DF*EG-EF*DG))-DD*(AE*(EF*FG-FF*EG)-EE*(AF*FG-FF*AG)+FE*(AF*EG-EF*AG))+ED*(AE*(DF*FG-FF*DG)-DE*(AF*FG-FF*AG)+FE*(AF*DG-DF*AG))-FD*(AE*(DF*EG-EF*DG)-DE*(AF*EG-EF*AG)+EE*(AF*DG-DF*AG))))
+DB*(AC*(CD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-GD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG)))
-CC*(AD*(EE*(FF*GG-GF*FG)-FE*(EF*GG-GF*EG)+GE*(EF*FG-FF*EG))-ED*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))-GD*(AE*(EF*FG-FF*EG)-EE*(AF*FG-FF*AG)+FE*(AF*EG-EF*AG)))
+EC*(AD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))-CD*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(CF*GG-GF*CG)-CE*(AF*GG-GF*AG)+GE*(AF*CG-CF*AG))-GD*(AE*(CF*FG-FF*CG)-CE*(AF*FG-FF*AG)+FE*(AF*CG-CF*AG)))
-FC*(AD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-CD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))+ED*(AE*(CF*GG-GF*CG)-CE*(AF*GG-GF*AG)+GE*(AF*CG-CF*AG))-GD*(AE*(CF*EG-EF*CG)-CE*(AF*EG-EF*AG)+EE*(AF*CG-CF*AG)))
+GC*(AD*(CE*(EF*FG-FF*EG)-EE*(CF*FG-FF*CG)+FE*(CF*EG-EF*CG))-CD*(AE*(EF*FG-FF*EG)-EE*(AF*FG-FF*AG)+FE*(AF*EG-EF*AG))+ED*(AE*(CF*FG-FF*CG)-CE*(AF*FG-FF*AG)+FE*(AF*CG-CF*AG))-FD*(AE*(CF*EG-EF*CG)-CE*(AF*EG-EF*AG)+EE*(AF*CG-CF*AG))))
-EB*(AC*(CD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))+FD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG)))
-CC*(AD*(DE*(FF*GG-GF*FG)-FE*(DF*GG-GF*DG)+GE*(DF*FG-FF*DG))-DD*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))-GD*(AE*(DF*FG-FF*DG)-DE*(AF*FG-FF*AG)+FE*(AF*DG-DF*AG)))
+DC*(AD*(CE*(FF*GG-GF*FG)-FE*(CF*GG-GF*CG)+GE*(CF*FG-FF*CG))-CD*(AE*(FF*GG-GF*FG)-FE*(AF*GG-GF*AG)+GE*(AF*FG-FF*AG))+FD*(AE*(CF*GG-GF*CG)-CE*(AF*GG-GF*AG)+GE*(AF*CG-CF*AG))-GD*(AE*(CF*FG-FF*CG)-CE*(AF*FG-FF*AG)+FE*(AF*CG-CF*AG)))
-FC*(AD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-CD*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))+DD*(AE*(CF*GG-GF*CG)-CE*(AF*GG-GF*AG)+GE*(AF*CG-CF*AG))-GD*(AE*(CF*DG-DF*CG)-CE*(AF*DG-DF*AG)+DE*(AF*CG-CF*AG)))
+GC*(AD*(CE*(DF*FG-FF*DG)-DE*(CF*FG-FF*CG)+FE*(CF*DG-DF*CG))-CD*(AE*(DF*FG-FF*DG)-DE*(AF*FG-FF*AG)+FE*(AF*DG-DF*AG))+DD*(AE*(CF*FG-FF*CG)-CE*(AF*FG-FF*AG)+FE*(AF*CG-CF*AG))-FD*(AE*(CF*DG-DF*CG)-CE*(AF*DG-DF*AG)+DE*(AF*CG-CF*AG))))
+FB*(AC*(CD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))+ED*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-GD*(CE*(DF*EG-EF*DG)-DE*(CF*EG-EF*CG)+EE*(CF*DG-DF*CG)))
-CC*(AD*(DE*(EF*GG-GF*EG)-EE*(DF*GG-GF*DG)+GE*(DF*EG-EF*DG))-DD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))+ED*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))-GD*(AE*(DF*EG-EF*DG)-DE*(AF*EG-EF*AG)+EE*(AF*DG-DF*AG)))
+DC*(AD*(CE*(EF*GG-GF*EG)-EE*(CF*GG-GF*CG)+GE*(CF*EG-EF*CG))-CD*(AE*(EF*GG-GF*EG)-EE*(AF*GG-GF*AG)+GE*(AF*EG-EF*AG))+ED*(AE*(CF*GG-GF*CG)-CE*(AF*GG-GF*AG)+GE*(AF*CG-CF*AG))-GD*(AE*(CF*EG-EF*CG)-CE*(AF*EG-EF*AG)+EE*(AF*CG-CF*AG)))
-EC*(AD*(CE*(DF*GG-GF*DG)-DE*(CF*GG-GF*CG)+GE*(CF*DG-DF*CG))-CD*(AE*(DF*GG-GF*DG)-DE*(AF*GG-GF*AG)+GE*(AF*DG-DF*AG))+DD*
...
L'erreur ou les erreurs suivantes sont apparues durant la soumission de ce message :
Le message dépasse la limite de caractères autorisée (20000 caractères permis).
n==5
Q[0][0]*(Q[1][1]*(Q[2][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
+Q[4][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4]))
-Q[2][1]*(Q[1][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
+Q[4][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4]))
+Q[3][1]*(Q[1][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
-Q[2][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
+Q[4][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4]))
-Q[4][1]*(Q[1][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4])
-Q[2][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4])
+Q[3][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4])))
-Q[1][0]*(Q[0][1]*(Q[2][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
+Q[4][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4]))
-Q[2][1]*(Q[0][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4]))
+Q[3][1]*(Q[0][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
-Q[2][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4]))
-Q[4][1]*(Q[0][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4])
-Q[2][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4])
+Q[3][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4])))
+Q[2][0]*(Q[0][1]*(Q[1][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
+Q[4][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4]))
-Q[1][1]*(Q[0][2]*(Q[3][3]*Q[4][4]-Q[4][3]*Q[3][4])
-Q[3][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4]))
+Q[3][1]*(Q[0][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4]))
-Q[4][1]*(Q[0][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4])
+Q[3][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4])))
-Q[3][0]*(Q[0][1]*(Q[1][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
-Q[2][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
+Q[4][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4]))
-Q[1][1]*(Q[0][2]*(Q[2][3]*Q[4][4]-Q[4][3]*Q[2][4])
-Q[2][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4]))
+Q[2][1]*(Q[0][2]*(Q[1][3]*Q[4][4]-Q[4][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[4][4]-Q[4][3]*Q[0][4])
+Q[4][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4]))
-Q[4][1]*(Q[0][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4])
+Q[2][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4])))
+Q[4][0]*(Q[0][1]*(Q[1][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4])
-Q[2][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4])
+Q[3][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4]))
-Q[1][1]*(Q[0][2]*(Q[2][3]*Q[3][4]-Q[3][3]*Q[2][4])
-Q[2][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4])
+Q[3][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4]))
+Q[2][1]*(Q[0][2]*(Q[1][3]*Q[3][4]-Q[3][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[3][4]-Q[3][3]*Q[0][4])
+Q[3][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4]))
-Q[3][1]*(Q[0][2]*(Q[1][3]*Q[2][4]-Q[2][3]*Q[1][4])
-Q[1][2]*(Q[0][3]*Q[2][4]-Q[2][3]*Q[0][4])
+Q[2][2]*(Q[0][3]*Q[1][4]-Q[1][3]*Q[0][4])))
function interpolQ(c,t){//c = côté matrice
//Recherche des coefficiants
var EE=0,i=0,q=0;
var PPX = new Array(c); // la matrix de solution des coefficiants pour la courbe à plus de 4 points
var PPY = new Array(c);
var MQ = new Array(c);// les déterminants intermédière
var MS = new Array(c);// celle du système
var MC = new Array(c);// celle de la comatrix
var xx = new Array(c);
var yy = new Array(c);
var intt = Math.floor(t)
for(i=0; i<c; i++){
MQ[i] = new Array(c);
MS[i] = new Array(c);
MC[i] = new Array(c);
xx[i] = intt-c/2+i;
if(xx[i]<0){yy[i] = 0}else{yy[i] = MM[ xx[i] ] }
}
function deter(Q,n){// détermine le déterminant de la matrix Q(n,n)
/*
A E I M A*( F*(KP-LO) - G*(JP-LN) + H*(JO-KN) )
B F J N -B*( E*(KP-LO) - G*(IP-LM) + H*(IO-KM) )
C G K O +C*( E*(JP-LN) - F*(IP-LM) + H*(IN-JM) )
D H L P -D*( E*(JO-KN) - F*(IO-KM) + G*(IN-JM) )
*/
var determin = 0;
if(n==4){
determin =
Q[0][0]*( Q[1][1]*(Q[2][2]*Q[3][3]-Q[3][2]*Q[2][3])
- Q[2][1]*( Q[1][2]* Q[3][3]-Q[3][2]*Q[1][3])
+ Q[3][1]*( Q[1][2]* Q[2][3]-Q[2][2]*Q[1][3]) )
- Q[1][0]*( Q[0][1]*(Q[2][2]*Q[3][3]-Q[3][2]*Q[2][3])
- Q[2][1]*( Q[0][2]* Q[3][3]-Q[3][2]*Q[0][3])
+ Q[3][1]*( Q[0][2]* Q[2][3]-Q[2][2]*Q[0][3]) )
+ Q[2][0]*( Q[0][1]*(Q[1][2]*Q[3][3]-Q[3][2]*Q[1][3])
- Q[1][1]*( Q[0][2]* Q[3][3]-Q[3][2]*Q[0][3])
+ Q[3][1]*( Q[0][2]* Q[1][3]-Q[1][2]*Q[0][3]) )
- Q[3][0]*( Q[0][1]*(Q[1][2]*Q[2][3]-Q[2][2]*Q[1][3])
- Q[1][1]*( Q[0][2]* Q[2][3]-Q[2][2]*Q[0][3])
+ Q[2][1]*( Q[0][2]* Q[1][3]-Q[1][2]*Q[0][3]) );
//determin = Q[0][0]*Q[1][1]-Q[1][0]*Q[0][1];
}else if(n==3){
determin = Q[0][0]*(Q[1][1]*Q[2][2]-Q[2][1]*Q[1][2])-Q[1][0]*(Q[0][1]*Q[2][2]-Q[2][1]*Q[0][2])+Q[2][0]*(Q[0][1]*Q[1][2]-Q[1][1]*Q[0][2]);
}else if(n>4){
var j=0;
var MA = new Array(n-1); for(var r=0; r<n-1; r++){MA[r] = new Array(n-1)}
for(var r=0; r<n; r++){
j=-1;
for(var x=0; x<n; x++){
if( x!=r ){
j++;
for(var y=1; y<n; y++){MA[j][y-1] = Q[x][y] }
}
}
//try{
determin += Q[r][0] * deter(MA,n-1)*Math.pow(-1,2+r);
//}catch(ex){ alert("Too much recursion!"); }
}
}
return determin;
}
// le système inicial
for(i=0; i<c; i++){
for(q=0; q<c; q++){
MS[i][q] = Math.pow(q,c-1 -i);//T paramétrique variable
}}
//construction de la comatrix MC(4,4)
var xj=0,yj=0;
for(i=0; i<c; i++){
for(q=0; q<c; q++){
xj=-1;
for(var x=0; x<c; x++){
if( x!=i ){
xj++;
yj=-1;
for(var y=0; y<c; y++){
if( y!=q ){
yj++;
MQ[xj][yj] = MS[x][y];
}
}
}
}
MC[i][q] = deter(MQ,c-1)*Math.pow(-1,2+i+q);
}}
// le determinant EE
for(i=0; i<c; i++){ EE += MS[i][0]*MC[i][0] }
// on multiplie la comatrix par 1/EE
if( EE!=0 ){
for(i=0; i<c; i++){
PPX[i] = 0;
PPY[i] = 0;
for(q=0; q<c; q++){
MC[i][q] /= EE;
MS[q][i] = MC[i][q];//puit on fait la transposé de la comatrix dans MS
PPX[i] += MS[q][i]*xx[q];//et enfin on élabore les matrix de solution
PPY[i] += MS[q][i]*yy[q];
}}
// construction du point t
//t = i/10000*(c-1);
//xj = 0;
t = t-xx[0];
yj = 0;
for(q=0; q<c; q++){
//xj += PPX[q]*Math.pow(t,c-1 -q);
yj += PPY[q]*Math.pow(t,c-1 -q);
}
return yj
}else{return 0}
}
function interpolQ(c,t){//c = côté matrice
//Recherche des coefficiants
var i=0,q=0;
//var PPX = new Array(c); //la matrix de solution des coefficiants
var PPY = new Array(c);
var MS = new Array(c);// système
var xx = new Array(c);
var yy = new Array(c);
var intt = Math.floor(t);
for(i=0; i<c; i++){
MS[i] = new Array(c);
xx[i] = Math.floor(intt-c/2+i);
if(xx[i]<0){yy[i] = 0}else{yy[i] = MM[ xx[i] ] }
}
MS[0][c-1]=1;
for(i=1; i<c; i++){ MS[i][c-1]=0 }
switch(c){//charge le MS avec T paramétrique de 0 a 1]
case 3:
MS[0][0]=2;
MS[1][0]=-4;
MS[2][0]=2;
MS[0][1]=-3;
MS[1][1]=4;
MS[2][1]=-1;
break;
case 4:
MS[0][0]=-4.499999999999999;
MS[1][0]=13.499999999999998;
MS[2][0]=-13.499999999999998;
MS[3][0]=4.499999999999999;
MS[0][1]=8.999999999999998;
MS[1][1]=-22.499999999999996;
MS[2][1]=17.999999999999996;
MS[3][1]=-4.499999999999999;
MS[0][2]=-5.5;
MS[1][2]=8.999999999999998;
MS[2][2]=-4.499999999999999;
MS[3][2]=0.9999999999999998;
break;
case 5:
MS[0][0]=10.666666666666666;
MS[1][0]=-42.666666666666664;
MS[2][0]=64;
MS[3][0]=-42.666666666666664;
MS[4][0]=10.666666666666666;
MS[0][1]=-26.666666666666668;
MS[1][1]=96;
MS[2][1]=-128;
MS[3][1]=74.66666666666667;
MS[4][1]=-16;
MS[0][2]=23.333333333333332;
MS[1][2]=-69.33333333333333;
MS[2][2]=76;
MS[3][2]=-37.333333333333336;
MS[4][2]=7.333333333333333;
MS[0][3]=-8.333333333333334;
MS[1][3]=16;
MS[2][3]=-12;
MS[3][3]=5.333333333333333;
MS[4][3]=-1;
break;
case 6:
MS[0][0]=-26.04166666666341;
MS[1][0]=130.20833333332268;
MS[2][0]=-260.4166666666505;
MS[3][0]=260.41666666665225;
MS[4][0]=-130.2083333333264;
MS[5][0]=26.04166666666531;
MS[0][1]=78.12499999999619;
MS[1][1]=-364.5833333333134;
MS[2][1]=677.0833333332961;
MS[3][1]=-624.9999999999665;
MS[4][1]=286.4583333333175;
MS[5][1]=-52.08333333333079;
MS[0][2]=-88.54166666666084;
MS[1][2]=369.79166666664474;
MS[2][2]=-614.5833333332993;
MS[3][2]=510.416666666639;
MS[4][2]=-213.54166666665483;
MS[5][2]=36.45833333333139;
MS[0][3]=46.87499999999719;
MS[1][3]=-160.4166666666577;
MS[2][3]=222.91666666665472;
MS[3][3]=-162.49999999999122;
MS[4][3]=63.54166666666317;
MS[5][3]=-10.416666666666064;
MS[0][4]=-11.41666666666631;
MS[1][4]=24.999999999998945;
MS[2][4]=-24.999999999998707;
MS[3][4]=16.666666666665787;
MS[4][4]=-6.249999999999658;
MS[5][4]=0.9999999999999387;
break;
case 7:
MS[0][0]=64.80000000013396;
MS[1][0]=-388.8000000008784;
MS[2][0]=972.0000000022411;
MS[3][0]=-1296.0000000029872;
MS[4][0]=972.0000000022254;
MS[5][0]=-388.800000000892;
MS[6][0]=64.80000000014849;
MS[0][1]=-226.80000000038962;
MS[1][1]=1296.0000000026257;
MS[2][1]=-3078.0000000067557;
MS[3][1]=3888.0000000088226;
MS[4][1]=-2754.000000006286;
MS[5][1]=1036.8000000023637;
MS[6][1]=-162.00000000037414;
MS[0][2]=315.0000000007394;
MS[1][2]=-1674.0000000038744;
MS[2][2]=3699.0000000085015;
MS[3][2]=-4356.000000009976;
MS[4][2]=2889.0000000066034;
MS[5][2]=-1026.0000000023526;
MS[6][2]=153.0000000003498;
MS[0][3]=-220.5000000005403;
MS[1][3]=1044.0000000024345;
MS[2][3]=-2074.50000000475;
MS[3][3]=2232.000000005097;
MS[4][3]=-1381.5000000031591;
MS[5][3]=468.00000000106905;
MS[6][3]=-67.50000000015325;
MS[0][4]=81.20000000015132;
MS[1][4]=-313.20000000062635;
MS[2][4]=526.5000000011379;
MS[3][4]=-508.00000000114966;
MS[4][4]=297.00000000067854;
MS[5][4]=-97.20000000022118;
MS[6][4]=13.700000000030993;
MS[0][5]=-14.700000000013349;
MS[1][5]=36.0000000000528;
MS[2][5]=-45.00000000009213;
MS[3][5]=40.0000000000898;
MS[4][5]=-22.500000000051376;
MS[5][5]=7.2000000000163435;
MS[6][5]=-1.0000000000022584;
break;
case 8:
MS[0][0]=-163.4013888898005;
MS[1][0]=1143.809722221436;
MS[2][0]=-3431.429166652463;
MS[3][0]=5719.048611077729;
MS[4][0]=-5719.048611073818;
MS[5][0]=3431.429166644205;
MS[6][0]=-1143.8097222152119;
MS[7][0]=163.40138888801852;
MS[0][1]=653.6055555446368;
MS[1][1]=-4411.837499947163;
MS[2][1]=12745.308333221805;
MS[3][1]=-20425.173610963568;
MS[4][1]=19608.166666534413;
MS[5][1]=-11274.695833258607;
MS[6][1]=3594.830555531466;
MS[7][1]=-490.20416666361444;
MS[0][2]=-1073.780555537978;
MS[1][2]=6886.201388812672;
MS[2][2]=-18907.87499984149;
MS[3][2]=28828.67361090495;
MS[4][2]=-26377.65277760062;
MS[5][2]=14496.037499903057;
MS[6][2]=-4435.180555526823;
MS[7][2]=583.5763888849634;
MS[0][3]=933.7222222142656;
MS[1][3]=-5552.312499959335;
MS[2][3]=14205.916666568364;
MS[3][3]=-20325.131944307468;
MS[4][3]=17607.33333321638;
MS[5][3]=-9253.854166605013;
MS[6][3]=2734.472222204197;
MS[7][3]=-350.14583333102047;
MS[0][4]=-460.6680555549175;
MS[1][4]=2431.4888888798628;
MS[2][4]=-5615.195833303059;
MS[3][4]=7412.6111110645425;
MS[4][4]=-6062.048611071278;
MS[5][4]=3064.1333333131774;
MS[6][4]=-880.8430555495083;
MS[7][4]=110.5222222215598;
MS[0][5]=127.67222222246124;
MS[1][5]=-546.3499999992845;
MS[2][5]=1076.7749999955224;
MS[3][5]=-1291.6944444368194;
MS[4][5]=1004.4999999934649;
MS[5][5]=-492.44999999681045;
MS[6][5]=138.6972222212361;
MS[7][5]=-17.14999999991114;
MS[0][6]=-18.15000000003062;
MS[1][6]=48.999999999992035;
MS[2][6]=-73.49999999975114;
MS[3][6]=81.66666666620591;
MS[4][6]=-61.24999999960459;
MS[5][6]=29.399999999812074;
MS[6][6]=-8.166666666607258;
MS[7][6]=0.9999999999955447;
break;
case 9:
MS[0][0]=416.1015873015873;
MS[1][0]=-3328.8126984126984;
MS[2][0]=11650.844444444445;
MS[3][0]=-23301.68888888889;
MS[4][0]=29127.11111111111;
MS[5][0]=-23301.68888888889;
MS[6][0]=11650.844444444445;
MS[7][0]=-3328.8126984126984;
MS[8][0]=416.1015873015873;
MS[0][1]=-1872.4571428571428;
MS[1][1]=14563.555555555555;
MS[2][1]=-49516.08888888889;
MS[3][1]=96119.46666666666;
MS[4][1]=-116508.44444444444;
MS[5][1]=90294.04444444444;
MS[6][1]=-43690.666666666664;
MS[7][1]=12066.946031746033;
MS[8][1]=-1456.3555555555556;
MS[0][2]=3549.866666666667;
MS[1][2]=-26578.48888888889;
MS[2][2]=87017.24444444444;
MS[3][2]=-162747.73333333334;
MS[4][2]=190236.44444444444;
MS[5][2]=-142358.75555555554;
MS[6][2]=66628.26666666666;
MS[7][2]=-17840.355555555554;
MS[8][2]=2093.511111111111;
MS[0][3]=-3686.4;
MS[1][3]=26168.88888888889;
MS[2][3]=-81464.88888888889;
MS[3][3]=145408;
MS[4][3]=-162929.77777777778;
MS[5][3]=117464.17777777778;
MS[6][3]=-53248;
MS[7][3]=13880.888888888889;
MS[8][3]=-1592.888888888889;
MS[0][4]=2280.5333333333333;
MS[1][4]=-14973.155555555555;
MS[2][4]=43488.71111111111;
MS[3][4]=-73181.86666666667;
MS[4][4]=78172.44444444444;
MS[5][4]=-54294.75555555556;
MS[6][4]=23918.933333333334;
MS[7][4]=-6098.488888888889;
MS[8][4]=687.6444444444444;
MS[0][5]=-854.4;
MS[1][5]=4963.555555555556;
MS[2][5]=-13051.022222222222;
MS[3][5]=20403.2;
MS[4][5]=-20721.777777777777;
MS[5][5]=13912.177777777777;
MS[6][5]=-5984;
MS[7][5]=1499.0222222222221;
MS[8][5]=-166.75555555555556;
MS[0][6]=187.4984126984127;
MS[1][6]=-879.5428571428571;
MS[2][6]=1987.2;
MS[3][6]=-2848.711111111111;
MS[4][6]=2764;
MS[5][6]=-1804.8;
MS[6][6]=761.9555555555555;
MS[7][6]=-188.34285714285716;
MS[8][6]=20.742857142857144;
MS[0][7]=-21.742857142857144;
MS[1][7]=64;
MS[2][7]=-112;
MS[3][7]=149.33333333333334;
MS[4][7]=-140;
MS[5][7]=89.6;
MS[6][7]=-37.333333333333336;
MS[7][7]=9.142857142857142;
MS[8][7]=-1;
break;
case 10:
MS[0][0]=-1067.6271230031423;
MS[1][0]=9608.643815375677;
MS[2][0]=-38434.5749083656;
MS[3][0]=89680.67447952859;
MS[4][0]=-134521.01144711536;
MS[5][0]=134521.0112776276;
MS[6][0]=-89680.67412289963;
MS[7][0]=38434.574623349785;
MS[8][0]=-9608.643652242941;
MS[9][0]=1067.6270730762126;
MS[0][1]=5338.135412176156;
MS[1][1]=-46975.59154828118;
MS[2][1]=183631.85731003314;
MS[3][1]=-418509.81340300175;
MS[4][1]=612817.9402972409;
MS[5][1]=-597871.1609378475;
MS[6][1]=388616.25453549717;
MS[7][1]=-162279.31508495857;
MS[8][1]=39502.20166660749;
MS[9][1]=-4270.508291120221;
MS[0][2]=-11467.105537633326;
MS[1][2]=97984.44011060725;
MS[2][2]=-372008.72217955225;
MS[3][2]=823733.5992827205;
MS[4][2]=-1172491.7764256976;
MS[5][2]=1112704.6603621042;
MS[6][2]=-704159.367165139;
MS[7][2]=286598.5564412502;
MS[8][2]=-68090.88218968216;
MS[9][2]=7196.597304985596;
MS[0][3]=13839.610182372942;
MS[1][3]=-113669.33167594067;
MS[2][3]=415557.36210178735;
MS[3][3]=-887949.3903597901;
MS[4][3]=1222683.429277489;
MS[5][3]=-1125621.6298429987;
MS[6][3]=693087.6789995024;
MS[7][3]=-275315.9789805111;
MS[8][3]=64031.263211563564;
MS[9][3]=-6643.012896917331;
MS[0][4]=-10295.986591884688;
MS[1][4]=80033.95334715469;
MS[2][4]=-278309.4355481546;
MS[3][4]=568879.7403778358;
MS[4][4]=-753879.4482726704;
MS[5][4]=671948.955854952;
MS[6][4]=-402804.4178692342;
MS[7][4]=156520.86562098612;
MS[8][4]=-35747.20057950378;
MS[9][4]=3652.973655956846;
MS[0][5]=4869.492489779919;
MS[1][5]=-34932.77088633139;
MS[2][5]=113455.18811578595;
MS[3][5]=-219410.78820407012;
MS[4][5]=278498.51983734296;
MS[5][5]=-240251.07689581282;
MS[6][5]=140501.08966378385;
MS[7][5]=-53563.278206919495;
MS[8][5]=12050.142909520448;
MS[9][5]=-1216.518822903178;
MS[0][6]=-1453.8215043967496;
MS[1][6]=9202.974624523662;
MS[2][6]=-27125.31051875946;
MS[3][6]=48984.0779255225;
MS[4][6]=-59404.39106409031;
MS[5][6]=49708.69048012773;
MS[6][6]=-28453.61420425989;
MS[7][6]=10677.24706786986;
MS[8][6]=-2373.155499510543;
MS[9][6]=237.3026928367965;
MS[0][7]=261.763402246368;
MS[1][7]=-1333.3179198650093;
MS[2][7]=3395.6359013969536;
MS[3][7]=-5660.100333239391;
MS[4][7]=6580.23789410265;
MS[5][7]=-5366.250321797087;
MS[6][7]=3019.050180878038;
MS[7][7]=-1118.9572098668718;
MS[8][7]=246.39912195758868;
MS[9][7]=-24.4607157613077;
MS[0][8]=-25.460714720325484;
MS[1][8]=81.00000286680525;
MS[2][8]=-162.00000839327055;
MS[3][8]=252.0000146277292;
MS[4][8]=-283.5000169441327;
MS[5][8]=226.8000136016359;
MS[6][8]=-126.00000755090392;
MS[7][8]=46.28571705824496;
MS[8][8]=-10.125000610205486;
MS[9][8]=1.0000000605118988;
break;
case 11:
MS[0][0]=2755.708813923063;
MS[1][0]=-27557.14943146503;
MS[2][0]=124007.28692773407;
MS[3][0]=-330686.2216850549;
MS[4][0]=578700.9799177714;
MS[5][0]=-694441.225791903;
MS[6][0]=578701.0397565943;
MS[7][0]=-330686.3130231338;
MS[8][0]=124007.36551887417;
MS[9][0]=-27557.19191300513;
MS[10][0]=2755.7193797708724;
MS[0][1]=-15156.453710038399;
MS[1][1]=148808.7711189302;
MS[2][1]=-657238.8184179588;
MS[3][1]=1719568.5127699731;
MS[4][1]=-2951375.1197358803;
MS[5][1]=3472206.2023347165;
MS[6][1]=-2835635.1206939695;
MS[7][1]=1587294.303488103;
MS[8][1]=-582834.6306339896;
MS[9][1]=126763.08679211675;
MS[10][1]=-12400.736909788257;
MS[0][2]=36375.49294998427;
MS[1][2]=-348874.05238354206;
MS[2][2]=1505449.4229790873;
MS[3][2]=-3849188.677173003;
MS[4][2]=6458303.71243992;
MS[5][2]=-7430521.476103995;
MS[6][2]=5937472.760612538;
MS[7][2]=-3253953.326007992;
MS[8][2]=1170629.5532798572;
MS[9][2]=-249668.16763876288;
MS[10][2]=23974.75770122747;
MS[0][3]=-50016.30377847219;
MS[1][3]=465275.68241003546;
MS[2][3]=-1949643.9748061022;
MS[3][3]=4847200.186718032;
MS[4][3]=-7920102.70453687;
MS[5][3]=8888848.167640135;
MS[6][3]=-6940940.386316555;
MS[7][3]=3724189.262616246;
MS[8][3]=-1314230.0801947035;
MS[9][3]=275461.69903037715;
MS[10][3]=-26041.547146315686;
MS[0][4]=43477.7938248695;
MS[1][4]=-388250.47339152836;
MS[2][4]=1566572.5820172715;
MS[3][4]=-3763177.1048722574;
MS[4][4]=5962298.998097194;
MS[5][4]=-6511983.999972006;
MS[6][4]=4965775.8238222115;
MS[7][4]=-2610404.6878824816;
MS[8][4]=905117.3732730008;
MS[9][4]=-186862.56750307762;
MS[10][4]=17436.262605185348;
MS[0][5]=-24858.081141799048;
MS[1][5]=209755.87860633453;
MS[2][5]=-805299.9330677076;
MS[3][5]=1854019.0836004652;
MS[4][5]=-2835282.021739848;
MS[5][5]=3008250.0482657272;
MS[6][5]=-2240736.2385721547;
MS[7][5]=1155689.1406016597;
MS[8][5]=-394520.75883956446;
MS[9][5]=80404.72294716441;
MS[10][5]=-7421.84093231357;
MS[0][6]=9416.089800099779;
MS[1][6]=-73185.35504323905;
MS[2][6]=262664.3867743683;
MS[3][6]=-573726.1233227515;
MS[4][6]=843268.0746302117;
MS[5][6]=-868732.1078342504;
MS[6][6]=632939.2216486344;
MS[7][6]=-320949.5852403572;
MS[8][6]=108107.88682785886;
MS[9][6]=-21796.74721766224;
MS[10][6]=1994.2589041429296;
MS[0][7]=-2317.421027502781;
MS[1][7]=15855.67557283596;
MS[2][7]=-51751.090336530324;
MS[3][7]=105972.78169367975;
MS[4][7]=-149351.389904432;
MS[5][7]=149624.31014679497;
MS[6][7]=-106895.11055961814;
MS[7][7]=53425.94528997131;
MS[8][7]=-17797.686166000523;
MS[9][7]=3557.148550204529;
MS[10][7]=-323.1631911891835;
MS[0][8]=351.45307018711634;
MS[1][8]=-1928.9600123008472;
MS[2][8]=5465.153558558334;
MS[3][8]=-10382.49145052888;
MS[4][8]=14064.5182151348;
MS[5][8]=-13753.93660135639;
MS[6][8]=9668.011113262284;
MS[7][8]=-4776.168557479923;
MS[8][8]=1577.2248999968963;
MS[9][8]=-313.0937993344655;
MS[10][8]=28.28955151467235;
MS[0][9]=-29.289628804540595;
MS[1][9]=99.99966861051256;
MS[2][9]=-224.9990243648953;
MS[3][9]=399.99816780961174;
MS[4][9]=-524.997577522848;
MS[5][9]=503.9976780342598;
MS[6][9]=-349.99839099926646;
MS[7][9]=171.42778472055807;
MS[8][9]=-56.24974155250918;
MS[9][9]=11.111060073435317;
MS[10][9]=-0.9999953535129182;
break;
}
for(i=0; i<c; i++){
//PPX[i] = 0;
PPY[i] = 0;
for(q=0; q<c; q++){
//PPX[i] += MS[q][i]*xx[q];//et enfin on élabore les matrix de solution
PPY[i] += MS[q][i]*yy[q];
}}
//prendre T paramétrique static permet de ne pas recalculer de déterminant
t = (t-xx[0])/(xx[c-1]-xx[0]);
yj = 0;
for(q=0; q<c; q++){
//xj += PPX[q]*Math.pow(t,c-1 -q);
yj += PPY[q]*Math.pow(t,c-1 -q);
}
return yj
}
var ValuOf = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9};
function numberis(str){
this.N = new Array(1000);//entier
this.pf = 1;//position flottant la virgule
this.L = 1;//longueur chiffer
this.N[0] = 0;//nombre initial par defaul
this.s = 1;//signe, 1 = +, -1 = -
// parser les zéro de début et de fin
this.asign = function(s){//in string
var T = s.split(new RegExp("", "g"));//translateur
this.L = T.length;
this.pf = 0;
this.s = 1;
var repli=0;
for(var i=0; i<this.L; i++){
if(T[i]=="." || T[i]==","){
if(i==0 || (T[i-1]=="-" || T[i-1]=="+") ){this.N[i]=0;this.pf = 1}// détecter le "." en début et rajouté 0
else{this.pf = i-repli;repli+=1}
}
else if(T[i]=="-"){this.s = -1;repli+=1}
else if(T[i]=="+"){this.s = 1;repli+=1}
else{this.N[i-repli] = ValuOf[T[i]]}
}
this.L -=repli;
if(this.pf==0){this.pf=this.L}
}
this.txt = function(){// out string
var t = "";
if(this.s == -1){ t = "-" }
for(var i=0; i<this.L; i++){
if( this.pf==i ){t += "."}
t += this.N[i]
}
return t;
}
this.asign(str);
}
function MathN(){
function dif(a,b){
//return 0 si (<)
// 1 si (==)
// 2 si (>)
if(a.s!=b.s){//détecter le zéro pour une égalité possible
if(a.L==1 && b.L==1 && a.N[0]==0 && b.N[0]==0 ){return 1}//égaliter ds zéro
else if(a.s==1){return 2}//a est suppérieur
else{return 0}//a est inférieur
}else{//leurs signe sont identique
//comparaison de longueur, puis de terme, convergence dans une égalité possible
if(a.pf > b.pf){return 2}
else if(a.pf < b.pf){return 0}
else{//a.pf == b.pf entier de même longueur et de même signe
for(var i=0; i<a.pf; i++){//comparaison d'entier
if( a.N[i]<b.N[i] ){return a.s==1?0:2}//inversion par le signe
else if( a.N[i]>b.N[i] ){return a.s==1?2:0}
}
var x=0,y=0,dec = a.L>b.L?a.L:b.L;//longueur de queu la plus grande
for(var i=a.pf; i<dec; i++){//comparaison ds decimal
x = i<a.L?a.N[i]:0;//donné 0 quant ont se trouve à l'exterieur du tableau
y = i<b.L?b.N[i]:0;
if( x<y ){return a.s==1?0:2}
else if( x>y ){return a.s==1?2:0}
}
return 1;//égalité
}
}
}
//implenter templatisation
//var b;
// switch(typeof s){
// case "string": b = new numberis(s); break;
// case "object": b = s; break;
// }
this.IF = function(a,t,b){// "<" ">" ">=" "<=" "!=" "==" return true or false
var d = dif(a,b);
switch(t){
case "<": if(d==0){return true} break;
case ">": if(d==2){return true} break;
case "<=": if(d!=2){return true} break;
case ">=": if(d!=0){return true} break;
case "==": if(d==1){return true} break;
case "!=": if(d!=1){return true} break;
}
return false;
}
function Templatiseur(t){
switch(typeof t){
case "number": return new numberis(t.toString()); break;
case "string": return new numberis(t); break;
case "object": return t; break;
}
}
function optimis(a){
//optimiser le nombre enlever les zéro de fin et de début
var n = new numberis("0");
n.s=a.s;
var x=0,y=0,r=0,f=0,e=0;
for(var i=0; i<a.L; i++){
if(a.N[i]!=0 || r==1 || i==a.pf-1){
n.N[x] = a.N[i];
x++;
r=1;
}//zéro de début
if(a.N[a.L-i-1]==0 && a.L-i-1>=a.pf && e==0){f++}//zéro de fin
else if( a.N[a.L-i-1]!=0 ){e=1}
}
if(x==0){
n.L=1;
n.N[0]=0;
n.pf=1;
}else{
n.L = x-f;
n.pf= a.pf-(a.L-x);
if(n.pf<=0){n.pf=n.L}
}
return n
}
function add_(a,b){
// 111 111
// 896.8457
// 25.364985
// 922.210685
var n = new numberis("0");
var pos = Math.max(a.pf,b.pf);//entier
var dec = pos + Math.max(a.L-a.pf,b.L-b.pf);//decimal
n.L = dec;
n.pf= pos;
n.s = a.s;
var x=0,y=0,g=0,r=0;
for(var i=dec-1; i>=0; i--){
x = i>=pos-a.pf && i<a.L+(pos-a.pf) ? a.N[i-(pos-a.pf)]:0;
y = i>=pos-b.pf && i<b.L+(pos-b.pf) ? b.N[i-(pos-b.pf)]:0;
g = x + y +r;
r = Math.floor(g/10);
n.N[i] = g-r*10;
}
if(r!=0){
for(var i=0; i<n.L; i++){
n.N[i+1] = n.N[i];
}
n.L ++;
n.pf++;
n.N[0]=r;
}
return n;
}
function sou_(a,b){
//
// 896.8457
// 25.364985
// + 1 111
// 871.480715
var invers = dif(a,b);
var n = new numberis("0");
if(invers == 0){ [a,b]=[b,a]; n.s = -1}
else if(invers == 1){ return n }
var pos = Math.max(a.pf,b.pf);//entier
var dec = pos + Math.max(a.L-a.pf,b.L-b.pf);//decimal
n.L = dec;
n.pf= pos;
var x=0,y=0,g=0,r=0;
for(var i=dec-1; i>=0; i--){
x = i>=pos-a.pf && i<a.L+(pos-a.pf) ? a.N[i-(pos-a.pf)]:0;
y = i>=pos-b.pf && i<b.L+(pos-b.pf) ? b.N[i-(pos-b.pf)]:0;
if(x<(y+r)){x+=10;g = x - (y+r);r = 1;}else{g = x - (y+r);r=0}
n.N[i] = g;
}
return n;
}
this.A = function(c,o,d){//s = numberis or string , o = "+" "-" "*" "/" "%"
var a=Templatiseur(c);
var b=Templatiseur(d);
switch(o){
case "+"://adition
if((a.s==-1 && b.s==-1) || (a.s==1 && b.s==1)){
return optimis(add_(a,b));
}else{
if(a.s==-1){
a.s=1;
return optimis(sou_(b,a));
}else{
b.s=1;
return optimis(sou_(a,b));
}
}
break;
case "-"://soustraction
if(a.s==1 && b.s==1){
return optimis(sou_(a,b));
}else if(b.s==1 && a.s==-1){
return optimis(add_(b,a));
}else if(b.s==-1 && a.s==1){
b.s=1;
return optimis(add_(a,b));
}else if(b.s==-1 && a.s==-1){
b.s=1;
a.s=1;
return optimis(sou_(b,a));
}
break;
}
}
}
var MathN = new MathN();//classe de méthode mathématique
var br = new numberis("0");
br.asign("3.141592653589793238462643383");
PRINT("texty" , "\n"+br.txt() ,1);
var x = new numberis("+0");
var y = new numberis("-0");
PRINT("texty" , "\n"+MathN.IF(x,"==",y) ,1);
x.asign("-896.8457");//pépin
y.asign("-25.364985");
//br = MathN.A(y,"-",x);
br = MathN.A("-3.141592653589793238462643383","+","63.141592653589793238462643383");
PRINT("texty" , "\n"+br.txt() ,1);
function interpol_lagrange(c){//c = côté matrice
//Recherche des coefficiants
var i=0,q=0;
var PP = new Array(c); // coefficiants
var xx = new Array(c);
var yy = new Array(c);
for(i=0; i<c; i++){
xx[i] = rf(2)-1;
yy[i] = rf(2)-1;
PP[i] = 1;
for(z=0; z<c; z++){
if(i!=z){
PP[i] *= (i-z);//diviseur
}
}
}
//graphique
for(i=0; i<c; i++){//trace les points d'origine
U.point(v_(xx[i],yy[i]),0);
}
var z=0,k=0;
// construction de la courbe par 5 points
e1=v_(xx[0],yy[0]);
for(i=0; i<=10000; i++){
t = i/10000*(c-1);
xj = 0;
yj = 0;
for(q=0; q<c; q++){
k=1;
for(z=0; z<c; z++){
if(q!=z){
k *= (t-z);///(q-z);// (q-z) peut être précalculer en somme pour diviser le résultat final
}
}
k /= PP[q];
xj += xx[q]*k;
yj += yy[q]*k;
}
e = v_(xj,yj);
U.l(e1,e,2);
e1=e;
}
}
//data pr interpolation lagrang degré [2;196]
var lagrang = new Array(197);
for(var c=2; c<197; c++){
lagrang[c] = new Array(c);
for(var i=0; i<c; i++){
lagrang[c][i] = 1;
for(var q=0; q<c; q++){if(i!=q){lagrang[c][i] *= (i-q) }}
}
}
function interpol_lagrangeQ(c,t){//c = nombre de points, MM[] = signal [-1;1]
var y=0,i=0,q=0,PK=1, yy = new Array(c);
var splin = (1-(c%2)) + (c%2)*.5 -c/2;
var ti = t-Math.floor(t+splin);//point interpoler
if(ti%1!=0){
for(i=0; i<c; i++){
q = Math.floor(t+i+splin);
yy[i] = q<0 ? 0 : MM[ q ]
PK *= (ti-i)
}
for(q=0; q<c; q++){y += yy[q]*((PK/(ti-q))/lagrang[c][q]) }
return y
}else{
return MM[t]
}
}
function interpol_sinQ(c,t){//c=350 optimal
var y=0,k=0,x=0,
splin = Math.floor(t)-c/2;
for(var i=0; i<c; i++){
k = i+splin;
if( k>=0 ){
x = (k-t)*PI;
y += WAV.MS[ k ]*(x!=0 ? Math.sin(x)/x : 1);
}
}
return y
}
this.cut_band = function(f,f0,d){
//a = depart, b = fin, f = fréquence de coupure en Hz
//d = nombre de récurtion du filtre sur le signal
var fr = (f!=0 ? 22050/f : 1),
fr0= (f0!=0 ? 22050/f0 : 1);
//if(f<f0){[fr,fr0]=[fr0,fr]}
var MX = new Array(this.DSDS);
var MB = new Array(this.DSDS);
MX = this.MS;
this.interpol_sinQ = function(c,t,ff){//c=350 optimal
var y=0,k=0,x=0,
splin = Math.floor(t)-c/2;
for(var i=0; i<c; i++){
k = i+splin;
if( k>=0 && k<this.DSDS ){
x = (k-t)*PI /ff;
y += MX[ k ]*(x!=0 ? Math.sin(x)/x : 1);
}
}
return y /ff
}
for(var r=0; r<d; r++){//recursion
for(var i=0; i<this.DSDS; i++){
MB[i] = this.interpol_sinQ(1000,i,fr0) - this.interpol_sinQ(1000,i,fr);
}
MX = MB;
}
this.MS = MB;
}
/*
c = nombre de points
t = position paramétrique
f = fréquence de coupure soit f = 22050/f , spectre total avec f=1
M = tableau de points
*/
function interpol(c,t,f,M){//sinus cardinal
var y=0,k=0,x=0, splin = Math.round(t-c/2);
for(var i=0; i<c; i++){
k = i+splin;
if( k>=0 && k<M.length ){
x = (k-t)*PI /f;
y += M[ k ]*(x!=0 ? Math.sin(x)/x : 1)
}
}
return y /f
}
//
cut: function(f,f0,d){
//a = depart, b = fin, f & f0 = fréquence de coupure en Hz
//d = nombre de récurtion du filtre sur le signal
if(f0<f){[f,f0]=[f0,f]}
var o = -1;
if(f<=0 && f0>0 && f0<22050){o=0}//cut_haut
else if(f>0 && f<22050 && f0>=22050){o=1}//cut_bas
else if(f>0 && f<22050 && f0>0 && f0<22050 && f!=f0){o=2}//cut_band
if(o!=-1){
var MX = new Array(this.DSDS); to(MX,this.MS);
var MB = new Array(this.DSDS);
var fr = (f !=0 ? 22050/f : 1),
fr0= (f0!=0 ? 22050/f0 : 1);
for(var r=0; r<d; r++){//recursion
for(var i=0; i<this.DSDS; i++){
switch(o){
case 0:MB[i] = interpol(500,i,fr0,MX);break;
case 1:MB[i] = MX[i] - interpol(500,i,fr,MX);break;
case 2:MB[i] = interpol(500,i,fr0,MX) - interpol(500,i,fr,MX);break;
}
}
if(r<d-1){ to(MX,MB) }
}
this.MS = MB;
}
}
// ///Phaser effect
phaser_c: function(t0,t1,d){//phaser variation de pitche centré sur début
var MX = new Array(this.DSDS); to(MX,this.MS);
var MB = new Array(this.DSDS); to(MB,this.MS);
var phsed = 1.01;
for(var r=0; r<d; r++){//recursion
for(var i=0; i<this.DSDS; i++){
//phsed = 1+Math.sin(i/100000)*0.0001;
MB[i] = MX[i] + interpol(300,i*phsed,1,MX);
}
if(r<d-1){ to(MX,MB) }
}
this.MS = MB;
},
phaser_d: function(t0,t1,d,f){//phsaer décalage soustrai
//f = un entier positif, sinon il faut utiliser l'interpolation
var MX = new Array(this.DSDS); to(MX,this.MS);
var MB = new Array(this.DSDS); to(MB,this.MS);
for(var r=0; r<d; r++){//recursion
for(var i=0; i<this.DSDS-f; i++){
MB[i] = MX[i] - MX[i+f];//interpol(20,i+f,1,MX )
}
if(r<d-1){ to(MX,MB) }
}
this.MS = MB;
},
//calculer les positions de départ et de fin pour enlever les silences
var depart=0,fin=this.DSDS-1;
for(var i=0;i<this.DSDS;i++)
{ x = Math.round( this.MS[i]*m );
if(x!=0 ){depart=i;i=this.DSDS} }
for(var i=this.DSDS-1;i>=0;i--)
{ x = Math.round( this.MS[i]*m );
if(x!=0 ){fin=i;i=-1} }
var ds2 = fin-depart;
function para1(t){
return new vect2( Math.sin(t*71),
Math.sin(t*70) );
}
function volum_para1(v){
var a = Angl( v_(1,0),v );
var d = Vdistenc( v_(0,0),v )+(Math.sin(a*11)/2+.5)/8;
return gaus(Math.cos( d*10 )*15 , 1);
//return gaus( (Vdistenc( v, v_(0,0) )-0.5)*20 ,2);
}
var W = new WAV_specto(4,1);
W.voox(30000, 4,1.1 ,4,1000, PI2, para1,volum_para1);
PRINT("texty",W.out_str(),1);
voox: function(mu,xp,yp,sx,sy,vari , pa,volum_espac){//reconstitution d'onde paramétrique
//mu = iteration
//position xp,yp
//scal sx,sy
//vari = delatat du variateur paramétrique PI2
//pa = function(t) return vecteur x,y, position de la courbe
//volum_espace = function(v) return valeur [0;1] par position vecteur paramétrique
var v=0,xi=0,t=0,g=0, pr=0,al=1,
dur = mu*SPLR ,ml=mu*100,xold=-1,
td = vari /dur,//(PI/3*4)
a,b,c ,vp = v_(xp,yp), scal = v_(sx,sy);//position
a = echl(pa(t) ,vp,scal);
for(var i=1; i<=dur; i++){
t = i*td;
c = pa(t);
b = echl(c ,vp,scal);//calcule du point paramétrique
if(al*a.x < al*b.x){ [pr, al]=[0, -al] }//alternateur de la primitive
pr += b.y*(a.x-b.x);//primitive
xi = splat(b.x);
if( xi != xold && xi >= 0 ){
g = deriv(b,a)/200;//deriver
v = marg(i,ml,dur) /(1+g*g);
v *= volum_espac(c)//sans l'echel if( typeof volum_espac == "function" ){
this.sin_out(xi,pr,v);
xold = xi;
}
a=b;
}
},
function decoupe_phaseriser(z){
var tim = TIME();
//20s sample 20wav = NS_ERROR_OUT_OF_MEMORY:
//20s sample 4wav = succes 37:42
//11mins pr 40 band à 2 recurtion sur 3 secondes
var iter_band = 20, f_div = 22050/iter_band;
var n_W = parseInt(prompt("nombre de WAV\n"+z.du,4));
var t_v=0,f1_v=0,f2_v=0;
var e1 = new WAV_specto(z.du,1);//band spectral
var e2 = new WAV_specto(z.du,1);//phaserisation
var Wf = new Array(n_W);//collage de band phaseriser final
for(var i=0; i<n_W; i++){Wf[i] = new WAV_specto(z.du,1) }
for(var i=0; i<iter_band; i++){
to(e1.MS,z.MS);//e1.coller(0,z.du,z, 0,1 ,1,0,0);
e1.cut(f_div*i,f_div*(i+1) ,2);//band spectral
for(var p=0; p<n_W; p++){
to(e2.MS,e1.MS);
t_v = rf(1)+.01;
f1_v = Math.floor(rf(1000)+30);
f2_v = Math.floor(rf(1000)+30);
e2.phaser_g(0,1, 5,f1_v,f2_v, t_v);//phaserisation
Wf[p].coller(0,e2.du,e2, 0,1 ,1,0,0);
}
//PRINT("texty",e1.out_str(),1);
}
for(var i=0; i<n_W; i++){ PRINT("texty",Wf[i].out_str(),1) }
//PRINT("texty",z.out_str(),1);//JS || str
PRINT("fini" , "Calcul du WAV terminer !!<br>" + HEUR(TIME()-tim) ,0);
}
getdata("sample_importe/myckey3.wav",decoupe_phaseriser);
function getdata(fil,f){//f = function working
var A = new AudioContext(),
R = new XMLHttpRequest();
R.open("GET", fil, true);//"sample_importe/sample.wav"
R.responseType = 'arraybuffer';
R.onload = function(){
var Adata = R.response;
A.decodeAudioData(Adata,
function(buffer){
if(buffer['sampleRate']==44100){
var z = new WAV_specto(1,1);//creé un objet wav ici et travailer ici
z.du = buffer['duration'];
z.DSDS = buffer['length'];
z.ca = 1;// buffer['numberOfChannels'];
z.MS = buffer.getChannelData(0);//channel 1
f(z);//espace de travail
//PRINT("texty",z.out_JS(),1);//JS || str
}
},
function(e){"Error with decoding audio data" + e.err} );
}
R.send();
}
//
function WAV_specto(du){//mono canal ,du = duré
this.du = du;
this.DS = splat(du);
this.M = new Float64Array(this.DS);//évoluer faire un MG et MD
this.CLR();
}
function WAV_stereo(du){
this.du = du;
this.DS = splat(du);
this.G = new WAV_specto(du);//cannal gauche
this.D = new WAV_specto(du);// droite
}
function WAV_play(){
var A = new AudioContext(),S, AudioB;//mono, SPLR
this.play = function(){
S = A.createBufferSource();
S.buffer = AudioB;
S.connect(A.destination);//S.loop = true;
S.start(0);//start(0,position);
}
this.pause = function(){
S.stop(0);
}
this.get = function(wav){//exporte du WAV
if( typeof wav.M == "object" ){
var m = wav.max_ond(0,wav.DS);
if( m>0 ){ m = 1/m }
AudioB = A.createBuffer(1, wav.DS, SPLR);
var B = AudioB.getChannelData(0);//channel 0 = mono, 1 deuxième piste stéréo
for(var i=0;i<=wav.DS;i++){
B[i] = wav.M[i]*m;//lecture du sample sur la page
}
}else{
if( typeof wav.G.M == "object" && typeof wav.D.M == "object" ){
var m = Math.max(wav.G.max_ond(0,wav.DS),
wav.D.max_ond(0,wav.DS) );
if( m>0 ){ m = 1/m }
AudioB = A.createBuffer(2, wav.DS, SPLR);
var B = AudioB.getChannelData(0);//channel 0 = mono, 1 deuxième piste stéréo
C = AudioB.getChannelData(1);
for(var i=0;i<=wav.DS;i++){
B[i] = wav.G.M[i]*m;
C[i] = wav.D.M[i]*m;
}
}
}
}
}
var audio_set = new WAV_play();
audio_set.get(W);//mètre ici le wav à playé sur la page
var buttonpp=1;
function pp(){//function associer au button de play/pause
buttonpp *= -1;
if( buttonpp==1 ){
audio_set.pause();
PRINT("bbu" ,"Play");
}else{
audio_set.play();
PRINT("bbu" ,"Pause");
}
}
function(buffer){
if(buffer['sampleRate']==44100){
var z;//creé un objet wav ici et travailer ici
switch(buffer['numberOfChannels']){
case 1:
z = new WAV_specto(0);
z.du = buffer['duration'];
z.DS = buffer['length'];
z.M = buffer.getChannelData(0);
break;
case 2:
z = new WAV_stereo(buffer['duration']);
z.DS = buffer['length'];
z.G.M = buffer.getChannelData(0);
z.D.M = buffer.getChannelData(1);
//alert("stereo")
break;
}
f(z);//espace de travail
//PRINT("texty",z.out_str(),1);//JS || str
}
}
//Replace [add] par caracter d'incrémentation
function Vdum(obj,out){ for( var i in obj ){ out [add]= i [add] ": " [add] obj[i] [add] Vdum(obj[i],"\n")} return out}
function dump(obj){//var_dump
var out = obj [add] Vdum(obj,"\n"),pre = document.createElement('pre');
document.body.appendChild(pre); pre.innerHTML = out}
var PI = 3.141592653589793238462643383,//Math.acos(-1)
PI2 = PI*2;
PId2= PI/2;
function vect2(x,y){[this.x,this.y]=[x,y]}
function v_(x,y){return new vect2(x,y)}//reduit l'expression, possibiliter deviter le new
function vect3(x,y,z){[this.x,this.y,this.z]=[x,y,z]}
function v3_(x,y,z){return new vect3(x,y,z)}//reduit l'expression
function rr(x){ return Math.floor(Math.random()*x)}//int
function rf(x){ return Math.random()*x}//random float
function gaus(x){ return 1/(1[add]x*x*x*x)}
function c(x){ return x*x}
function sign(x){ if(x<0){ return -1 }else{ return 1 }}
function cadr(a,x,y){ if(a<x){ return x }else if(a>y){ return y }else{ return a }}
function Vdistenc(a,b){ return Math.sqrt( c(a.x-b.x) [add] c(a.y-b.y) ) }
function deriv(a,b){
if( a.x!=b.x ){
if( a.x>b.x ){ return (a.y-b.y)/(a.x-b.x)
}else{ return (b.y-a.y)/(b.x-a.x) }
}else{ return 1000000}
}
function Vrotat(v,a){//rotation de vect2, a = angle radian
var zs = Math.sin(a), zc = Math.cos(a);
return new vect2(v.x*zc [add] v.y*zs, v.y*zc - v.x*zs)
}
function Vscale(v,s){//scalair de vect2, s = multipliant
return new vect2(v.x*s, v.y*s)
}
function Angl(v, v1){//v = centre
if( v1.x> v.x && v1.y> v.y ){ return Math.atan((v1.y-v.y)/(v1.x-v.x)) }
else if( v1.x< v.x && v1.y> v.y ){ return PId2 - Math.atan((v1.y-v.y)/(v.x-v1.x))[add]PId2 }
else if( v1.x< v.x && v1.y< v.y ){ return Math.atan((v.y-v1.y)/(v.x-v1.x))[add]PI }
else if( v1.x> v.x && v1.y< v.y ){ return PId2 - Math.atan((v.y-v1.y)/(v1.x-v.x))[add]PI*3/2 }
else if( v1.x==v.x && v1.y==v.y ){ return 0 }
else if( v1.x==v.x && v1.y> v.y ){ return PId2 }
else if( v1.x==v.x && v1.y< v.y ){ return PI*3/2 }
else if( v1.x> v.x && v1.y==v.y ){ return 0 }
else if( v1.x< v.x && v1.y==v.y ){ return PI }
else{ return 0 }
}
var SPLR = 44100, PIcarr = PI*PI/4;
function fad(X,Y){ return (X/Y)/Y*(Y-X)}//fading volum début et fin de X sur [0;Y]
function splat(X){ return Math.floor(X*SPLR)}//temps en samplerat entier
function echl(v,vp,s){ return new vect2(v.x*s.x[add]vp.x,(v.y[add]vp.y)*s.y)}//mise à l'echelle du vecteur
function marg(i,m,d){//marge de debut et de fin du volum
if( i-1 < m ){//v = (i MOD 10000)/10000
return (i-1)/m
}else if( i > d-m ){
return 1-(i-(d-m))/m
}
}
function PRINT(a,txt,o){
switch(o){//0 remplace, 1 add
case 0:document.getElementById(a).innerHTML = txt;break;
case 1:document.getElementById(a).innerHTML [add]= txt;break;
}
}
function TIME(){ var d = new Date(); return d.getTime()}
function HEUR(x){//milisecond
x = Math.floor(x/1000);
var h = Math.floor(x/3600),
m = Math.floor( (x-h*3600)/60 ),
s = x-m*60-h*3600;
return h[add]":"[add]m[add]":"[add]s
}
/*Sinus Cardinal
c = nombre de points
t = position paramétrique
f = fréquence de coupure f=22050/f_Hz f=1 pr aucune perte du spectre
M = tableau de points*/
function interpol(c,t,f,M){
var i=0,y=0,k=0,x=0, splin = Math.round(t-c/2);
for(; i<c; i[add][add]){
k = i[add]splin;
if( k>=0 && k<M.length ){
x = (k-t)*PI /f;
y [add]= M[ k ]*(x!=0 ? Math.sin(x)/x : 1)
}
}
return y /f
}
function espac(n,w,h,s){ //"can",600,600 , 2
this.el = document.getElementById(n);
this.z = this.el.getContext("2d");
this.el.width = w; this.w = w; this.wd = w/2;
this.el.height= h; this.h = h; this.hd = h/2;
this.scal = s;
this.bg();
}
espac.prototype = {
scaladd: function(x){
this.scal = cadr(this.scal[add]x, 10,1000);
},
bg: function(){//arrière plant
this.z.fillStyle="#000";
this.z.fillRect(0,0,this.w,this.h);
},
point: function(a,c){
this.l(v_(a.x-.05,a.y),v_(a.x[add].05,a.y),2,c,1);
this.l(v_(a.x,a.y-.05),v_(a.x,a.y[add].05),2,c,1);
},
c: function(a,r,c,alpha){//trace un cercle
this.z.lineWidth=1;
this.z.fillStyle="rgba("[add]c.x[add]","[add]c.y[add]","[add]c.z[add]","[add]alpha[add]")";
this.z.beginPath();
this.z.arc(a.x*this.scal[add]this.wd, a.y*this.scal[add]this.hd, r*this.scal, 0, PI2);//, false
this.z.closePath();
this.z.fill();
},
l: function(a,b, e, c,alpha){//trace une lign avec un vecteur couleur, e = epaiseur
this.z.lineWidth=e;//2
this.z.strokeStyle="rgba("[add]c.x[add]","[add]c.y[add]","[add]c.z[add]","[add]alpha[add]")";
this.z.beginPath();
this.z.moveTo(a.x*this.scal[add]this.wd, a.y*this.scal[add]this.hd);
this.z.lineTo(b.x*this.scal[add]this.wd, b.y*this.scal[add]this.hd);
this.z.stroke();
},
parametrique: function(iter, vari, color,e,alpha, pa){//ajouté function volum_espac
var t,a,b;//iter = 300,vari = PI2;
b = pa(0);
for(var i=1;i<=iter;i[add][add]){
t = i/iter*vari;
a = pa(t);
U.l(b,a, e, color,alpha);
b=a;
}
}
}
function Vdistenc(a,b){ return Math.sqrt( c(a.x-b.x) [add] c(a.y-b.y) ) }
function deriv(a,b){
if( a.x!=b.x ){
if( a.x>b.x ){ return (a.y-b.y)/(a.x-b.x)
}else{ return (b.y-a.y)/(b.x-a.x) }
}else{ return 1000000}
}
function Vrotat(v,a){//rotation de vect2, a = angle radian
var zs = Math.sin(a), zc = Math.cos(a);
return new vect2(v.x*zc [add] v.y*zs, v.y*zc - v.x*zs)
}
function Vscale(v,s){//scalair de vect2, s = multipliant
return new vect2(v.x*s, v.y*s)
}
function Angl(v, v1){//v = centre
if( v1.x> v.x && v1.y> v.y ){ return Math.atan((v1.y-v.y)/(v1.x-v.x)) }
else if( v1.x< v.x && v1.y> v.y ){ return PId2 - Math.atan((v1.y-v.y)/(v.x-v1.x))[add]PId2 }
else if( v1.x< v.x && v1.y< v.y ){ return Math.atan((v.y-v1.y)/(v.x-v1.x))[add]PI }
else if( v1.x> v.x && v1.y< v.y ){ return PId2 - Math.atan((v.y-v1.y)/(v1.x-v.x))[add]PI*3/2 }
else if( v1.x==v.x && v1.y==v.y ){ return 0 }
else if( v1.x==v.x && v1.y> v.y ){ return PId2 }
else if( v1.x==v.x && v1.y< v.y ){ return PI*3/2 }
else if( v1.x> v.x && v1.y==v.y ){ return 0 }
else if( v1.x< v.x && v1.y==v.y ){ return PI }
else{ return 0 }
}
<canvas id="can" tabindex="1" ></canvas>
<script>
var U = new espac("can",800,800 , 300);//scal = 300,
function paraG(t){
var v = new vect2( Math.sin(t*10) ,
Math.sin(t*11) );
var disto = Vdistenc(v_(0,0), v);
var ang = Angl(v_(0,0), v);
disto = Math.sin(disto[add]ang*2);
disto = 1/(1[add]disto*disto);
v = Vscale(v,disto);
v = Vrotat(v,PI/4);
v = Vscale(v,.;
return v;
}
U.parametrique(100000, PI2, v3_(255,0,255),2,.4, paraG)
</script>
var W = new WAV_stereo(;
function paraG(t){
return new vect2( Math.sin(t*80),
Math.sin(t*81) );
}
function paraD(t){
return new vect2( Math.sin(t*81),
Math.sin(t*80) );
}
function volum_para1(v){
var a = Angl( v_(1,0),v );
var d = Vdistenc( v_(1,0),v )[add](Math.sin(a*11)/2 .5)/8;
return gaus(Math.cos( d*3 )*15 , 1);
//return gaus( (Vdistenc( v, v_(0,0) )-0.5)*20 ,2);
}
function voox_effect(){
W.G.voox(1000, v_(4,1) ,v_(4,4000),
PI2, paraG, volum_para1);
W.D.voox(1000, v_(4,1) ,v_(4,4000),
PI2, paraD, volum_para1);
PRINT("texty",W.out_str(),1);
}
#myProgress {
position: relative;
width: 30%;
height: 30px;
background-color: #ddd;
}
#myBar {
position: absolute;
width: 0%;
height: 30px;
background-color: #4CAF50;
}
<div id="myProgress"><div id="myBar"></div></div>
var tim = 0;
var elem = document.getElementById("myBar");
var widthw = 0, titi = TIME(),wwx=0;
function DoEvent_(){
//document.write( HEUR((TIME()-tim)/widthw*(100-widthw)) + "<br>" );
elem.style.width = widthw+'%';
PRINT("fini" , HEUR((TIME()-tim)/widthw*(100-widthw)) ,0);//temps restant
var wkk = window.open('','','left=0,top=100,width=10,height=10');
wkk.close();
}
function frameW(t){
widthw = t/2*100;
if(TIME()-titi > 60000){
titi=TIME();
if( Math.floor(widthw) != wwx ){
DoEvent_();
wwx=Math.floor(widthw)
}
}
}
//
//
//13
function disto13(v,r){
var d1 = Vdistenc(v_(r,0), v);
var sc = Math.sin(d1)/1.4;
var x = Vscale(v,sc);
return Vrotat(x,d1*2);
}
function paraG_13(t){
var v = new vect2( Math.sin(t*of) ,
Math.sin(t*od) );
return disto13(v,0);
}
function paraD_13(t){
var v = new vect2( Math.sin(t*od) ,
Math.sin(t*of) );
return disto13(v,.04);
}
function volum_defaul13(v){
var d = Vdistenc( v_(0,0),v );
return 1-gaus(d*2,2);
}
var WC = new WAV_stereo(8);
WC.G.voox(15000, v_(4,1) ,v_(4,j), PI2, paraG_13, volum_defaul13);
WC.D.voox(15000, v_(4,1) ,v_(4,j), PI2, paraD_13, volum_defaul13);
PRINT("texty",WC.out_str(),1);
function parametri(t,o,m,m1){
//o = option, m = maillage
//o = cerceau_ demande m,m1
switch(o){
case 0:case "g"://grille
return v_( Math.sin(t*m) ,
Math.sin(t*(m+1)) );
break;
case 1:case "r"://rosace
return v_( Math.sin(t*m)*(1+ Math.sin(t*(m+1)) ) ,
Math.cos(t*m)*(1+ Math.sin(t*(m+1)) ) );
break;
case 2:case "c"://cerceau
return v_( Math.sin(t*m)*(1+ m1*Math.sin(10.2*t*5) ) ,
Math.cos(t*m)*(1+ m1*Math.sin(10.2*t*5) ) );
break;
}
}
vect2.prototype = {
new: function(){
return v_(this.x,this.y)
},
polar: function(){
[this.x,this.y]=[this.y,this.x]
},
r: function(c,a){//rotation centré sur c
var zs = Math.sin(a), zc = Math.cos(a);
var b = v_(this.x-c.x,this.y-c.y);
this.x = b.x*zc + b.y*zs +c.x;
this.y = b.y*zc - b.x*zs +c.y;
},
s: function(a){//scalaire
this.x *= a;
this.y *= a;
},
d: function(b){//distence
return Math.sqrt( c(this.x-b.x) + c(this.y-b.y) )
},
a: function(b){//angle
return Angl(this, b)
},
deriv: function(b){//calcule de pente
return deriv(this, b)
}
}
function disto_a10(v){
var c = v_(.8,0);
var d = v.d(c);
var x = v.new();
x.r(c,d*2);//+PI/4
var c2 = v_(1,1);
x.x = x.a(c2)/PI*2-1;
x.y = (x.y-1)*.5+1;
x.y*=-1;
return x;
}
function volum_a10(v){
var d = v.d( v_(0,0) )
var x = 1-gaus(d)
return x
}
function paraG_a12(t){
var v = parametri(t,"r",20,.5);
var r = disto_a10(v);
return v3_(r.x,r.y, 1 )//v3_(r.x,r.y, volum_a10(v) )
}
function paraD_a12(t){
var v = parametri(t,"r",20,.5);v.polar();
var r = disto_a10(v);
return v3_(r.x,r.y, 1 )
}
//j = 1500
var WC = new WAV_stereo(2);//new WAV_specto(8);//
WC.G.voox(5121, v_(1,1) ,v_(1,j), PI2, paraG_a12);
WC.D.voox(5121, v_(1,1) ,v_(1,j), PI2, paraD_a12);
PRINT("texty",WC.out_str(),1);
//
para_paralel: function(iter, vari, color,e,alpha, pa){
var i=0,t,a;
for(;i<iter;i++){
t = i/iter*vari;
a = pa(t);
//a[3] = phase
U.l(a[0],a[1], e, color,alpha*a[2]);
}
}
function disto_14(v){
var c = v_(1,0);
var d = v.d( c );
var a = Math.sin( c.a(v)*15 )/6+1;
var x = v.new();
x.s(a);
return x;
}
function para_14(t){
var v = parametri(t,"cr",1,1);
var v1 = parametri(t+PI/2,"cr",1,1);
var c = v_(0,0);
//v.r(c,PI/2);
//v1.r(c,PI/4);
v.p(v_(-2,0));
v1.p(v_(2,0));
v.s(.25);
v1.s(.25);
v = disto_14(v);
//v1 = disto_14(v1);
var vol = Math.sin(t*50)/2+.5;
return [v,v1,vol,0]
}
//U.reper();
U.para_paralel(5000, PI2, v3_(255,255,255),2,.03, para_14)
//
sin_out: function(i,f,v){//sin de frequence et écrit à position i
this.M[i] += Math.sin(f*PI2)*v
},
//la beauté algorithmique,
//une architecture parfaite, ne correspondant cas du savoir, un esprit partout présent en lui n'importe où
//qui sais tout, qui comprend tout qui ressent tout, par ce qu'il la créé, il n'y a aucun hasard, pas de pensé
// pas de mystère, aucun secret si ce n'est l'esprit lui même, éternel et immuable,
t: function( a,b, Volum, iph){// Tracé ligne spectral
//volum = function(v) return [-1;1]
var [X,Y, X1,Y1] = [a.x,a.y, b.x,b.y],
len = Math.abs(splat(X1-X));
if( len>=3 && X>=0 && X1>=0 ){//cette chaine de conditionnel ne sert à rien ,
var ph = iph, t,f,v;
if( X>X1 ){ [X,X1,Y,Y1]=[X1,X,Y1,Y];
ph += X-X1 }
var g1 = (Y1-Y)/(X1-X),
g = g1/2,
xph = X;
[X,X1] = [splat(X),splat(X1)];//ajouter encadrement tableau ce qui servirait à rien
for(var i=X; i<=X1; i++ ){
t = i/SPLR - xph;
f = g*(t-ph) + Y;
v = Volum(v_( t+xph , g1*t+Y )) * fad(i-X,len);
this.sin_out(i,(t+ph)*f, v);
//this.ocil_out(i,(t+ph)*fr ,v);
}
}
},
// différence sur 2 dérivés proche dans les dérivés statique la précision peut être plus légère
voox: function(mu,vp,scal,vari , pa){//reconstitution d'onde paramétrique
//mu = iteration
//vp = position v_( xp,yp )
//scal = v_( sx,sy )
//vari = delatat du variateur paramétrique PI2
//pa = function(t) return vect3 x,y, position de la courbe
// .z = volum [-1;1] par vecteur paramétrique
var v,xi,t,g, pr=0,al=1,
dur = mu*SPLR ,ml=mu*100,xold=-1,
td = vari /dur, a,b,c;
a = echl(pa(t) ,vp,scal);
for(var i=1; i<=dur; i++){
t = i*td;
c = pa(t);//calcule du point paramétrique
b = echl(c ,vp,scal);
if(al*a.x < al*b.x){ [pr, al]=[0, -al] }//alternateur de la primitive
pr += b.y*(a.x-b.x);//primitive
xi = splat(b.x);
if( xi != xold && xi >= 0 && xi < this.DS){
g = deriv(b,a)/200;//deriver
v = marg(i,ml,dur)*c.z /(1+g*g);
this.sin_out(xi,pr,v);
xold = xi;
}
a=b
}
},
paralel: function(iter,vp,scal,vari, pa,volum){
var i=0,t,a ,b,c;
for(;i<iter;i++){
t = i/iter*vari;
a = pa(t);
b = echl(a[0] ,vp,scal);
c = echl(a[1] ,vp,scal);
//a[0] = vect2 1
//a[1] = vect2 2
//a[2] = phase
this.t(b,c, volum,a[2]);
}
},
function interpol_carre(v,M){//utilisation possible pour la normalisation
var a = v_(cadr(v.x,0,M.length-2 ),
cadr(v.y,0,M[0].length-2));//encadrement
var x = Math.floor(a.x), x2 = x+1,
y = Math.floor(a.y), y2 = y+1;
a.p(v_(-x,-y));
var x1= 1-a.x, y1= 1-a.y;
var r = (M[x][y] *x1 + M[x2][y] *a.x)*y1 +
(M[x][y2]*x1 + M[x2][y2]*a.x)*a.y;
return r;
}
function interpol_carre_img(v,M){//utilisation possible pour la qualité des rotation
var a = v_(cadr(v.x,0,M.length-2 ),
cadr(v.y,0,M[0].length-2));//encadrement
var x = Math.floor(a.x), x2 = x+1,
y = Math.floor(a.y), y2 = y+1;
a.p(v_(-x,-y));
var x1= 1-a.x, y1= 1-a.y;
var r = (M[x][y] [0]*x1 + M[x2][y] [0]*a.x)*y1 +
(M[x][y2][0]*x1 + M[x2][y2][0]*a.x)*a.y;
var g = (M[x][y] [1]*x1 + M[x2][y] [1]*a.x)*y1 +
(M[x][y2][1]*x1 + M[x2][y2][1]*a.x)*a.y;
var b = (M[x][y] [2]*x1 + M[x2][y] [2]*a.x)*y1 +
(M[x][y2][2]*x1 + M[x2][y2][2]*a.x)*a.y;
return [r,g,b]
}
Echel_normal: function(centre,rayon, B){//vect2 position cerclular normalisateur
var mi=100000,ma=-100000,vr;
var [X,Y, X1,Y1] = [cadr(Math.round(centre.x-rayon.x),0,this.w),
cadr(Math.round(centre.y-rayon.y),0,this.h),
cadr(Math.round(centre.x+rayon.x),0,this.w),
cadr(Math.round(centre.y+rayon.y),0,this.h)];
for(var r=X; r<X1; r++){
for(var u=Y; u<Y1; u++){
vr = v_((r-centre.x)/rayon.x,(u-centre.y)/rayon.y);
z = vr.d(v_(0,0));
if( z < 1 ){
z = 1-c(z*z*z*z);
//z = (1-Math.sin((z-0.5)*PI))/2;
//z = z*z;
mi = Math.min(mi,B.M[r][u][0]/z,B.M[r][u][1]/z,B.M[r][u][2]/z);
ma = Math.max(ma,B.M[r][u][0]*z,B.M[r][u][1]*z,B.M[r][u][2]*z);
}
}}
return [mi,ma-mi]
},
Echel_carre: function(divis,iter){
//mise à l'échelle par interpolation 2point carré
// iter = 5 est assez bon
var x = this.w/divis,
y = this.h/divis,
B = this.new(),n;
var Jm = new Array(divis+1), Jl = new Array(divis+1);
for(var i=0;i<=divis;i++){
Jm[i] = new Array(divis+1); Jl[i] = new Array(divis+1)}
for(var r=0; r<=divis; r++){
for(var u=0; u<=divis; u++){
n = this.Echel_normal(v_(r*x,u*y),v_(x*racineD2,y*racineD2),B);
Jm[r][u] = n[0];//mini
Jl[r][u] = n[1];//delta
}}
var mi,l,v, t,vi;
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
v = v_(r/x,u/y);
mi =0; l =0;
for(var i=0; i<iter; i++){//calcule un cercle de point de brouillar
t = i/iter*PI2;
vi = v.new();
vi.p(v_(Math.cos(t) ,Math.sin(t) ));//*rayon
mi+= interpol_carre(vi,Jm);
l += interpol_carre(vi,Jl);
}
mi/= iter;
l /= iter;
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] =
[ (B.M[r][u][0]-mi)/l ,(B.M[r][u][1]-mi)/l ,(B.M[r][u][2]-mi)/l ];
}}
//this.Echel(v_(0,0),v_(this.w,this.h));//mise à l'échelle absolut
},
rotation: function(v,rayon,an,d){//ajouté envoi de function distortion
var [X,Y, X1,Y1] = [cadr(Math.round(v.x-rayon),0,this.w),
cadr(Math.round(v.y-rayon),0,this.h),
cadr(Math.round(v.x+rayon),0,this.w),
cadr(Math.round(v.y+rayon),0,this.h)];
//alert([X,Y, X1,Y1]);
var xl = X1-X, yl = Y1-Y;
var B = new imgbuffer(xl,yl);
for(var r=X; r<X1; r++){
for(var u=Y; u<Y1; u++){
[B.M[r-X][u-Y][0],B.M[r-X][u-Y][1],B.M[r-X][u-Y][2]] =
[this.M[r][u][0],this.M[r][u][1],this.M[r][u][2]];
}}
var vr,z=0,z1=1,xp,yp, color,rt,gt,bt, dr=d*d,d2=.5-1/(d*2);
xl--; yl--;
for(var r=X; r<X1; r++){
for(var u=Y; u<Y1; u++){
vr = v_(r,u);
z = vr.d(v);
if( z < rayon ){
z = z/rayon;
z = 1-c(z*z*z*z);
//z = (1-Math.sin((z-0.5)*PI))/2;
//z = 1-z*z;
z1=1-z;
//récurtion inutil pour les rotation standar, mais utile pour les distortions comme spiral
rt=0; gt=0; bt=0;
for(var xr=0; xr<d; xr++){//recution
for(var yr=0; yr<d; yr++){
vr = v_(r+xr/d-d2,u+yr/d-d2);
vr.r(v,an);//+(vr.d(v)/rayon)
vr.x-=X;//xp = cadr(Math.round(vr.x-X),0,xl);
vr.y-=Y;//yp = cadr(Math.round(vr.y-Y),0,yl);
color = interpol_carre_img(vr,B.M);//interpolation carré
rt += this.M[r][u][0]*z1 + color[0]*z;//B.M[xp][yp][0]*z;
gt += this.M[r][u][1]*z1 + color[1]*z;//B.M[xp][yp][1]*z;
bt += this.M[r][u][2]*z1 + color[2]*z;//B.M[xp][yp][2]*z;
}}
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] =
[ rt/dr , gt/dr , bt/dr ];
/* xp = cadr(Math.round(vr.x-X),0,xl);//nature
yp = cadr(Math.round(vr.y-Y),0,yl);
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] =
[ this.M[r][u][0]*z1 + B.M[xp][yp][0]*z ,
this.M[r][u][1]*z1 + B.M[xp][yp][1]*z ,
this.M[r][u][2]*z1 + B.M[xp][yp][2]*z ];*/
}
}}
},
var text_random = "//RANDOM_POINT\n",c_random=0,o_random=-1;
function rf(x){
var number=0;
if(o_random==-1){//génère du random
number = Math.random();
text_random += " RF_list["+ c_random +"]="+ number +";\n";
c_random++;
}else{//lie le tableau random
number = RF_list[c_random%RF_list.length];
c_random++;
}
return number*x
}
var N = B.new_zoom(.1);//ZOOOOOM
var A = N.new();
var C = N.new();
o_random=-1;
new_zoom: function(scal,iter){
iter = defaul(iter,10);
var ray = (scal-1)/(scal*(1+Math.floor(scal)) );// équivalence explicite (1/scal)*(scal-1)/(1+Math.floor(scal))
var B = new imgbuffer(this.w*scal, this.h*scal);
var v,vi,t,mi,l;
for(var r=0; r<B.w; r++){
for(var u=0; u<B.h; u++){
v = v_(r/scal,u/scal);
if(iter>0){//iteration sur un cercle
mi =[0,0,0]; l =[0,0,0];
for(var i=0; i<iter; i++){//calcule un cercle de point brouillard
t = i/iter*PI2;
vi = v.new();
vi.p(v_(Math.cos(t)*ray ,Math.sin(t)*ray ));
mi = interpol.carre_img(vi,this.M);
l = [l[0]+mi[0],l[1]+mi[1],l[2]+mi[2]];
}
[B.M[r][u][0],B.M[r][u][1],B.M[r][u][2]] =
[l[0]/iter,l[1]/iter,l[2]/iter];
}else{
switch(iter){
case 0://proche voisin
v = v_(Math.floor(v.x),Math.floor(v.y));
[B.M[r][u][0],B.M[r][u][1],B.M[r][u][2]] =
[this.M[v.x][v.y][0],this.M[v.x][v.y][1],this.M[v.x][v.y][2]]
break;
case -1://réal unique point
[B.M[r][u][0],B.M[r][u][1],B.M[r][u][2]] =
interpol.carre_img(v,this.M);
break;
}
}
}}
return B
},
function effet(B){
var tim = TIME();
var N = B.new(.1);
var A = N.new();
var C = N.new();
o_random=1;
//A.RGB_permut(2,1,0);
//A.C(B,"s");
//A.gris(1);
//C = B.new();
//N.n_et_b(.3);
//C.n_et_b(.5);
//N.C(C,"s");
//
//C = B.new();
//C.n_et_b(.7);
//N.C(C,"s");
//A.C(N,"egal");
//A.gris(1);
//A.n_et_b(.7);
//A.glitched(8,7);
var densiter = 2000;
var ray = Math.floor( A.w/150* 20 );
//A.rotat_multy(densiter, ray,5,3, 1);
A.rotat_multy2(densiter, ray,5,3, 1);
for(var i=0; i<1; i++){
C.C(N,"egal");
C.rotat_multy2(densiter, ray,5,3, 1);
A.C(C,"s");
}
//A.C(C,"m");//intéressant avec une inversion de contraste
//A.rotation(v_(A.wd,A.hd),50,PI/4,1);
//A.C(C,"s");
//A.gris(1);
//A.Echel_interpol(10,11);
A.Echel_carre(25,30);
//A.Echel_carre_rgb(30,30);
PRINT("export" , "\n//\n RF_list = new Array("+c_random+");"+text_random+"//",0);
PRINT("texty" , "Calcul terminer !!<br>" + HEUR(TIME()-tim) ,0);
return A;
}
function enter(){
//
bufferat("can","importe_image/boreal.png",effet);
}
enter();
vect3.prototype = {
new: function(){return v3_(this.x,this.y,this.x)},
d: function(b){ return Math.sqrt( c(this.x-b.x) + c(this.y-b.y) + c(this.z-b.z) )},//distence
N: function(){//normalise
var g = this.d(v3_(0,0,0));
if( g == 0 ){ g = 1 }
[this.x,this.y,this.z] = [this.x/g,this.y/g,this.z/g]
},
VN: function(b){// calcule de la Normal d'un plan défini par 2 vect3, soit une face
//var [X1,Y1,Z1, X2,Y2,Z2, X3,Y3,Z3] =
//[0,0,0, this.x,this.y,this.z, b.x,b.y,b.z];
//[a.x,a.y,a.z,b.x,b.y,b.z,c.x,c.y,c.z];
/*var v1 = this.new(),//v3_( X2-X1 , Y2-Y1 , Z2-Z1 );
v2 = b.new();//v3_( X3-X1 , Y3-Y1 , Z3-Z1 );
var asx = v1.y*v2.z - v1.z*v2.y;
var bsx = v1.z*v2.x - v1.x*v2.z;
var csx = v1.x*v2.y - v1.y*v2.x;
//dsx = -v1.y*v2.z*X1 -v1.z*v2.x*Y1 -v1.x*v2.y*Z1 +v1.y*v2.x*Z1 +v1.z*v2.y*X1 +v1.x*v2.z*Y1;
var vn = v3_(asx ,bsx ,csx);*/
var vn = v3_( this.y*b.z - this.z*b.y ,
this.z*b.x - this.x*b.z ,
this.x*b.y - this.y*b.x );
vn.N();
return vn
}
}
polaire: function(angle){
angle = defaul(angle,0);
var x = this.w-1,
y = this.h-1,
Ro;
var v1,v2,k, l,an,z;
//constrate polaire par normalisation du point en vect3
for(var r=1; r<x; r++){
for(var u=1; u<y; u++){
for(var i=0; i<3; i++){
//vecteur polaire par derivation du point
// faire un effet moyen de 4 normals ou plus pour interpoler
v1 = v3_( 1, 0, this.M[r+1][u][i] - this.M[r][u][i] );
v2 = v3_( 0, 1, this.M[r][u+1][i] - this.M[r][u][i] );
k = v1.VN(v2);
l = v_(k.x,k.y);
an = l.a(v_(0,0));
z = l.d(v_(0,0));//1;//
//effet sur le reper polaire
an = Math.sin(an*10+angle)/2+.5;
this.M[r][u][i] = an*z
}
}}
},
function effet(B){
var A = B.new(.5);
o_random=-1;
A.gris();
A.polaire();
A.Echel_carre(25,30);
return A;
}
raymarch: function(s){
s = defaul(s,1);
var distord = 5,
perspectiv = 1.5,
profondeur = 10,
seuil_form = 0,
antial = 3;//recution de l'antialisating
var d,ray,k,x,y,z,v,v1,vp, t,t1,
xd = this.w/2,
yd = this.h/2,
scal = 12*s,
iter = 40,//100pluto bon
c_sphA = v3_(0,0,0),
c_sph = new Array(distord);
for(var i=0; i<distord; i++){
c_sph[i] = v3_( rf(4)-2, rf(4)-2, rf(4)-2);
}
var mr,md;
var lightx = v3_(1000,1000,1000),
lighty = v3_(-10,10,10),
lightz = v3_(1,-1,1);
mr = new mat3(rf(PI)+.2,rf(PI),rf(PI));
//mr = new mat3(PI/4,PI/2,PI/4);
//start function
function form1(n){
//n.p(v3_(0,-2,0));
n.r(c_sphA,mr);
for(var i=0; i<distord; i++){
d = n.d(c_sph[i]);//distance de distortion
d = d/3;
d = 4/(1+d*d);
md = new mat3(d,d,d);
n.r(c_sph[i],md);
//n.s(c_sph[i],1-d);
}
ray = 1-n.d(c_sphA);
return 1/(1+ray*ray)
}
function iterat(r,u){
v = v3_((r-xd)/scal,(u-yd)/scal, profondeur);
v1 = v3_((r-xd)/scal*perspectiv,(u-yd)/scal*perspectiv,-profondeur);
[t,k,x,y,z] = [0,0,0,0,0];
for(var i=0; i<iter; i++){
t += (1/iter)/(1+k*10);//distanc filed à l'arache
vp = v.bary(v1,t);
k = form1(vp.new());
}
if(k>seuil_form){
var vni = lightx.new();
vni.sp(vp);
vni.N();
var vni1 = lighty.new();
vni1.sp(vp);
vni1.N();
var vni2 = lightz.new();
vni2.sp(vp);
vni2.N();
vp.p(v3_(0.001,0,0));
var vk1 = v3_(0.001,0,form1(vp.new())-k);
vp.p(v3_(-0.001,0.001,0));
var vk2 = v3_(0,0.001,form1(vp.new())-k);
var vn = vk1.VN(vk2);
x = Math.abs( vn.produit(vni) );
y = Math.abs( vn.produit(vni1) );
z = Math.abs( vn.produit(vni2) );
}
return [x,y,z]
}
//end function
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] = iterat(r,u);
}}
//détection d'aliasing convolution
var B = this.new();
var pixel,pk,
antial_d = antial*antial;
for(var r=1; r<this.w-1; r++){
for(var u=1; u<this.h-1; u++){
pixel = [0,0,0];
for(var i=0; i<3; i++){
x = B.M[r][u][i];
pixel[i] = Math.max(
Math.abs( (x - B.M[r-1][u-1][i]) ) ,
Math.abs( (x - B.M[r-1][u] [i]) ) ,
Math.abs( (x - B.M[r-1][u+1][i]) ) ,
Math.abs( (x - B.M[r] [u-1][i]) ) ,
Math.abs( (x - B.M[r] [u] [i]) ) ,
Math.abs( (x - B.M[r] [u+1][i]) ) ,
Math.abs( (x - B.M[r+1][u-1][i]) ) ,
Math.abs( (x - B.M[r+1][u] [i]) ) ,
Math.abs( (x - B.M[r+1][u+1][i]) ) );
}
if(Math.max(pixel[0],pixel[1],pixel[2])>0.45){//seuil de détection
pk = [0,0,0];
for(var g=0; g<antial; g++){
for(var l=0; l<antial; l++){
k = iterat(r+g/antial,u+l/antial);
pk[0] += k[0];
pk[1] += k[1];
pk[2] += k[2];
}}
pk[0] /= antial_d;
pk[1] /= antial_d;
pk[2] /= antial_d;
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] = pk;//[1,1,1];//
}
}}
},
(http://i.imgur.com/zelj9po.png?1)/*graindo le 10/07/2016*/
moyen_carre: function(v,M,iter){//faire pareil pour carre_img
var t,k = 0,r,vi, a,x,y,x2,y2,x1;
var li = v_(M.length-1,M[0].length-1);
for(var i=0; i<iter; i++){//calcule un cercle de point de brouillar
t = i/iter*PI2;
for(var u=1; u<=iter; u++){
r = u/iter;
//k += this.carre( v_( v.x+Math.cos(t)*r , v.y+Math.sin(t)*r ) ,M)*r;
a = new vect2(cadr(v.x+Math.cos(t)*r,0,li.x),//encadrement
cadr(v.y+Math.sin(t)*r,0,li.y));
x = Math.floor(a.x); x2 = Math.min(x+1,li.x);
y = Math.floor(a.y); y2 = Math.min(y+1,li.y);
a.x-=x; a.y-=y;
x1= 1-a.x;
k += ((M[x][y] *x1 + M[x2][y] *a.x)*(1-a.y) +
(M[x][y2]*x1 + M[x2][y2]*a.x)*a.y )*r;
}
}
return k/(iter*(iter+1)/2)
},
(http://i.imgur.com/dFL0qUn.png?1) /*
idé de généré une miniature pour ensuite interpoler une matrice de z aproximatif
et itéré ensuite en basse résolution
mon nez c'est le king of asymétrique
*/
raymarch: function(s){
s = defaul(s,1);
var distord = 50,//rflist1=25,rflist2=50,list3 100
perspectiv = 1.5,
profondeur = 10,
divis_mini = 5,//reduction pr la miniature
seuil_form = 0;//.5
var d,ray,k,x,y,z,v,v1,vp,vm, t,
xd = this.w/2,
yd = this.h/2,
scal = 3*15*s,//18 pr tête alien,12pr visag peur,16pr beauté liste2*3
iter_t = 35,//100pluto bon, 100 en scal10 donne 7h30 pr beauté
iter_root = 0,//2
c_sphA = v3_(0,0,0),
c_sph = new Array(distord),
s_sph = new Array(distord);
for(var i=0; i<distord; i++){
c_sph[i] = v3_( rf(4)-2, rf(4)-2, rf(4)-2);
s_sph[i] = rf(4)-2;
}
mr = new mat3(rf(PI)+.2,rf(PI),rf(PI));
//mr = new mat3(PI/4,PI/2,PI/4);
var mr,md;
//var lightx = v3_(10,10,10),
// lighty = v3_(-10,10,10),
// lightz = v3_(0,0,1);//v3_(1,-1,1);
//var lightx = v3_(0,0,3),
// lighty = v3_(0,0,2),
// lightz = v3_(0,0,1);
var lightx = v3_(-3,-3,3),
lighty = v3_(-2,-2,2),
lightz = v3_(-1,-1,1);
var deplace = v3_(-2.5,-2,0);//v3_(-1.2,-2.5,0);
lightx.r(c_sphA,mr);
lighty.r(c_sphA,mr);
lightz.r(c_sphA,mr);
lightx.sp(deplace);
lighty.sp(deplace);
lightz.sp(deplace);
deplace = v3_(-1,-1,0);
//start function
function form1(n){
//n.p(v3_(-.45,-.2,0));//for liste1
//n.p(v3_(.2,-1.1,0));//for liste2 beauté
//n.p(v3_(.2 -1.7,-1 -.5,0));//for liste2 beauté
n.p(deplace);
n.r(c_sphA,mr);
for(var i=0; i<distord; i++){
d = n.d(c_sph[i]);//distance de distortion
d = 2*s_sph[i]/(1+d*d);
n.r(c_sph[i], new mat3_s(d) );
//n.s(c_sph[i],1+Math.sin(d*20)/5);
}
ray = 1-n.d(c_sphA);//objet sphère
return 1/(1+ray*ray)
}
function iterat_l(r,u){//calcule light classic
v = v3_((r-xd)/scal,(u-yd)/scal, profondeur);
v1 = v3_((r-xd)/scal*perspectiv,(u-yd)/scal*perspectiv,-profondeur);
[t,k,x,y,z] = [0,0,0,0,0];
for(var i=0; i<iter_t; i++){
t += (1/iter_t)/(1+k*10);//distanc filed à l'arache
vp = v.bary(v1,t);
k = form1(vp.new());
}
if(k>seuil_form){
vp.p(v3_( 0.001,0 ,0));
var vk1 = v3_(0.001,0 ,form1(vp.new())-k);
vp.p(v3_(-0.001,0.001,0));
var vk2 = v3_(0 ,0.001,form1(vp.new())-k);
var vn = vk1.VN(vk2);
x = Math.abs( vn.produit(lightx.Nc(vp)) );
y = Math.abs( vn.produit(lighty.Nc(vp)) );
z = Math.abs( vn.produit(lightz.Nc(vp)) );
}
return [x,y,z]
}
function iterat(r,u){//light à partir de la miniature
v = v3_((r-xd)/scal,(u-yd)/scal, profondeur);
v1 = v3_((r-xd)/scal*perspectiv,(u-yd)/scal*perspectiv,-profondeur);
[t,k,x,y,z] = [0,0,0,0,0];
//interpolation de la miniature de t
vm = v_(r/divis_mini,u/divis_mini);
t = //mini_t[Math.floor(vm.x)][Math.floor(vm.y)];
//mini_t[r][u];
//interpol.carre_blur(vm,mini_t, divis_mini*2 ,divis_mini);
//interpol.carre(vm,mini_t);
interpol.moyen_carre(vm,mini_t,6);
//interpol.sincv(21,vm,1,mini_t);
vp = v.bary(v1,t);
k = form1(vp.new());
//
//désamorcer pour inutiliter relative
/*for(var i=0; i<iter_root; i++){//utiliser un aletranteur basser sur la différence
t += (1/iter_root/100)/(1+k*10);//distanc filed à l'arache
vp = v.bary(v1,t);
k = form1(vp.new());
}*/
if(k>seuil_form){
vp.p(v3_(0.001,0,0));
var vk1 = v3_(0.001,0,form1(vp.new())-k);
vp.p(v3_(-0.001,0.001,0));
var vk2 = v3_(0,0.001,form1(vp.new())-k);
var vn = vk1.VN(vk2);
x = Math.abs( vn.produit(lightx.Nc(vp)) );
y = Math.abs( vn.produit(lighty.Nc(vp)) );
z = Math.abs( vn.produit(lightz.Nc(vp)) );
}
return [x,y,z]
}
function iterat_t(r,u){//function pour la miniature des t
v = v3_((r-xd)/scal,(u-yd)/scal, profondeur);
v1 = v3_((r-xd)/scal*perspectiv,(u-yd)/scal*perspectiv,-profondeur);
[t,k] = [0,0];
for(var i=0; i<iter_t; i++){
t += (1/iter_t)/(1+k*10);//distanc filed à l'arache
k = form1( v.bary(v1,t) );
}
return t
}
//end function
var mini_w = Math.floor(this.w/divis_mini),
mini_h = Math.floor(this.h/divis_mini),
mini_t = new Array(mini_w+1);//miniature des t
for(var r=0; r<=mini_w; r++){
mini_t[r] = new Array(mini_h+1);
for(var u=0; u<=mini_h; u++)
mini_t[r][u] = iterat_t(r*divis_mini,u*divis_mini);
}
//antialias de la miniature deverait être utile
function antialias_mini(seuil_alias,antial,B){
//antial = recution de l'antialisating
var pixel,pk,
antial_d = antial*antial;
for(var r=1; r<mini_w-1; r++){
for(var u=1; u<mini_h-1; u++){
pixel = interpol.convo_differentiel(v_(r,u),mini_t);
if(pixel>seuil_alias){//seuil de détection
pk = 0;
for(var g=0; g<antial; g++){
for(var l=0; l<antial; l++){
pk += iterat_t((r+g/antial)*divis_mini,(u+l/antial)*divis_mini);
}}
pk /= antial_d;
mini_t[r][u] = pk;//1;//
}
}}
}
//antialias_mini(.1,3);
//premier construction
var i_minit;
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
//vm = v_(r/divis_mini,u/divis_mini);
//i_minit = interpol.sincv(21,vm,1,mini_t);
//i_minit = interpol.carre( vm ,mini_t);
//i_minit = interpol.moyen_carre(vm,mini_t,5);
//i_minit = interpol.carre_blur(vm,mini_t, divis_mini*2 ,divis_mini);
//i_minit = mini_t[Math.floor(vm.x)][Math.floor(vm.y)];
this.M[r][u] =
iterat(r,u);
//iterat_l(r,u);
//[i_minit,i_minit,i_minit];
}}
//détection d'aliasing par convolution
function antialias(seuil_alias,antial,B){
//antial = recution de l'antialisating
var pixel,pk,
antial_d = antial*antial;
for(var r=1; r<B.w-1; r++){
for(var u=1; u<B.h-1; u++){
pixel = interpol.convo_differentiel(v_(r,u),B.M);
if(Math.max(...pixel)>seuil_alias){//seuil de détection
pk = [0,0,0];
for(var g=0; g<antial; g++){
for(var l=0; l<antial; l++){
k = iterat(r+g/antial,u+l/antial);
pk[0] += k[0];
pk[1] += k[1];
pk[2] += k[2];
}}
pk[0] /= antial_d;
pk[1] /= antial_d;
pk[2] /= antial_d;
B.M[r][u] = pk;//[1,1,1];//
}
}}
}
antialias(.3,3,this);
},/*graindo le 10/07/2016*/
// utilisation
this.M[r][u] =
contrasted(iterat(r,u),5);
//
flou: function(rayon,iter){
rayon = defaul(rayon,1);//valeur par defaul
iter = defaul(iter,rayon*2);
var t,v, o,or,di, a,x,y,x2,y2,x1,y1,
dmetr = rayon*2,
li = v_(this.w-1,this.h-1),
B = this.new();
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
//optimisation possible avec pré-calcule de la matrice distance et fading
v = new vect2(r,u);
var k = [0,0,0];
di=0;
for(var p=0; p<iter; p++){//par damier avec gaussienne
t = p/iter*dmetr - rayon;
for(var q=0; q<iter; q++){
o = q/iter*dmetr - rayon;
a = new vect2(v.x+t,v.y+o);
if( a.x>=0 && a.x<=li.x && a.y>=0 && a.y<=li.y ){//encadrement conditionnel
or = v.d(a);
if(or<=rayon){
x = Math.floor(a.x); x2 = Math.min(x+1,li.x);
y = Math.floor(a.y); y2 = Math.min(y+1,li.y);
//or = 1;
or = or/rayon;
//or = 1-or;
or = (1-Math.sin((or-0.5)*PI))/2;//un sinus plutôt qu'un gaussienne pour des dériver optimal
a.x-=x; a.y-=y;
x1 = 1-a.x; y1 = 1-a.y;
k[0] += ((B.M[x][y] [0]*x1 + B.M[x2][y] [0]*a.x)*y1 +
(B.M[x][y2][0]*x1 + B.M[x2][y2][0]*a.x)*a.y )*or;
k[1] += ((B.M[x][y] [1]*x1 + B.M[x2][y] [1]*a.x)*y1 +
(B.M[x][y2][1]*x1 + B.M[x2][y2][1]*a.x)*a.y )*or;
k[2] += ((B.M[x][y] [2]*x1 + B.M[x2][y] [2]*a.x)*y1 +
(B.M[x][y2][2]*x1 + B.M[x2][y2][2]*a.x)*a.y )*or;
di+=or;
}
}
}
}
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] =
[ k[0]/di,k[1]/di,k[2]/di ];
}}
},
carre_img: function(v,M){//utilisation possible pour la qualité des rotation
var li = v_(M.length-1,M[0].length-1),//y avait -1 avant
a = v_(cadr(v.x,0,li.x),//encadrement
cadr(v.y,0,li.y)),
x = Math.floor(a.x), x2 = Math.min(x+1,li.x),
y = Math.floor(a.y), y2 = Math.min(y+1,li.y);
a.p(v_(-x,-y));
var x1= 1-a.x, y1= 1-a.y;
var r = (M[x][y] [0]*x1 + M[x2][y] [0]*a.x)*y1 +
(M[x][y2][0]*x1 + M[x2][y2][0]*a.x)*a.y,
g = (M[x][y] [1]*x1 + M[x2][y] [1]*a.x)*y1 +
(M[x][y2][1]*x1 + M[x2][y2][1]*a.x)*a.y,
b = (M[x][y] [2]*x1 + M[x2][y] [2]*a.x)*y1 +
(M[x][y2][2]*x1 + M[x2][y2][2]*a.x)*a.y;
return [r,g,b]
},
moyen_carre_img: function(v,M,iter){
var t,k = [0,0,0],r,vi, a,x,y,x2,y2,x1;
var li = v_(M.length-1,M[0].length-1);
for(var i=0; i<iter; i++){//calcule un cercle de point de brouillar
t = i/iter*PI2;
for(var u=1; u<=iter; u++){
r = u/iter;
a = new vect2(cadr(v.x+Math.cos(t)*r,0,li.x),//encadrement
cadr(v.y+Math.sin(t)*r,0,li.y));
x = Math.floor(a.x); x2 = Math.min(x+1,li.x);
y = Math.floor(a.y); y2 = Math.min(y+1,li.y);
a.x-=x; a.y-=y;
x1= 1-a.x;
k[0] += ((M[x][y][0]*x1 + M[x2][y][0] *a.x)*(1-a.y) +
(M[x][y2][0]*x1 + M[x2][y2][0]*a.x)*a.y )*r;
k[1] += ((M[x][y][1]*x1 + M[x2][y][1] *a.x)*(1-a.y) +
(M[x][y2][1]*x1 + M[x2][y2][1]*a.x)*a.y )*r;
k[2] += ((M[x][y][2]*x1 + M[x2][y][2] *a.x)*(1-a.y) +
(M[x][y2][2]*x1 + M[x2][y2][2]*a.x)*a.y )*r;
}
}
var di = (iter*(iter+1)/2);
k[0] /= di;
k[1] /= di;
k[2] /= di;
return k
},
new: function(scal,iter){//contient zoom
scal = defaul(scal,1);
//(1/scal)*(scal-1)/(1+Math.floor(scal))
var ray = (scal-1)/(scal*(1+Math.floor(scal)) );
if(ray==0){iter=0}else{iter = defaul(iter,10)}
var B = new imgbuffer(this.w*scal, this.h*scal);
var decalx = (1-(scal-1)/B.w)/scal,
decaly = (1-(scal-1)/B.h)/scal;
var v,vi,t,mi,l;
for(var r=0; r<B.w; r++){
for(var u=0; u<B.h; u++){
if(iter>0){//iteration sur un cercle
v = v_(r*decalx ,u*decaly );
if(ray>0){//zoom bluré pr évité les carrés blur
[ B.M[r][u][0],B.M[r][u][1],B.M[r][u][2] ] =
interpol.moyen_carre_img(v,this.M,iter);
}else{//miniature
mi =[0,0,0]; l =[0,0,0];
for(var i=0; i<iter; i++){//calcule un cercle de point de brouillar
t = i/iter*PI2;
vi = new vect2(v.x+Math.cos(t)*ray,
v.y+Math.sin(t)*ray);
mi = interpol.carre_img(vi,this.M);
l = [l[0]+mi[0],l[1]+mi[1],l[2]+mi[2]];
}
[ B.M[r][u][0],B.M[r][u][1],B.M[r][u][2] ] =
[l[0]/iter,l[1]/iter,l[2]/iter];
}
}else{
switch(iter){
case 0://proche voisin
v = v_(Math.floor(r/scal),Math.floor(u/scal) );
[ B.M[r][u][0],B.M[r][u][1],B.M[r][u][2] ] =
[this.M[v.x][v.y][0],this.M[v.x][v.y][1],this.M[v.x][v.y][2]]
break;
case -1://réal unique point
v = v_(r*decalx ,u*decaly );
[ B.M[r][u][0],B.M[r][u][1],B.M[r][u][2] ] =
interpol.carre_img(v,this.M);
break;
}
}
}}
return B
},
var canvas,gl,
squareVerticesBuffer,
shaderProgram,
vertexPositionAttribute;
function start(file){
var image = new Image();
image.src = file;//"TEXTURE/T1.png";
image.onload = function(){
instenc(image);
}
}
function instenc(image){
canvas = document.getElementById("glcanvas");
[canvas.width,canvas.height] = [640,480];//dimension
gl = null;
try{// Initialize GL context
gl = canvas.getContext("webgl", {preserveDrawingBuffer: true}) ||
canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true});
}catch(e){}
if(gl){
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clearDepth(1.0);
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LEQUAL);
initShaders();
initBuffers();
drawScene(image);//setInterval(drawScene, 20);
}else{
alert("Unable to initialize WebGL !");
}
}
function initBuffers(){
squareVerticesBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
var vertices = [
1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
}
function initShaders(){
var fragmentShader = getShader(gl, "shader-fs");
var vertexShader = getShader(gl, "shader-vs");
shaderProgram = gl.createProgram();// Create the shader program
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
if(!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)){
alert("Unable to initialize the shader program: " gl.getProgramInfoLog(shader));
}
gl.useProgram(shaderProgram);
vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(vertexPositionAttribute);
}
function getShader(gl, id){
var shaderScript = document.getElementById(id);
if(!shaderScript){ return null }
var theSource = "";
var currentChild = shaderScript.firstChild;
while(currentChild){
if(currentChild.nodeType == 3){
theSource = currentChild.textContent;
}
currentChild = currentChild.nextSibling;
}
var shader;
if(shaderScript.type == "x-shader/x-fragment"){
shader = gl.createShader(gl.FRAGMENT_SHADER);
}else if(shaderScript.type == "x-shader/x-vertex"){
shader = gl.createShader(gl.VERTEX_SHADER);
}else{
return null
}
gl.shaderSource(shader, theSource);// Send the source to the shader object
gl.compileShader(shader);// Compile the shader program
if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)){
alert("An error occurred compiling the shaders: " gl.getShaderInfoLog(shader));
return null
}
return shader;
}
function drawScene(image){
gl.activeTexture(gl.TEXTURE0);
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
var u_image0Location = gl.getUniformLocation(shaderProgram, "img");
gl.uniform1i(u_image0Location, 0);
// lookup uniforms
var resolutionLocation = gl.getUniformLocation(shaderProgram, "resolution");
var textureSizeLocation = gl.getUniformLocation(shaderProgram, "textureSize");
var kernelLocation = gl.getUniformLocation(shaderProgram, "M[0]");
gl.uniform2f(textureSizeLocation, image.width, image.height);
gl.uniform2f(resolutionLocation, canvas.width, canvas.height);
var tabl_RANDOM = [2.0,3.0,4.0,8.0,2.0,1.0,5.0,4.0,7.0,5.0,1.0,4.0,6.0];//test bidon
gl.uniform1fv(kernelLocation, tabl_RANDOM);
//reste de draw
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
void main(void){
gl_Position = vec4(aVertexPosition, 1.0);
}
</script>
<script id="shader-fs" type="x-shader/x-fragment">
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 resolution;
uniform vec2 textureSize;
uniform sampler2D img;
uniform float M[12];
void main(void){
vec2 p = gl_FragCoord.xy/resolution.xy;//textureSize.xy;
p.xy = (sin(p.xy * 10.0 ) 1.0)/2.0;
vec4 c = texture2D(img, p);
gl_FragColor = c;
//gl_FragColor = vec4(c.rgb/M[2], 1.0);
}
</script>
vec4 moyen_img(vec2 v){
float t,r;
vec4 s,k;
vec2 a;
for(int i=0; i<5; i++){
t = float(i)/5.0*PI2;
for(int u=1; u<=5; u++){
r = float(u)/5.0;
a = vec2(v.x+cos(t)*r/textureSize.x,
v.y+sin(t)*r/textureSize.y);
s = texture2D(img, a);
k.x+=s.x*r;
k.y+=s.y*r;
k.z+=s.z*r;
}
}// k/(iter*(iter+1)/2)
return vec4(k.xyz/15.0,s.w);
}
j'ai pas encore d'exemple sur le web avec moyen_img() , y a encore une 30ène de choas interpoler nature GPU à upload avant , j'en fait des tonnes ont y reviendra pas 2 fois j’évolue trop vite, function canvas_rnd(n,w,h){
var el = document.getElementById(n),
z = el.getContext("2d");
z.canvas.width = w; z.canvas.height = h;
z.fillStyle="#000"; z.fillRect(0,0,w,h);
D = z.getImageData(0,0,w,h);
var j;
for(var r=0; r<h; r++){
for(var u=0; u<w; u++){
j = (r*w+u)*4;
D.data[j] = Math.floor(Math.random()*256);
D.data[j+1]= Math.floor(Math.random()*256);
D.data[j+2]= Math.floor(Math.random()*256);
}}
z.putImageData(D,0,0);
}
function canvas_img(n,file){
var II = new Image();
II.src = file;
II.onload = function(){
var el = document.getElementById(n),
z = el.getContext("2d"),
w = II.width, h = II.height;
z.canvas.width = w; z.canvas.height = h;
z.drawImage(II,0,0);
}
}
canvas_rnd("rndcanvas",100,100);
uniform sampler2D rnd;
float RF_n = 0.0;
float RF(void){//random function
float y = floor(RF_n/100.0);
float x = RF_n-y*100.0;
vec4 r = texture2D(rnd, vec2(x/100.0,y/100.0));
if(RF_n>10000.0){RF_n=0.0;}else{RF_n++;}
return (r.x*255.0+r.y*65025.0+r.z*16581375.0 )/16777216.0;
}
vec3 chaos1( vec2 v ,vec2 d){
float t = 1.0,fac;
v = rotation(v,centr,an);
v = vec2(v.x+d.x,v.y+d.y );
for(int r=0; r<80; r++){
fac = RF()*1.0+1.0;
t += sin( (v.x*RF()) * fac +cos(t+v.y*RF() ) +sin(t+v.x*RF() ) )
*cos( (v.y*RF()) * fac +sin(t+v.x*RF() ) +cos(t+v.y*RF() ) )
*(1.0-float(r)/80.0);
t = sin(t*PId2*(RF()*0.5+1.0) );//1.3*
}
return vec3(v,
//t
( sin(t*3.0*PI) +1.0)/2.0
);
}
var N_tex = 0;
function charg_texture(img,nom){
gl.activeTexture(gl.TEXTURE0+N_tex);//2ème texture
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
//gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
var imageLocation = gl.getUniformLocation(shaderProgram, nom);
gl.uniform1i(imageLocation, N_tex);//2ème texture
N_tex++;
}
charg_texture(image,"img");
charg_texture(document.getElementById("rndcanvas"),"rnd");
vec2 rotation(vec2 v,vec2 c,float a){// centré sur c
float zs = sin(a), zc = cos(a);
vec2 b = vec2(v.xy-c.xy);
return
vec2( b.x*zc + b.y*zs +c.x,
b.y*zc - b.x*zs +c.y );
}
scal = 44100.0;
t = (gl_FragCoord.y*resolution.x+resolution.x-gl_FragCoord.x)/scal;
/*256 +255*256 +255*65536 +255*16777216 = 4294967296*/
//valu vari de [0 à 1]
float f = floor(valu*16777216.0);
c.x=floor(f/65536.0);
c.y=floor((f-c.x*65536.0)/256.0 );
c.z=floor(f-c.x*65536.0-c.y*256.0 );
c.x/=255.0;
c.y/=255.0;
c.z/=255.0;
gl_FragColor = c;
this.M[mj]=( D.data[j]*65536
+D.data[j+1]*256
+D.data[j+2])/16777216-.5;
precision highp float;
#extension GL_ARB_gpu_shader_fp64 : enable
float wav_get( float t ){//valu wav sample entrer
vec2 s;
t=floor(t-reso.x/2.0);
s.y = floor(t/reso.x);
s.x = t-s.y*reso.x ;
vec4 v = texture2D(wav,
//vec2(gl_FragCoord.x/reso.x ,
// (reso.y-gl_FragCoord.y)/reso.y ));
vec2((s.x+.5)/reso.x ,
(s.y+.5)/reso.y ));
return (floor(v.x*255.0)*65536.0
+floor(v.y*255.0)*256.0
+floor(v.z*255.0))/16777216.0
*2.0-1.0;
}
/*Interpolation Sinus Cardinal
f = fréquence de coupure f=22050/f_Hz
f=1 pr aucune perte du spectre*/
float interpol( float t, float f){
float y=0.0,k=0.0,x=0.0,
splin = floor(t - 100.0/2.0);
for(int i=0; i<100; i++){
k = float(i)+splin;
if( k>=0.0 && k<reso.x*1000.0 ){
x = (k-t)*PI /f;
if(x==0.0){
y += wav_get( k );
}else{
y += wav_get( k )*sin(x)/x;
}
}
}
return y /f;
}
float t = (gl_FragCoord.x+100.) *reso.y /20.;
float k,j, valu=0.;
float interval = 3000./reso.y;
float fr = 22050./ ( (gl_FragCoord.y+.5)*interval );
float fr1 = 22050./ ( (gl_FragCoord.y-.5)*interval );
for(int i=0; i<15; i++){
k = float(i)/15.*50.;
j = abs( interpol(t+k,fr )
-interpol(t+k,fr1) );
valu += j;
}
valu = valu *15.;
uniform vec2 reso;
uniform vec2 Textur_reso;
uniform sampler2D wav;
uniform sampler2D rnd;
float RF_n = 0.;
float RF(void){//random function
float y = floor(RF_n/100.);
float x = RF_n-y*100.;
vec4 r = texture2D(rnd, vec2(x/100.,y/100.));
if(RF_n>10000.){RF_n=0.;}else{RF_n++;}
return (r.x*255.+r.y*65025.+r.z*16581375. )/16777216.;
}
vec4 wav_out( float v ){
//256 +255*256 +255*65536 +255*16777216 = 4294967296
//v sur [0 à 1], sortie 24bits
vec4 c = vec4(0.,0.,0.,1.);
if(v<0.){v=0.;}//saturateur
else if(v>1.){v=1.;}
float f = floor(v*16777216.);
c.x=floor(f/65536.);
c.y=floor((f-c.x*65536.)/256. );
c.z=floor(f-c.x*65536.-c.y*256. );
c.x/=255.;
c.y/=255.;
c.z/=255.;
return c;
}
float wav_get( float t ){//valu wav sample entrer
vec2 s;
t = floor(t-Textur_reso.x/2.);
s.y = floor(t/Textur_reso.x);
s.x = t-s.y*Textur_reso.x ;
vec4 v = texture2D(wav,
//vec2(gl_FragCoord.x/reso.x , (reso.y-gl_FragCoord.y)/reso.y ));
vec2((s.x+.5)/Textur_reso.x ,
(s.y+.5)/Textur_reso.y )
);
return (floor(v.x*255.)*65536.
+floor(v.y*255.)*256.
+floor(v.z*255.))/16777216.
*2.-1.;
}
/*Interpolation Sinus Cardinal
f = fréquence de coupure f=22050/f_Hz
f==1 pr aucune perte du spectre*/
float interpol( float t, float f){
float y=0.,k=0.,x=0.,
splin = floor(t - 100./2.);
for(int i=0; i<100; i++){
k = float(i)+splin;
if( k>=0. && k<Textur_reso.x*1000. ){
x = (k-t)*PI /f;
if(x==0.){
y += wav_get( k );
}else{
y += wav_get( k )*sin(x)/x;
}
}
}
return y /f;
}
float orga_1( float t ){
float f = 0.;
for(int r=0; r<5; r++){
f += tan(sin(
f-t *RF()*5.
))
*(RF()+0.3)
// *(1.0-fr3/5.)
// *(1.0-float(r)/100.0)
;
}
return f;
}
float sequenc( float tr, float ti, float grain ){
/* sequenc(t, 1.5, 1000. )
tr = real time
ti = longueur [1;2] = agrandi,
grain = fréquence sequenceur
*/
//t = tr+floor(tr/ti)*ti;//set sequence racourcisement
float t = tr-floor(tr/(ti*grain))*grain;
float t2= tr-floor( (tr+(ti*grain)/2.)/(ti*grain))*grain;
float v = abs(asin(sin(tr/(ti*grain)*PI )))/PId2;//fading triangular
float f =// wav_get( t )*v
//+wav_get( t2 )*(1.-v);
interpol(t,1.)*v
+interpol(t2,1.)*(1.-v);
return f;
}
void main(void){//delay
scal = 44100.;
float t = (reso.y-gl_FragCoord.y)*reso.x
+gl_FragCoord.x;
RF_n = 5.;
float k,j,g,valu=0.;
//valu = sequenc(t, 1.1, 10000. );
//interpol(t*2.,1.);
float fr,fr1,fr7,fr8,fr9=0.;
fr1 = t+20.*scal;
float vi = 0.;
for(int r=0; r<15; r++){
fr1 = fr1 - 5000.;
vi = 1.-float(r)/16. ;
fr9 = float(r)*300.;
float fr = orga_1(t/scal);// /2.+.5) *12050.;
float fr7 = orga_1(t/scal);// /2.+.5) *12050.;
float fr8 = orga_1(t/scal);// /2.+.5) *12050.;
fr9 += fr8*.05;
if(canal == 0){
//valu += interpol( fr1 ,1.)*vi;
valu += sequenc(fr1*.8, 1.4+fr*0.01, fr9+1825. )*vi;
}else if(canal == 1){
//valu += interpol( fr1 ,1.)*vi;
valu += sequenc(fr1*.8, 1.4+fr7*0.01, fr9+1825. )*vi;
}
}
gl_FragColor = wav_out(valu/10.5+.5);
}
var wav_f = new WAV_stereo(40);
wav_f.shad(z,"shader-fs");
wav_f.shad(wav_f,"shader-fs");//petite fractalisation
wav_f.shad(z,["shader-tete","shader-main"]);
//wav_f.shad(wav_f,["shader-tete","shader-main2"]);
//creat kick par singularité de phase
var SPLR = 44100;
var W = new WAV_specto(1); //wav buffer mono
var a,phaz,x,t,v,hau=1200;
for(var r=1;r<hau;r++){
x = r/150+.6; //repère de la courbe
phaz = //phase ajouté
//-Math.sin(x*2)*.1+ //une modularité possible
50/(1+x*x*x) //gaussienne courbe primaire du kick
;
v = 1; //volum
a = hau-r;
//if(r<20){v=r/20} //fad du pied
if(a<500){v=a/500} //fad de la tête
for(var u=0;u<SPLR;u++){ //addition de sin
t = (u/SPLR +.7) * r+phaz;
W.M[u] += Math.sin(t*PI2)*v;
}
}
PRINT("texty",W.out_str(),1);
vec4 flou_30(vec2 v){
float ray = 30.;
float dmetr = ray*2.;
float x,y,or,di;
vec3 k = vec3(0.,0.,0.);
vec4 j;
di=0.;
for(int r=0; r<60; r++){
x = v.x+( float(r)-ray );
for(int u=0; u<60; u++){
y = v.y+( float(u)-ray );
if( x>=0. && x<=resolution.x && y>=0. && y<=resolution.y ){//encadrement
or = sqrt( (v.x-x)*(v.x-x) + (v.y-y)*(v.y-y) );
if(or<=ray){
//or = 1;
or = or/ray;
//or = 1-or;
or = (1.-sin((or-.5)*PI))/2.;
j = texture2D(img, vec2(x/resolution.x,y/resolution.y));
k.x += j.x*or;
k.y += j.y*or;
k.z += j.z*or;
di += or;
}
}
}}
return vec4(k.xyz/di,1.);
}
vec4 negatif_lumier(vec4 c){
float gri = (c.x+c.y+c.z)/3.;
return vec4(
abs((c.x-gri)+(1.-gri)),
abs((c.y-gri)+(1.-gri)),
abs((c.z-gri)+(1.-gri)),1.);
}
void main(void){//flou
vec2 p = vec2(
gl_FragCoord.x ,
resolution.y-gl_FragCoord.y );//textureSize.x
//vec4 cd = vec4(0.,0.,0.,1.);
//cd = texture2D(img, p);
vec4 cd = flou_10(p);
vec4 cd1 = flou_20(p);
vec4 cd2 = flou_30(p);
cd.x = abs(abs(cd.x-cd1.x)-cd2.x);
cd.y = abs(abs(cd.y-cd1.y)-cd2.y);
cd.z = abs(abs(cd.z-cd1.z)-cd2.z);
cd = negatif_lumier(cd);
cd = gris(cd,1.);
//cd = marg(cd,0.3,1.5);
cd = contraste(cd,3.);
gl_FragColor = cd
;
}
vec4 flou_op(vec2 v){
float ray = 10.,
ray1= 20.,
ray2= 30.;
float x,y,or,rx,ry,
di=0.,di1=0.,di2=0.,
z;
vec3 c = vec3(0.,0.,0.),
c1= vec3(0.,0.,0.),
c2= vec3(0.,0.,0.);
vec4 j;
for(int r=0; r<60; r++){
x = v.x+( float(r)-ray2 );
rx = (v.x-x)*(v.x-x);
for(int u=0; u<60; u++){
y = v.y+( float(u)-ray2 );
j = texture2D(img, vec2(x/resolution.x,y/resolution.y));
ry = v.y-y;
or = sqrt( rx + ry*ry );
z = or>ray2 ? 0. : (1.-sin((or/ray2-.5)*PI))/2.;
//z = or/ray2; z = 1./(z*z*z*z+1.);
c2.xyz += j.xyz*z;
di2 += z;
z = or>ray1 ? 0. : (1.-sin((or/ray1-.5)*PI))/2.;
//z = or/ray1; z = 1./(z*z*z*z+1.);
c1.xyz += j.xyz*z;
di1 += z;
z = or>ray ? 0. : (1.-sin((or/ray-.5)*PI))/2.;
//z = or/ray; z = 1./(z*z*z*z+1.);
c.xyz += j.xyz*z;
di += z;
}}
c.xyz /= di;
c1.xyz /= di1;
c2.xyz /= di2;
c.xyz = abs(abs(c.xyz-c1.xyz)-c2.xyz);
return vec4(c.xyz,1.);
}
RF_n = floor(sin(v.x/PI)*1000.+1000.)+
floor(cos(v.y/PI)*1000.+1000.);
for(int r=0; r<50; r++){
for(int u=0; u<50; u++){
y = v.y+( float(u)+RF() )*s -ray4;
x = v.x+( float(r)+RF() )*s -ray4;
j = texture2D(img, vec2(x/resolution.x,y/resolution.y));
vec4 calque_cote(vec4 x,vec4 y){
vec3 k = vec3(
x.xyz*x.xyz*x.xyz*x.xyz + y.xyz*y.xyz*y.xyz*y.xyz );
k = sin(k.xyz)*k.xyz*3.;
return vec4(
1.-1./(k.xyz*k.xyz+1.),1.);
}
void main(void){//effet saturation double flou
vec2 p = vec2(
gl_FragCoord.x ,
resolution.y-gl_FragCoord.y );//textureSize.x
vec4 cr = moyen_img( vec2(p.x/resolution.x,p.y/resolution.y) );
vec4 cd = //vec4(0.,0.,0.,1.)
flou_op(p,PI)
;
vec4 cb = cd;//flou_op(p,1.);
cb = negatif_lumier(cb);
cb = contraste(cb,6.);
cb = gris(cb,1.);
cd = negatif_lumier(cd);
cd = contraste(cd,cb.x*10.);
//cd = gris(cd,1.);
cd = marg(cd,.1,.8);
cd = //ecran(cd,cr);
//assombrir(cd,cr);
superposition(cr,cd);
//calque_cote(cd,cr);
//cd = gris(cd,1.);
//cd = contraste(cd,0.7);
gl_FragColor = cd
;
}
(https://img1.lght.pics/2fda92e34ac63f53a46a7559738b451d.png)(https://img2.lght.pics/cba339ae737a1d60d13eed6c594fe689.png) void main(void){//flou horizontal delay
vec2 p = vec2(gl_FragCoord.x, resolution.y-gl_FragCoord.y );
vec4 k,cd = //texture2D(img,vec2(p.x/resolution.x,p.y/resolution.y));
vec4(0.,0.,0.,1.);
// vec4 cd1 = vec4(0.,0.,0.,1.), cd2 = vec4(0.,0.,0.,1.);
//RF_n = p.y;
float di=0.,j,jy,x,f = 150./float(recur);
vec2 vp;
float g = 0.;
for(int r=0; r<500; r++){
j = float(r)-250. ;
jy = float(r)-250. ;
jy = jy/float(recur);
jy = sin(jy/f)*f;
x = j/f;
g = //1.-float(r)/30.;
1./(1.+x*x) ;//+ abs(sin(x/30.));
vp = vec2((p.x+j)/resolution.x,(p.y+jy)/resolution.y);
k = texture2D(img,vp);
cd.xyz = cd.xyz + k.xyz*g;
di+=g;
//vp = vec2((p.x+j/2.)/resolution.x,(p.y+jy)/resolution.y);
//k = texture2D(img,vp);
//cd1.xyz = cd1.xyz + k.xyz*g;
//
//vp = vec2((p.x+j/4.)/resolution.x,(p.y+jy)/resolution.y);
//k = texture2D(img,vp);
//cd2.xyz = cd2.xyz + k.xyz*g;
}
cd.xyz /= di/1.;
//cd1.xyz /= di/7.;
//cd2.xyz /= di/7.;
//cd2.xyz = abs(cd2.xyz-cd1.xyz);
//cd.xyz = abs(cd2.xyz-cd.xyz);
//cd = negatif_lumier(cd);
//vec4 cr = tex_distord(vec3(vp, cd.x-.5));
//cd = add_mul(cd,td, gd.x);
vec4 cr = cd;//gris(cd,1.);
cr = contraste(cr,5.);
//cd = gris(cd,1.);
cd = contraste(cd,2.);
// //cr.xyz = cr.xyz/2.+.25;
// //cd.xyz = cd.xyz/2.+.25;
cd = //cr;
// //ecran(cd,cr);
assombrir(cd,cr);
// //superposition(cr,cd);
// //calque_cote(cd,cr);
f_T = 1.;
f_z = 0.2;
//vp = vec2(p.x/resolution.x+.5,p.y/resolution.y-.5);
//cr = tex_distord(vec3(vp, cr.x));
//cd = cr;
//ecran(cd,cr);
//assombrir(cd,cr);
//superposition(cr,cd);
//calque_cote(cd,cr);
gl_FragColor = cd
;
}
<script id="double_polaire" type="x-shader/x-fragment">
vec4 flou_mono(vec2 v,float s){
s = s/float(recur);//*1.5;
float ray= 5.*s;
float x,y,or,rx,ry, di=0.,z;
vec3 c = vec3(0.,0.,0.);
vec4 j;
RF_n = floor(sin(v.x/s*2.)*1000. 1000.)
floor(cos(v.y/s*2.)*1000. 1000.);
for(int r=0; r<10; r ){
for(int u=0; u<10; u ){
y = v.y ( float(u) RF() )*s -ray;
x = v.x ( float(r) RF() )*s -ray;
j = texture2D(img, vec2(x/resolution.x,y/resolution.y));
ry = v.y-y;
rx = (v.x-x)*(v.x-x);
or = sqrt( rx ry*ry );
z = or/(ray/1.8); z = 1./(z*z*z*z 1.);
c.xyz = j.xyz*z;
di = z;
}}
return vec4(c.xyz/di,1.);
}
float Angl(vec2 v, vec2 v1){//v = centre
if( v1.x> v.x && v1.y> v.y ){ return atan((v1.y-v.y)/(v1.x-v.x)) ;}
else if( v1.x< v.x && v1.y> v.y ){ return PId2 - atan((v1.y-v.y)/(v.x-v1.x)) PId2 ;}
else if( v1.x< v.x && v1.y< v.y ){ return atan((v.y-v1.y)/(v.x-v1.x)) PI ;}
else if( v1.x> v.x && v1.y< v.y ){ return PId2 - atan((v.y-v1.y)/(v1.x-v.x)) PI*3./2. ;}
else if( v1.x==v.x && v1.y==v.y ){ return 0. ;}
else if( v1.x==v.x && v1.y> v.y ){ return PId2 ;}
else if( v1.x==v.x && v1.y< v.y ){ return PI*3./2. ;}
else if( v1.x> v.x && v1.y==v.y ){ return 0. ;}
else if( v1.x< v.x && v1.y==v.y ){ return PI ;}
else{ return 0.; }
}
float distanced( vec2 v, vec2 c){
vec2 g = vec2(v.xy-c.xy);
return sqrt( g.x*g.x g.y*g.y );
}
vec3 Normaliz( vec3 v ){//normalise
float g = sqrt( v.x*v.x v.y*v.y v.z*v.z );
if( g == 0. ){ g = 1.; }
return v.xyz/g;
}
vec3 VNormaliz( vec3 v , vec3 b ){
// calcule de la Normal d'un plan défini par 2 vect3
vec3 vn = vec3(
v.y*b.z - v.z*b.y ,
v.z*b.x - v.x*b.z ,
v.x*b.y - v.y*b.x );
return Normaliz(vn);
}
void main(void){//effet polaire
vec2 p = vec2(gl_FragCoord.x, resolution.y-gl_FragCoord.y );
vec4 cd = //texture2D(img,vec2(p.x/resolution.x,p.y/resolution.y));
//moyen_img(vec2(p.x/resolution.x,p.y/resolution.y));
vec4(0.,0.,0.,1.);
float m = 3.;//marge decalage
//vec4 v1 = moyen_img(vec2(p.x/resolution.x,p.y/resolution.y)),
// v2 = moyen_img(vec2((p.x m)/resolution.x,p.y/resolution.y)),
// v3 = moyen_img(vec2(p.x/resolution.x,(p.y m)/resolution.y));
vec4 v1 = flou_mono(vec2(p.x,p.y),1.),
v2 = flou_mono(vec2((p.x m),p.y),1.),
v3 = flou_mono(vec2(p.x,(p.y m)),1.);
float petal = 10. ,
angle = PI/2. 31./10.;
//vecteur polaire par derivation du point
vec3 k = VNormaliz(vec3( 1., 0., v2.x - v1.x ),
vec3( 0., 1., v3.x - v1.x ));
vec2 l = vec2(k.xy);
float an = Angl(l,vec2(0.,0.));
//effet sur le reper polaire
float z = 1.;
z = distanced(l,vec2(0.,0.));//
an = sin(an*petal angle)/2. .5;
v1.x *= an*z;
k = VNormaliz(vec3( 1., 0., v2.y - v1.y ),
vec3( 0., 1., v3.y - v1.y ));
l = vec2(k.xy);
an = Angl(l,vec2(0.,0.));
z = 1.;
z = distanced(l,vec2(0.,0.));//
an = sin(an*petal angle)/2. .5;
v1.y *= an*z;
k = VNormaliz(vec3( 1., 0., v2.z - v1.z ),
vec3( 0., 1., v3.z - v1.z ));
l = vec2(k.xy);
an = Angl(l,vec2(0.,0.));
z = 1.;
z = distanced(l,vec2(0.,0.));//
an = sin(an*petal angle)/2. .5;
v1.z *= an*z;
cd.xyz = v1.xyz*10.;
//cd = gris(cd,1.);
//cd = contraste(cd,1.);
cd.xyz = asin(sin(cd.xyz))/PId2;
gl_FragColor = cd
;
}
</script>
function chaos_patern_set(rd_max,mm,mm_s,mm_f){
//je suis le mystificateur de l'esprit
var xp,yp ,co,cod, xs,ys, xz,yz, zm,rd=rd_max,
r_x,r_y,flip,an,
r_xf,r_yf,flipf,anf,
diago_rd = Math.sqrt(rd*rd),
rd2 = rd/2;
function geometriz(flipG,xG,yG){
switch(flipG){
case 0: xs = xG+xp; ys = yG+yp; break;
case 1: xs = xG+rd-1-xp; ys = yG+yp; break;
case 2: xs = xG+xp; ys = yG+rd-1-yp; break;
case 3: xs = xG+rd-1-xp; ys = yG+rd-1-yp; break;
case 4: xs = xG+yp; ys = yG+xp; break;
case 5: xs = xG+rd-1-yp; ys = yG+xp; break;
case 6: xs = xG+yp; ys = yG+rd-1-xp; break;
case 7: xs = xG+rd-1-yp; ys = yG+rd-1-xp; break;
}
}
var iterat_l = Math.floor( (w/rd_max*2) * (h/rd_max*2)*1.2 ),//nombre de seteur
rd_min = rd_max-10;
//iterat_l = 10;
for(var ll=0;ll<iterat_l;ll++){
rd = Math.floor( (rd_max-rd_min)*(1-ll/iterat_l)+rd_min );
diago_rd = Math.sqrt(rd*rd);
rd2 = rd/2;
r = rr(w-rd);
u = rr(h-rd);
cod = 255*3*rd*rd;
for(i=0;i<inter;i++){//seteur
co = 0;
//il est possible d'ajouté une inversion de contraste et un zoom/echelle
r_x = rr(w_s-2*rd)+rd;//position
r_y = rr(h_s-2*rd)+rd;
flip = rr(8); //géométri
an = rf(PI2);//angl
for(xp=0;xp<rd;xp++){//comparateur
for(yp=0;yp<rd;yp++){
[x,y] = [r+xp, u+yp];
geometriz(flip,r_x,r_y);
var vr = v_(xs,ys),
vc = v_(r_x +rd2, r_y +rd2);
vr.r(vc,an);//rotation
xs = Math.floor(cadr(vr.x,0,w_s-1));
ys = Math.floor(cadr(vr.y,0,h_s-1));
co += Math.abs(mm[x][y][0] - mm_s[xs][ys][0])
+ Math.abs(mm[x][y][1] - mm_s[xs][ys][1])
+ Math.abs(mm[x][y][2] - mm_s[xs][ys][2]);
}}
if(co < cod ){
[r_xf,r_yf,flipf,anf,cod] =
[r_x ,r_y ,flip ,an ,co ]
}
}
for(xp=-rd;xp<rd*2;xp++){//empreinte trouver
for(yp=-rd;yp<rd*2;yp++){
[x,y] = [r+xp, u+yp];
if(x>=0 && x<w && y>=0 && y<h){
geometriz(flipf,r_xf,r_yf);
[xz,yz] = [xp-rd2, yp-rd2];
zm = Math.sqrt(xz*xz+yz*yz)/diago_rd;
//zm = zm*zm*zm*zm;
//zm = zm*zm*zm*zm;
//zm = 1/(zm+1);
zm = zm <= 1 ? (1-Math.sin((zm-0.5)*PI))/2 : 0 ;
var vr = v_(xs,ys),
vc = v_(r_xf +rd2, r_yf +rd2);
vr.r(vc,anf);//rotat
var color = carre_img(vr,mm_s);
mm_f[x][y][0] = mm_f[x][y][0]*(1-zm) + color[0]*zm;
mm_f[x][y][1] = mm_f[x][y][1]*(1-zm) + color[1]*zm;
mm_f[x][y][2] = mm_f[x][y][2]*(1-zm) + color[2]*zm;
}
}}
}
}
function chaos_patern_set2(rd_max,mm,mm_s,mm_f){
//je suis le mystificateur de l'esprit
var xp,yp ,co,cod, xs,ys, xz,yz, zm,rd,
r_x,r_y,flip,an, r_xf,r_yf,flipf,anf,
rd2,//diago_rd,
vc,vr,zs,zc,b;//rotativ
function geometriz(flipG,xG,yG){
switch(flipG){
case 0: xs = xG+xp; ys = yG+yp; break;
case 1: xs = xG+rd-1-xp; ys = yG+yp; break;
case 2: xs = xG+xp; ys = yG+rd-1-yp; break;
case 3: xs = xG+rd-1-xp; ys = yG+rd-1-yp; break;
case 4: xs = xG+yp; ys = yG+xp; break;
case 5: xs = xG+rd-1-yp; ys = yG+xp; break;
case 6: xs = xG+yp; ys = yG+rd-1-xp; break;
case 7: xs = xG+rd-1-yp; ys = yG+rd-1-xp; break;
}
}
var iterat_l = Math.floor( (w/rd_max)*(h/rd_max) * 50 ),//nombre de seteur
rd_min = 15;//rd_max-20;
vr = v_(0,0);
for(var ll=0;ll<iterat_l;ll++){
rd = Math.floor( (rd_max-rd_min)*(1-ll/iterat_l)+rd_min );
//diago_rd = Math.sqrt(rd*rd);
rd2 = rd/2;
r = rr(w-rd);
u = rr(h-rd);
[x,y] = [Math.floor(r+rd2), Math.floor(u+rd2)];
zm = mm_f[x][y][3];
if(zm<.99){//map mz pr zone d'incomplétude
cod = 255*3*rd*rd;
for(i=0;i<inter;i++){//seteur
co = 0;
[r_x,r_y] = //[rr(w_s-2*rd)+rd,rr(h_s-2*rd)+rd];//position
[rr(w_s-rd),rr(h_s-rd)];//total surface
flip = rr(8); //géométri
an = rf(PI2);//angl
zs = Math.sin(an); zc = Math.cos(an);
vc = v_(r_x +rd2, r_y +rd2);
//optimisation +=2, dédensifi le comparateur
for(xp=0;xp<rd;xp+=2){//comparateur
for(yp=0;yp<rd;yp+=2){
[x,y] = [r+xp, u+yp];
geometriz(flip,r_x,r_y);
b = v_(xs-vc.x,ys-vc.y);//rotation
vr.x = b.x*zc + b.y*zs +vc.x;
vr.y = b.y*zc - b.x*zs +vc.y;
xs = Math.floor(cadr(vr.x,0,w_s-1));
ys = Math.floor(cadr(vr.y,0,h_s-1));
co += Math.abs(mm[x][y][0] - mm_s[xs][ys][0])
+ Math.abs(mm[x][y][1] - mm_s[xs][ys][1])
+ Math.abs(mm[x][y][2] - mm_s[xs][ys][2]);
}}
if(co < cod ){
[r_xf,r_yf,flipf,anf,cod] =
[r_x ,r_y ,flip ,an ,co ]
}
}
zs = Math.sin(anf); zc = Math.cos(anf);
vc = v_(r_xf +rd2, r_yf +rd2);
for(xp=0;xp<rd;xp++){//empreinte trouver
for(yp=0;yp<rd;yp++){
[x,y] = [r+xp, u+yp];
if(x>=0 && x<w && y>=0 && y<h){
geometriz(flipf,r_xf,r_yf);
[xz,yz] = [xp-rd2, yp-rd2];
zm = Math.sqrt(xz*xz+yz*yz)/rd2;//diago_rd;
//zm = zm*zm;//option moins fad
zm = zm <= 1 ? (1-Math.sin((zm-0.5)*PI))/2 : 0 ;
b = v_(xs-vc.x,ys-vc.y);//rotat
vr.x = b.x*zc + b.y*zs +vc.x;
vr.y = b.y*zc - b.x*zs +vc.y;
var color = carre_img(vr,mm_s);
//var color = [ mm_s[xs][ys][0], mm_s[xs][ys][1], mm_s[xs][ys][2]];
mm_f[x][y][0] = mm_f[x][y][0]*(1-zm) + color[0]*zm;
mm_f[x][y][1] = mm_f[x][y][1]*(1-zm) + color[1]*zm;
mm_f[x][y][2] = mm_f[x][y][2]*(1-zm) + color[2]*zm;
mm_f[x][y][3] = mm_f[x][y][3]*(1-zm) + zm;
}
}}
}
}
}
<script id="chao_nb" type="x-shader/x-fragment">
float effet_z(float t,vec2 v){
float fac = RF()*1. 1.,
fac2 = RF()*1.4 .5,
fac3 = .8;
return
sin( (v.x*(RF()*fac3 1.)-t)
* fac (cos(t v.y*(RF()*fac3 1.) )
cos(t v.x*(RF()*fac3 1.) ) )*fac2 )
*cos( (v.y*(RF()*fac3 1.) t)
* fac (sin(t-v.x*(RF()*fac3 1.) )
sin(t-v.y*(RF()*fac3 1.) ) )*fac2 )
;
}
vec3 chaosz2( vec2 v ,vec2 d){
float t = 1.;
v = vec2(v.x d.x,v.y d.y );
v = rotation(v,centr,an);
for(int r=0; r<17; r ){//27 nic
v = rotation(v, vec2(RF()*10.,RF()*10.) ,RF()*PI2/10.);
t -= //effet_z(t,v)
effet_z(effet_z(t,v)*effet_z(t,v) t,v)
//effet_z(effet_z(effet_z(t,v)*effet_z(t,v),v)*effet_z(t,v),v)
*(1.-float(r)/17.)
;
t = sin(t*PId2*(RF()*.5 1.) );//pr polir la forme
}
return vec3(v,
NB_unique(
//t
( sin(t*1.*PI) 1.)/2.
,1.,.5)
)
;
}
vec3 chaosz3( vec2 v ,vec2 d){
float t = 1.;
v = vec2(v.x d.x,v.y d.y );
v = rotation(v,centr,an);
for(int r=0; r<11; r ){//27 nic
v = rotation(v, vec2(RF()*10.,RF()*10.) ,RF()*PI2);
t -= //effet_z(t,v)
//effet_z(effet_z(t,v)*effet_z(t,v) t,v)
effet_z(effet_z(effet_z(t,v)*effet_z(t,v),v)*effet_z(t,v),v)
//effet_z(effet_z(effet_z(t,v) effet_z(t,v),v)*effet_z(effet_z(effet_z(effet_z(t,v)*effet_z(t,v),v)*effet_z(t,v),v),v),v)
*(1.-float(r)/11.)
;
//t = sin(t*PId2*(RF()*.5 1.) );
}
vec3 c = vec3(
( sin(t*1.5*PI RF()*2.) 1.)/2.,
( sin(t*2.7*PI RF()*2.) 1.)/2.,
( sin(t*2.3*PI RF()*2.) 1.)/2.
);
c.xyz=( sin(t*1.8*PI c.zxy) 1.)/2.;
//c.xyz=( sin(t*1.5*PI c.zxy) 1.)/2.;
return c
;
}
vec3 chaosz1( vec2 v ,vec2 d){
float t = 1.,fac,fac2;
v = vec2(v.x d.x,v.y d.y );
v = rotation(v,centr,an);
for(int r=0; r<10; r ){
fac = RF()*1. 1.;
fac2 = RF()*1.4 1.;
//centr
v = rotation(v, vec2(RF()*1.,RF()*1.) ,RF()*PI2);
t -= sin( (v.x*RF()) * fac
-( cos(t v.y*RF() ) sin(t v.x*RF() ))*fac2
)
*cos( (v.y*RF()) * fac
-( sin(t v.x*RF() ) cos(t v.y*RF() ))*fac2
)
//*sin( (v.y*RF() v.x*RF()) * fac
// -( sin(t*RF() ) t)*fac2
// )
*(1.-float(r)/10.);
t = sin(t*PId2*(RF()*.5 1.) );//1.3*
}
return vec3(v,
//t
NB_unique( ( sin(t*3.*PI) 1.)/2. ,1.,.5)
);
}
</script>
(http://pre14.deviantart.net/95db/th/pre/f/2016/344/8/9/nb456_by_graindolium-dar5hgp.png)function pacticl1(){
var sc = 10;
var C = new imgbuffer(sc*100, sc*100);
var ray = 40, //80/10 iterat*2 5m40
rayd2 = ray/2,
rayd4 = ray/3.5,
iterat= C.w*C.h*4;//20*3m42 = 1h14 for 40/20
var piza = new imgbuffer(ray, ray);
var ct = v_(0,0),
v = v_(0,0),dt,get;
for(var r=0; r<ray; r++){//init la pizza précalcul des distance
for(var u=0; u<ray; u++){
piza.M[r][u][0] = ct.d(v_(r-rayd2,u-rayd2));
}}
for(var r=0; r<C.w; r++){//init
for(var u=0; u<C.h; u++){
[C.M[r][u][0],C.M[r][u][1],C.M[r][u][2]]=[0,0,0];
}}
//for(var i=0; i<200; i++){//reparte points
// x = Math.floor(rf(C.w));
// y = Math.floor(rf(C.h));
// [C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[1,1,1];
//}
for(var i=0; i<iterat; i++){//25 for 10 ,56 for 15
var x = Math.floor(rf(C.w-ray)+rayd2);
var y = Math.floor(rf(C.h-ray)+rayd2);
//dt = Math.sqrt(c_(x-C.wd)+c_(y-C.hd));
//dt = 4-1/(1+dt/C.wd);
//et pis tu sais quant ta le pouvoir de cré la vie avec une femme, tu perd pas ton temps à créé la vie avec ton esprit
//if(C.M[x][y][0] ==0){
var s = 0,s1 = 0;
for(var r=0; r<ray; r++){ v.x = r-rayd2+x ;
for(var u=0; u<ray; u++){
v.y = u-rayd2+y ;
dt = piza.M[r][u][0];
if(dt<rayd2){
get = C.M[v.x][v.y][0];
s += get*dt/rayd2;
if(dt<rayd4){
s1 += get*dt/rayd4;
}
}
}}
//
//if(s>0 && s<15 && rf(4)<1){
// [C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[1,1,1];
//}
//if(s>10 && s<130 && rf(2)<1){
// [C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[1,1,1];
//}
//if(s<1){
// [C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[1,1,1];
//}
//s = 1-s/8.5;//30for20, 8.5 for10,4.4 for 6
//s = Math.sin(s*PI);
//s = (C.M[x][y][0]+s)/2;
//[C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[s,s,s];
s = 1-s;//1-(s-s1);// /ray
s1 = 1-s1;
//s = s/s1;
//s = Math.cos(s/s1);
s = Math.sin(s/s1);
s = (C.M[x][y][0]+s )/2;
[C.M[x][y][0],C.M[x][y][1],C.M[x][y][2]]=[s,s,s];
//taffé effet persistance de rayon, calculer diagonale de tout les angles , utiliser une piza lister sur index position
//}
}
function arti(v,ptr){
this.v = new vect3(v.x,v.y,v.z);//point articulaire
this.ptr = ptr;//articulation mère
this.ptrF = [];//liste des articulation filles
this.ptrT = [];//liste tissu oseu, pr modification des points matériel
}
function tissu(ptr,etre){
this.ptr = ptr;//articulation mère
this.ptrM = [];//liste grille de point matériel indexé!
this.etre = etre;//caractéristique, 0:fantom, 1:physique, ?...
// use une liste de new vect4(v,w) !
//modélise un tissu:
// peut être un point,
// une suite d points formant un serpent,
// une suite de listes d points pour un bouquet de serpent
}
function Body(){
this.matier = [];//liste de points matériel use new vect4(v3,w)
this.muscl = [];//tissu musculaire ou singulier
this.squelette = [];//tissu oseu
this.art = [];//liste articulations
this.dico = new Object();//équivalence syntaxique des points articulaire
this.dico_os = new Object();//équivalence syntaxique des tissu oseu
this.art_n = 0;//nombre d'articulations
this.os_n = 0;//nombre d tissu oseu
this.m_n = 0;//nombre de points matériel
this.charg();
}
function cote(cn,DG){
function s(x){return Math.sin(x)}
var pm = [],
iter = 50,t,
co = cn/13,
j = co*1.85-.5-(1-co*co)/2,
o = co*3-1.5,
lo= co*5,//fad cote flotante
ray= .65/(1+j*j*j*j ),//s(co*PI/2+PI/4)/1.3
avant = s(co*PI)*.8 + .2+
.2/(1+o*o*o*o ),
f = co*3-2,
bas = .6/(1+f*f*f*f );
pm[0] = [];
var cub_lat = .5;//cubositer_lateral
for(var r=0; r<iter; r++){
t = r/iter;
var tc = t/(1+(1-co*1.5)/avant/5 )* (1-.7/(1+lo*lo*lo*lo));
var tc1=tc*5;
pm[0][r] = v4_(
//(.08+(1-co)/13 +s(tc*PI)*ray )*DG,
(.08+(1-co)/13
//+s(tc*PI)*ray/(1+tc1*tc1*tc1*tc1)
+s(tc*PI + co*s(tc*PI+PI/2)*cub_lat*(1-1/(1+tc1*tc1*tc1*tc1)) )*ray //1/
)*DG,
(-t*t*(1-co)*(tc+.2)*1.2 )/1.5-.08*(1-co) ,//+bas*t*(1-co)
tc*avant-bas*t/3,
1);
}
return pm;
}
(http://pixeljoint.com/files/icons/full/worm__r14431185991.gif)/*Sinus Cardinal
c = nombre de points
t = position paramétrique
f = fréquence de coupure f=22050/f_Hz f=1 pr aucune perte du spectre
M = tableau de points*/
sinc: function(c,t,f,M){
var i=0,y=0,k=0,x=0, splin = Math.round(t-c/2);
for(; i<c; i++){
k = i+splin;
if( k>=0 && k<M.length ){
x = (k-t)*PI /f;
y += M[ k ]*(x!=0 ? Math.sin(x)/x : 1)
}
}
return y /f
},
//data pr interpolation lagrang degré [2;196]
var lagrang = new Array(197);
for(var r=2; r<197; r++){
lagrang[r] = new Array(r);
for(var i=0; i<r; i++){
lagrang[r][i] = 1;
for(var q=0; q<r; q++){if(i!=q){lagrang[r][i] *= (i-q) }}
}
}
function interpol_lagrangeQ(c,t,M){//c = nombre de points,
var y=0,i=0,q=0,PK=1, yy = new Array(c);
var splin = (1-(c%2)) + (c%2)*.5 -c/2;
var ti = t-Math.floor(t+splin);//point interpoler
if(ti%1!=0){
for(i=0; i<c; i++){
q = Math.floor(t+i+splin);
if(q<0){ yy[i] = M[ 0 ] }
else if(q>=M.length){ yy[i] = M[ M.length-1 ] }
else{ yy[i] = M[ q ] }
PK *= (ti-i) ;
}
for(q=0; q<c; q++){y += yy[q]*((PK/(ti-q))/lagrang[c][q]) }
return y
}else{
return M[t]
}
}
add_cote: function(deter,DG){
function cote(cn){
function s(x){return Math.sin(x)}
var pm = [],
iter = 10,t,
co = cn/13,
j = co*1.85-.8-(1-co*co)/2,
o = co*3-1.5,
lo= co*5,//fad cote flotante
ray= .65/(1+j*j*j*j ) *(1-.6/(1+c((j-.8)*8) ) ),
avant = s(co*PI)*.8 + .2+
.2/(1+o*o*o*o ),
f = co*3-2,
bas = .6/(1+f*f*f*f );
pm[0] = [];
var cub_lat = .5;//cubositer_lateral
for(var r=0; r<iter; r++){
t = r/iter;//+rf(1/iter);
var tc = t/(1+(1-co*1.5)/avant/5 )* (1-.7/(1+lo*lo*lo*lo));
var tc1=tc*5;
pm[0][r] = v4_(
(.08+(1-co)/13
+s(tc*PI + co*s(tc*PI+PI/2)*cub_lat*(1-1/(1+tc1*tc1*tc1*tc1)) )*ray
)*DG,
(-t*t*(1-co)*(tc+.2)*1.2 )/1.5-.08*(1-co) ,
tc*avant-bas*t/3,
1);
}
return pm;
}
for(var k=1; k<=12; k++){
this.add_os("thoracique"+k,deter+"cote"+k,cote(k));
}
},
lighting1: function(normal,ptr,c){//métal opaqu
var g = normal.produit( this.lightp.Nc(ptr) );
g = (g+1)/2;
g = g*g*g*g;
var cv = c.new();
cv = cv.bary(this.colored1,1-g*g);
cv = cv.bary(this.colorblanc,1-g*g*g*g);
cv.scal(g);
return cv;
},
lighting2: function(normal,ptr,c){//métal brillant
var k = normal.produit( this.lightp.Nc(ptr) );
k = (k+1)/2;
k = k*k*k*k;
k = k*k*k*k;
var j = normal.produit( this.lightp2.Nc(ptr) );
j = (j+1)/2;
j = j*j*j*j *j*j;
var l = normal.produit( this.lightp3.Nc(ptr) );
l = (l+1)/2;
l = l*l*l*l *l*l *l*l*l *l*l;
var sc = Math.min(k+j+l,1);
function nb(x){
return x*x*x*x *x*x*x;
//if(x<.5){return 0}else{return 1}
}
var cv = c.new();
/*cv = cv.bary(v3_(
//nb( Math.sin(ptr.x/3)/2+.5 )*
//nb( Math.sin(ptr.y/5)/2+.5 )*
//nb( Math.abs( Math.sin(ptr.x/5) ) )
1,0,1)
,nb( Math.abs( Math.sin( ptr.d(v3_(0,0,0) ) /50) ) )
//1-sc
);*/
cv = cv.bary(this.colored1,1-k*k);
cv = cv.bary(this.colorblanc,1-k*k*k*k *k*k);
cv = cv.bary(v3_(1,1,.1),1-j*j);
cv = cv.bary(v3_(1,1,1),1-l*l*l*l*l*l);
cv.scal(sc);
return cv;
},
//random vecteur normaliser
function rf_v3(ray){
var v = new vect3(rf(2)-1,rf(2)-1,rf(2)-1);
v.N();
v.scal(ray);
return v;
}
// récursion
function tige(ray,rays,position,np_s,color, C,recur){
function s(x){return Math.sin(x)}
var iter = Math.floor(200*np_s/(1+recur/2) ),
iterp = Math.floor(20*np_s/(1+recur/2) ),
interp_n = 65,
t,v,sf,fac;
var sacaled;
var Mps = new Array(4);
Mps[0] = new Array(np_s);//x
Mps[1] = new Array(np_s);//y
Mps[2] = new Array(np_s);//z
Mps[3] = new Array(np_s);//scal
Mps[0][0] = position.x;
Mps[1][0] = position.y;
Mps[2][0] = position.z;
Mps[3][0] = .1;
for(var r=1; r<np_s; r++){
v = rf_v3(ray/r );
Mps[0][r] = Mps[0][r-1] + v.x;
Mps[1][r] = Mps[1][r-1] + v.y;
Mps[2][r] = Mps[2][r-1] + v.z;
Mps[3][r] = (1-r/np_s)*(r/np_s)+.1;
}
function ptr_c(x){
return new vect3(
interpol_lagrangeQ(interp_n,x,Mps[0]),
interpol_lagrangeQ(interp_n,x,Mps[1]),
interpol_lagrangeQ(interp_n,x,Mps[2]));
}
for(var r=0; r<iter; r++){
t = r/iter*(np_s-1) ;
v = ptr_c(t);
scaled = interpol_lagrangeQ(interp_n,t,Mps[3])
// *( (s(t*5*(1+s(t)/30) )+1)/2+.3)
;
//t = (r+1)/iter*(np_s-1) ;
//var courb = ptr_c(t);
color.z = r/iter;
//C.trais(v,courb,color);
//v.p( rf_v3(.002/(1+recur/2) ) );
sf = new Sphr(v,rays* scaled );
C.Sphere(sf,color);
}
color.z = 0;
for(var r=0; r<iterp; r++){
t = r/iterp*(np_s-1);
var courb = ptr_c(t);
t+= 4/iterp*(np_s-1);
var courb1= ptr_c(t);
t+= 4/iterp*(np_s-1);
var courb2= ptr_c(t);
color.x = r/iterp;
fac = new Fac(courb,courb1,courb2);
C.Polygon(fac,color);
}
recur++;
if(recur<=3){
v = v3_(Mps[0][np_s-1],Mps[1][np_s-1],Mps[2][np_s-1]);
scaled = rf(.8)+.2;
var ray_fleur = rf(.5);
var c_fleur =
//v3_(rf(1),0,rf(1));
v3_(0,0,0);
g = Math.floor(rf(3+ray_fleur*5+recur*2));
for(var u=0; u<g; u++){
tige(
( .1+rf(ray_fleur) )/(1+recur),
.01*scaled+.002,
v,
5+Math.floor(rf(10)),
c_fleur,C,recur);
}
}
}
function detonnateur(ray,scd,bol){
var scal = 7*scd, sc = 100*scal;
var C = new Vus3D(sc, sc, 200*scd*2.5);
//o_random = 1;
function s(x){return Math.sin(x)}
var cubcolor = v3_(212/255,159/255,125/255),
fac;
var mr = new mat3(rf(PI),rf(PI),rf(PI));
var centre = v3_(0,0,0),
deplace = v3_(0,0,0);//v3_(.3,1.8,0);
cubcolor = v3_(0,.8,1);//v3_(0,0,0);//
var sacaled,g;
var interp_n = 65,
t,v,sf;
var ts=0;
cubcolor = v3_(1,1,.3);
v = v3_(0,0,0);
scaled = rf(.8)+.2;
var ray_fleur = rf(.5);
var c_fleur = v3_(rf(1),1,rf(1));
g = Math.floor(rf(15+ray_fleur*50)+3);
for(var u=0; u<g; u++){
tige(
.1+rf(ray_fleur),
.01*scaled+.002,
v,
5+Math.floor(rf(10)),
c_fleur,C,0);
}
C.canvas_set("can");
PRINT("export" , "\n//\n RF_list = new Array("+c_random+");"+text_random+"//",0);
}
v = rf_v3(1.5);//vecteur directeur
//v3_(1,1,1);
var vn = v_(0,0);//centre
C.trais(centre,v,v3_(0,1,1));
mr = new mat3(//rotation
vn.a(v_(Math.sqrt(v.x*v.x+v.z*v.z),v.y)),//elevation
vn.a(v_(v.z,v.x)),//azimuth
0);
mrz = new mat3(0,0, //rotation premier si besoin
.4);//tilt
/*
azimuth = angle reper z,x
elevation = angle du triangle y=hauteur, pied_hypoténuse=sqrt(x²+z²), rayon=1
tilt = ce que tu veux rotation autour du manche,
*/
var vdel = v3_(0,0,2);//vecteur qu'ont veux lui coller
//vdel.r(centre,mrz);
vdel.r(centre,mr);
C.trais(centre,vdel,v3_(1,1,1));
function mat3_2(a,b){
var xs = Math.sin(a),xc = Math.cos(a),
ys = Math.sin(b),yc = Math.cos(b);
this.x1 = yc ; this.y1 = 0 ; this.z1 = -ys ;
this.x2 = -xs * ys; this.y2 = xc ; this.z2 = -xs * yc;
this.x3 = xc * ys; this.y3 = xs ; this.z3 = xc * yc;
}
function mat3_d(v){//rotation par vecteur directionnelle
//v = vecteur directeur, use v.sp(vcenter)
var c = v_(0,0);//centre
return new mat3_2(//rotation
c.a(v_(Math.sqrt(v.x*v.x+v.z*v.z),v.y)),//elevation
c.a(v_(v.z,v.x)));//azimuth
}
//random vecteur projeté,
function rf_dv3(d,ray,rf_ray){
//d = vecteur directionnel
//ray = rayon return
//rf_ray = rayon random 0 to 1 to spher
var v = new vect3(rf(2)-1,rf(2)-1,rf(2)-1);
v.N();
v.scal(rf_ray);
var vd = d.new();
vd.N();
vd.p(v);
vd.N();
vd.scal(ray);
return vd;
}
function mat3_d(v,p){//rotation par vecteur directionnelle
//v = vecteur directeur
//p = vecteur antérieur
var c = v_(0,0);//centre
var rot2 = new mat3_xy(//rotation
c.a(v_(Math.sqrt(v.x*v.x+v.z*v.z),v.y)),//elevation
c.a(v_(v.z,v.x)));//azimuth
/*var ce= v3_(0,0,0);//centre
var n = v.VN(p);//v3_(1,1,1)
//n.r(ce,new mat3_xy(0,-rot2.azimut));
//n.r(ce,new mat3_xy(-rot2.elevat,0));
n.r(ce,new mat3_xy(
-c.a(v_(v.z,v.y)),//elevation
-c.a(v_(Math.sqrt(v.y*v.y+v.z*v.z),v.x)))//azimuth
);*/
var rot1 = //new mat3_z(c.a(v_(Math.sqrt(v.y*v.y+v.z*v.z),v.x)));
//new mat3_z(c.a(v_(n.x,n.y))-rot2.azimut);
new mat3_z(PI-rot2.elevat);
//new mat3_z(PI2-c.a(v_(n.x,n.y)));
return [rot1,rot2];
canvas_set: function(n){
//this.DD.polaire(7);
//this.DD.Echel_carre(10,15);
if(this.opacite==1){
//compile tableux d'opaciter
//if( this.mz[x][y] <= z ){
for( var clef in this.opak ){//clef = y*this.w+x;
var y = Math.floor(clef/this.w);
var x = clef%this.w;
var c = this.DD.set_out(x,y);
var len = this.opak[clef].length;
for(var k=0; k<len; k++){
var z=100000,zj=0;
for( var j in this.opak[clef] ){
if(z>this.opak[clef][j].z){
z = this.opak[clef][j].z;
zj = j;
}
}
c = this.opak[clef][zj].v.bary(c, this.opak[clef][zj].w);
this.opak[clef].splice(zj, 1);
}
this.DD.set_in(x,y,c);
}
}
canvas_set_bufferat(n,this.DD);
},
var opcci = this.opak[clef][zj].w;
var opz = (zant-z)/this.scal*10;
opcci = opcci + (1-opcci)*(1- 1/(1+opz*opz ) );
c = this.opak[clef][zj].v.bary(c, opcci);
function mat3_d_find(v,md){//rotation par vecteur directionnelle , finding tilt
//v = vecteur directeur , md = couple rotation {mat3_d} de la section antérieur,
var c3 = v3_(0,0,0);//centre
var c = v_(0,0);//centre
var elevat = c.a(v_(Math.sqrt(v.x*v.x+v.z*v.z),v.y));
if(elevat > PId2){elevat = elevat-PI2;}
var azimu = c.a(v_(v.z,v.x));
if(azimu > PI){azimu = azimu-PI2}
var rot2 = new mat3_xy(elevat,azimu);
//déterminer le tilt par recherche de la plus courte distance
// avec un point de section antérieur
var vsection = new vect3(1,0,0) ;
vsection.r(c3,md[0]);
vsection.r(c3,md[1]);
var rot1 = new mat3_z(0);//-rot2.azimut);
//algo dicotomique de tilt voisin
var iter_e = 7;
var tilt = 0, dant=3;
var segement = PI2;
var pos = tilt-segement/2;
for(var i=0; i<5; i++){ // précision permise
for(var e=0; e<iter_e; e++){
rot1 = new mat3_z(e/iter_e*segement + pos);
var vsection2 = new vect3(1,0,0) ;
vsection2.r(c3,rot1);
vsection2.r(c3,rot2);
var d = vsection.d(vsection2);
if(dant>d){
dant = d;
tilt = rot1.tilt;
}
}
segement /= iter_e-1;
pos = tilt-segement/2;
}
rot1 = new mat3_z(tilt);
return [rot1,rot2];
}
function courbe(){
//this.cercle = 0;//connection tête à queux
this.ptr = new Array(4);
this.ptr[0] = [];
this.ptr[1] = [];
this.ptr[2] = [];
this.ptr[3] = [];
this.len = 0;
}
courbe.prototype = {
//new: function(){return new },
//get_v_directeur(t,div); retrun [vecteur_directionnel , ptr],
add_point: function(ptr,w){
this.ptr[0][this.len] = ptr.x;
this.ptr[1][this.len] = ptr.y;
this.ptr[2][this.len] = ptr.z;
this.ptr[3][this.len] = w;
this.len++;
},
get_ptr: function(t){
return v4_(
interpol_lagrangeQ(65,t,this.ptr[0]) ,
interpol_lagrangeQ(65,t,this.ptr[1]) ,
interpol_lagrangeQ(65,t,this.ptr[2]) ,
interpol_lagrangeQ(65,t,this.ptr[3]) )
}
}
function courbe_multiple(){
this.fibre = [];
this.len = 0;
}
courbe_multiple.prototype = {
add_fibre : function(c){
this.fibre[this.len] = c;//new courbe()
this.len++;
}
//get_fibre(t){return courbe}
}
for(var r=0; r<BB.os_n; r++){//tissu osseux
var Mp = new courbe_multiple();
c = v3_(1,0,1);
for(var k=0; k<BB.squelette[r].ptrM.length; k++){
var cou = new courbe();
for(var u=0; u<BB.squelette[r].ptrM[k].length; u++){
var m = BB.squelette[r].ptrM[k][u];
cou.add_point(BB.matier[m].v,BB.matier[m].w);
var sf = new Sphr(BB.matier[m].v,.015);
this.Sphere(sf,c,0,1);
}
Mp.add_fibre(cou);
}
c = v3_(0,0,1);
if(Mp.len==1){//génère une courbe unique interpoler lagrang
var np = Mp.fibre[0].len;
var iter = 10*(np-1);
for(var k=0; k<iter; k++){
var t = k/iter*(np-1);
var v = Mp.fibre[0].get_ptr(t);
sf = new Sphr(v.v,.005* v.w );
this.Sphere(sf,c,0,1);
}
}
//construire point matériel et tissu associer,
}
get_ptr: function(t){
var g = interpol_lagrangeQ4(65,t,this.ptr);
return v4_( g[0] , g[1] , g[2] , g[3] );
},
croiser: function(){//compté egalement le premier et dernier point
var g,nl=0;
this.cptr[0][nl] = this.ptr[0][0];
this.cptr[1][nl] = this.ptr[1][0];
this.cptr[2][nl] = this.ptr[2][0];
this.cptr[3][nl] = this.ptr[3][0];
nl++;
for(var r=0; r<this.len; r++){
var t = r+1/4;
g = interpol_lagrangeQ4(65,t,this.ptr);
this.cptr[0][nl] = g[0];
this.cptr[1][nl] = g[1];
this.cptr[2][nl] = g[2];
this.cptr[3][nl] = g[3];
nl++;
t = r+3/4;
g = interpol_lagrangeQ4(65,t,this.ptr);
this.cptr[0][nl] = g[0];
this.cptr[1][nl] = g[1];
this.cptr[2][nl] = g[2];
this.cptr[3][nl] = g[3];
nl++;
}
this.cptr[0][nl] = this.ptr[0][this.len-1];
this.cptr[1][nl] = this.ptr[1][this.len-1];
this.cptr[2][nl] = this.ptr[2][this.len-1];
this.cptr[3][nl] = this.ptr[3][this.len-1];
},
get_cptr: function(t){//utilier l'aproximation par crourbe croisé
var g = interpol_lagrangeQ4(65,t,this.ptr);//point de la courbe nature
var pt = v4_( g[0] , g[1] , g[2] , g[3] );
if(t>.5 && t<this.len-1.5){
var lp = (1-Math.abs((t%1)*2-1))*2;
lp = 1-Math.min(1,lp);
//lp = Math.min(lp*2,1);//avec une marge avant impacte
lp = 1-(1-Math.sin(( lp-.5)*PI))/2;
if(lp>0){
var tc = t*2+.5;
g = interpol_lagrangeQ4(65,tc,this.cptr);//point de la courbe croiser
var cpt = v4_( g[0] , g[1] , g[2] , g[3] );
pt.v = cpt.v.bary(pt.v,lp);
pt.w = cpt.w*lp+pt.w*(1-lp);
}
}
return pt;
},
function interpol_lagrangeQ4(c,t,M){//c = nombre de points,
//aproprier au interpolation de v4_
var y = [0,0,0,0],i=0,q=0,PK=1,
yy = [[],[],[],[]];
var len = M[0].length-1;
var splin = (1-(c%2)) + (c%2)*.5 -c/2;
var ti = t-Math.floor(t+splin);//point interpoler
if(ti%1!=0){
for(; i<c; i++){
q = Math.floor(t+i+splin);
if(q<0){q=0}else if(q>len){q=len}
yy[0][i] = M[0][ q ];
yy[1][i] = M[1][ q ];
yy[2][i] = M[2][ q ];
yy[3][i] = M[3][ q ];
PK *= (ti-i) ;
}
for(q=0; q<c; q++){
i = ((PK/(ti-q))/lagrang[c][q]);
y[0] += yy[0][q]*i;
y[1] += yy[1][q]*i;
y[2] += yy[2][q]*i;
y[3] += yy[3][q]*i;
}
}else{
i = Math.floor(t);
y[0] = M[0][ i ];
y[1] = M[1][ i ];
y[2] = M[2][ i ];
y[3] = M[3][ i ];
}
return y
}
var lagrang = new Array(197);//data pr interpolation lagrang degré [2;196]
for(var r=2; r<197; r++){
lagrang[r] = new Array(r);
for(var i=0; i<r; i++){
lagrang[r][i] = 1;
for(var q=0; q<r; q++){if(i!=q){lagrang[r][i] *= (i-q) }}
}
}
function fad_sin(dis,marg,fad){
var map=0;
if(dis<=marg){map=1}
else if(dis>marg && dis<marg+fad)
{map = (1-Math.sin(( (dis-marg)/fad -.5)*PI))/2}
return map;
}
function interpol_lagrangeQ4(c,t,M){//c = nombre de points,
//approprier au interpolation de vect4_
var y = v4_(0,0,0,0),i=0,q=0,PK=1,
yy = [[],[],[],[]];
var len = M.length-1;
var splin = (1-(c%2)) + (c%2)*.5 -c/2;
var ti = t-Math.floor(t+splin);//point interpoler
if(ti%1!=0){
for(; i<c; i++){
q = Math.floor(t+i+splin);
if(q<0){q=0}else if(q>len){q=len}
yy[0][i] = M[ q ].v.x;
yy[1][i] = M[ q ].v.y;
yy[2][i] = M[ q ].v.z;
yy[3][i] = M[ q ].w;
PK *= (ti-i) ;
}
for(q=0; q<c; q++){
i = ((PK/(ti-q))/lagrang[c][q]);
y.v.x += yy[0][q]*i;
y.v.y += yy[1][q]*i;
y.v.z += yy[2][q]*i;
y.w += yy[3][q]*i;
}
}else{
i = Math.floor(t);
y.v.x = M[ i ].v.x;
y.v.y = M[ i ].v.y;
y.v.z = M[ i ].v.z;
y.w = M[ i ].w;
}
return y
}
function courbe(){
//this.cercle = 0;//connection tête à queux
this.ptr = [];// des v4
this.cptr = [];//courbe croise
this.len = 0;
}
courbe.prototype = {
//new: function(){return new },
//get_v_directeur(t,div); retrun [vecteur_directionnel , ptr],
add_point: function(ptr,w){
this.ptr[this.len] = new vect4(ptr,w);
this.len++;
},
get_ptr: function(t){
return interpol_lagrangeQ4(65,t,this.ptr);
},
croiser: function(){//compté egalement le premier et dernier point
var nl=0;
this.cptr[nl++] = new vect4(this.ptr[0].v,this.ptr[0].w);
for(var r=0; r<this.len; r++){
this.cptr[nl++] = interpol_lagrangeQ4(65, r+1/4 ,this.ptr);
this.cptr[nl++] = interpol_lagrangeQ4(65, r+3/4 ,this.ptr);
}
this.cptr[nl++] = new vect4(this.ptr[this.len-1].v,this.ptr[this.len-1].w);
},
get_cptr: function(t){//utilier l'aproximation par crourbe croisé
var pt = interpol_lagrangeQ4(65,t,this.ptr);//point de la courbe nature
if(t>.5 && t<this.len-1.5){
var lp = (1-Math.abs((t%1)*2-1))*2;
lp = 1-Math.min(1,lp);
//lp = Math.min(lp*2,1);//avec une marge avant impacte
lp = 1-(1-Math.sin(( lp-.5)*PI))/2;
if(lp>0){
var tc = t*2+.5;
var cpt = interpol_lagrangeQ4(65,tc,this.cptr);//point de la courbe croiser
pt.v = cpt.v.bary(pt.v,lp);
pt.w = cpt.w*lp+pt.w*(1-lp);
}
}
return pt;
},
p: function(v){
for(var r=0; r<this.len; r++){ this.ptr[r].v.p(v) }
}
}
function courbe_multiple(){
this.fibre = [];
this.len = 0;
}
courbe_multiple.prototype = {
add_fibre : function(c){
this.fibre[this.len] = c;//new courbe()
this.len++;
},
get_fibre : function(ti){//ti de 0 à 1
var cou_r = new courbe();
for(var k=0; k<this.len; k++){
var t = ti*(this.fibre[k].len-1);
var v = this.fibre[k].get_ptr(t);
cou_r.add_point(v.v,v.w);
}
return cou_r;
},
get_cfibre : function(ti){//ti de 0 à 1 , par courbe croiser
var cou_r = new courbe();
for(var k=0; k<this.len; k++){
var t = ti*(this.fibre[k].len-1);
var v = this.fibre[k].get_cptr(t);
cou_r.add_point(v.v,v.w);
}
cou_r.croiser();
return cou_r;
},
p: function(v){
for(var r=0; r<this.len; r++){this.fibre[r].p(v)}
},
croiser: function(v){
for(var r=0; r<this.len; r++){this.fibre[r].croiser()}
}
}
moyen_carre: function(v,M,iter){
var t,k = 0,r,vi, a,x,y,x2,y2,x1;
var li = v_(M.length-1,M[0].length-1);
for(var i=0; i<iter; i++){//calcule un cercle de point de brouillar
t = i/iter*PI2;
for(var u=1; u<=iter; u++){
r = u/iter;
//k += this.carre( v_( v.x+Math.cos(t)*r , v.y+Math.sin(t)*r ) ,M)*r;
a = new vect2(cadr(v.x+Math.cos(t)*r,0,li.x),//encadrement
cadr(v.y+Math.sin(t)*r,0,li.y));
x = Math.floor(a.x); x2 = Math.min(x+1,li.x);
y = Math.floor(a.y); y2 = Math.min(y+1,li.y);
a.x-=x; a.y-=y;
x1= 1-a.x;
k += ((M[x][y] *x1 + M[x2][y] *a.x)*(1-a.y) +
(M[x][y2]*x1 + M[x2][y2]*a.x)*a.y )*r;
}
}
return k/(iter*(iter+1)/2)
},
Echel_normal: function(centre,rayon, B){//vect2 position cerclular normalisateur
var mi=1000000,ma=-1000000,vr;
var [X,Y, X1,Y1] = cadr_v(centre.new_p(v_(-rayon.x,-rayon.y)),
centre.new_p(rayon),
v_(0,0),v_(this.w,this.h) );
for(var r=X; r<X1; r++){
for(var u=Y; u<Y1; u++){
vr = v_((r-centre.x)/rayon.x,(u-centre.y)/rayon.y);
z = vr.d(v_(0,0));
if( z < 1 ){
z = 1-c(z*z*z*z);
//z = (1-Math.sin((z-0.5)*PI))/2;
//z = z*z;
mi = Math.min(mi,B.M[r][u][0]/z,B.M[r][u][1]/z,B.M[r][u][2]/z);
ma = Math.max(ma,B.M[r][u][0]*z,B.M[r][u][1]*z,B.M[r][u][2]*z);
}
}}
return [mi,ma-mi]
},
Echel_carre: function(divis,iter){ //use this function !
//mise à l'échelle par interpolation 2point carré avec moyenne
// iter = 10 est assez bon
divis = defaul(divis,15);
iter = defaul(iter,10);
var x = this.w/divis, y = this.h/divis,
al_v = v_(x*racineD2,y*racineD2),
B = this.new(),
Jm = new Array(divis),//mini
Jl = new Array(divis);//delta
for(var r=0; r<divis; r++){
Jm[r] = new Array(divis);
Jl[r] = new Array(divis);
for(var u=0; u<divis; u++)
{ [Jm[r][u],Jl[r][u]] = this.Echel_normal(v_(r*x,u*y),al_v,B) }
}
var mi,l,v, t,vi;
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
v = v_(r/x,u/y);
mi = interpol.moyen_carre(v,Jm,iter);
l = interpol.moyen_carre(v,Jl,iter);
l = l==0 ? 1:l;
[ this.M[r][u][0],this.M[r][u][1],this.M[r][u][2] ] =
[ (B.M[r][u][0]-mi)/l ,
(B.M[r][u][1]-mi)/l ,
(B.M[r][u][2]-mi)/l ];
}}
//this.Echel(v_(0,0),v_(this.w,this.h));//mise à l'échelle absolut
},
function planette_ombre(v,p){
this.v = v;//point shadow centre planette
this.p = p;//precision de la spher_map
this.shadow = new Object();//tablau associatif des distance courte vers .v
}
planette_ombre.prototype = {
injection: function(ptr){//donner un point d'espace pour l'entrer dans la spher_map
var dis= this.v.d(ptr);
var vn = ptr.Nc(this.v);//normal
var vp = new vect3(
Math.floor((vn.x+1)/2*(this.p-1)),
Math.floor((vn.y+1)/2*(this.p-1)),
Math.floor((vn.z+1)/2*(this.p-1)));
var cle = vp.x*this.p*this.p + vp.y*this.p + vp.z;
if( !(cle in this.shadow) ){ this.shadow[cle] = dis }
else{ if(this.shadow[cle]>dis){this.shadow[cle] = dis } }
},
function planette_ombre(v,p){
this.v = v;//point shadow centre planette
this.p = p;//precision de la spher_map
this.pm1d2 = (this.p-1)/2;
this.pc = this.p*this.p;
this.shadow = new Object();//tablau associatif des distances courte vers .v
}
planette_ombre.prototype = {
injection: function(ptr){//donner un point d'espace pour l'entrer dans la spher_map
var dis= this.v.d(ptr);
var vn = ptr.Nc(this.v);//normal
var vp = new vect3(
Math.floor((vn.x+1)*this.pm1d2),
Math.floor((vn.y+1)*this.pm1d2),
Math.floor((vn.z+1)*this.pm1d2));
var cle = vp.x*this.pc + vp.y*this.p + vp.z;
//if( !(cle in this.shadow) ){ this.shadow[cle] = dis }
//else{ if(this.shadow[cle]>dis){this.shadow[cle] = dis } }
if( !(cle in this.shadow) ){ this.shadow[cle] = [dis,1000000] }
else{
if(dis<this.shadow[cle][0]){
if(dis+.05<this.shadow[cle][0] ){ this.shadow[cle][1] = this.shadow[cle][0] }
this.shadow[cle][0] = dis;
}
}
},
poly: function(f){
var iter = this.p*PI;
var a = f.a.Nc(this.v);
var b = f.b.Nc(this.v);
var c = f.c.Nc(this.v);
var dis_ab = a.d(b)*iter;
for(var r=0; r<=dis_ab; r++){//utiliser les distances normaliser
var g = r/dis_ab;
var vab = f.a.bary(f.b,g);
var ab = vab.Nc(this.v);
var dis_abc = ab.d(c)*iter;
for(var u=0; u<=dis_abc; u++){
var j = u/dis_abc;
var vabc = vab.bary(f.c,j);
this.injection(vabc);
}
}
},
exist_on: function(ptr){
var dis= this.v.d(ptr);
var vn = ptr.Nc(this.v);//normal
var mr = mat3_d0(vn);
var iter = 12;
var k = 0;
var c = v3_(0,0,0);
for(var i=0; i<iter; i++){
var t = i/iter*PI2;
for(var u=1; u<=iter; u++){
var r = u/iter;
var a = new vect3(Math.cos(t)*r,
Math.sin(t)*r,150);//focal de moyenne
a.r(c,mr);
a.N();
var vp = new vect3(
Math.floor((a.x+1)*this.pm1d2),
Math.floor((a.y+1)*this.pm1d2),
Math.floor((a.z+1)*this.pm1d2));
var cle = vp.x*this.pc + vp.y*this.p + vp.z;
if( cle in this.shadow ){
//k+=1-fad_sin(this.shadow[cle][0],dis-.1,.1);
if(this.shadow[cle][1] == 1000000){//premier distance
k+=fad_sin(dis,
this.shadow[cle][0]+.1
,.1);
}else{
k+=fad_sin(dis,
(this.shadow[cle][0]+this.shadow[cle][1])/2-.1
,.1);
}
}else{
k++;
}
}
}
return k/(iter*iter);
}
}
// in Vus3D object
ombrage: function(){
for(var r=0; r<this.w; r++){
for(var u=0; u<this.h; u++){
if( this.mz[r][u] != -1000000 ){
var v = v3_(r-this.wd,this.hd-u,this.mz[r][u]);
v.scal(1/this.scal);
var g = (this.perspect+v.z)/this.perspect;
v.x/=g; v.y/=g;
var g = this.ombre.exist_on(v);
//g = (1+g*3)/4;
g = (1+g*13)/14;
this.DD.M[r][u][0] *= g;
this.DD.M[r][u][1] *= g;
this.DD.M[r][u][2] *= g;//Math.sqrt(g);
}
}}
},