//Cantidades para un fotograma con proporcin raiz(3)/1 para los impares y 4/3 para los completos, pero prcticamente no vara
const float Cantidad_p[4][7]={	//Polinomios que empiezan en r
	{0, 0.58, 0.35, 0.28, 0.24, 0.21, 0},	//i
	{0, 0.58, 0.35, 0.23, 0.18, 0.15, 0},	//ic
	{0, 0.58, 0.42, 0.34, 0.30, 0.26, 0.24},	//c
	{0, 0.58, 0.28, 0.17, 0.13, 0.096, 0.077}	//cc
};
const float Cantidad_q[3][6]={	//Polinomios que empiezan en r^2
	{0,	0.41, 0.32, 0.28, 0.23, 0},		//i
	{0,	0.41, 0.20, 0.11, 0.080, 0.061},//ic
	{0,	0.40, 0.39, 0.32, 0.28, 0.25},	//c
	{0,	0.40, 0.22, 0.14, 0.10, 0.082}	//cc
};

const char* const polinomios_p[][3]={
	{NULL,NULL,NULL},
	{"s","s","s"},
	{"1/2(5s^3-3s)","(4s^2-3s)","(3s^2-2s)"},
	{"1/8(63s^5-70s^3+15s)","(15s^3-20s^2+20s)","(9s^3-11.4s^2+3.4s)"},
	{"1/16(429s^7-693s^5+315s^3-35s)","(56s^4-105s^3+60s^2-10s)","(29.2s^4 -53.1s^3 +30.1s^2 -5.2s)"},
	{"1/128(12155s^9-25740s^7+18018s^5-4620s^3+315s)","(210s^5-504s^4+420s^3-140s^2+15s)","(95.8s^5 -225.4s^4 +187.1s^3 -63.9Fs^2 +7.4s)"},
	{"","(792s^6-2310s^5+2520s^4-1260s^3+280s^2-21s)","(320.3s^6-922.1s^5+1004.9s^4-511.4s^3+119.2s^2-9.9s)"}
};
const char* const polinomios_q[][3]={
	{NULL,NULL,NULL},
	{"s^2","s^2","s^2"},
	{"1/2(7s^4-5s^2)","(6s^3-5s^2)","(4s^3-3s^2)"},
	{"1/8(99s^6-126s^4+35s^2)","(28s^4-42s^3+15s^2)","(14.5s^4-20.3s^3+6.8s^2)"},
	{"1/16(715s^8-1287s^6+693s^4-105s^2)","(120s^5-252s^4+168s^3-35s^2)","(53.5s^5-107.8s^4+69.5s^3-14.2s^2)"}
};

float polii(s8int i, float r, bint entre_r){
	float poli;
	float r2=r*r;
	float r4=r2*r2;
	float r6=r4*r2;

	poli=0;
	switch(i){
	  case 1: poli=1; break;
	  case 2: poli=(5*r2-3)/2; break;
	  case 3: poli=(63*r4-70*r2+15)/8; break;
	  case 4: poli=(429*r6-693*r4+315*r2-35)/16; break;
	  case 5: poli=(12155*r4*r4-25740*r6+18018*r4-4620*r2+315)/128; break;
	  case 6: poli=0; break;
	}
	if(!entre_r) poli*=r;
	return poli;
}
float polic(s8int i, float r, bint entre_r){
	float poli;
	float r2=r*r;
	float r3=r2*r;
	float r4=r2*r2;

	poli=0;
	switch(i){
	  case 1: poli=1; break;
	  case 2: poli=4*r-3; break;
	  case 3: poli=15*r2-20*r+6; break;
	  case 4: poli=56*r3-105*r2+60*r-10; break;
	  case 5: poli=210*r4-504*r3+420*r2-140*r+15; break;
	  case 6: poli=792*r*r4-2310*r4+2520*r3-1260*r2+280*r-21; break;
	}
	if(!entre_r) poli*=r;
	return poli;
}
float polip(s8int i, float r, bint entre_r){
	float poli;
	float r2=r*r;
	float r4=r2*r2;
	float r6=r4*r2;

	poli=0;
	switch(i){
	  case 1: poli=1; break;
	  case 2: poli=(7*r2-5)/2; break;
	  case 3: poli=(99*r4-126*r2+35)/8; break;
	  case 4: poli=(715*r6-1287*r4+693*r2-105)/16; break;
	}
	if(!entre_r) poli*=r2;
	else poli*=r;
	return poli;
}
float polic2(s8int i, float r, bint entre_r){
	float poli;
	float r2=r*r;
	float r3=r2*r;

	poli=0;
	switch(i){
	  case 1: poli=1; break;
	  case 2: poli=6*r-5; break;
	  case 3: poli=28*r2-42*r+15; break;
	  case 4: poli=120*r3-252*r2+168*r-35; break;
	}
	if(!entre_r) poli*=r2;
	else poli*=r;
	return poli;
}
float Radsimi(u16int parametros,float* Xradsim, float r, bint entre_r){
	s8int i;
	u16int l;
	float Dist;

	Dist=0;
	for(i=1,l=1;i<=5;i++,l<<=1){
		if(!(parametros & l)) continue;
		Dist+=Xradsim[i-1]*polii(i,r,entre_r);
	}
	return Dist;
}
float Radsimc(u16int parametros,float* Xradsim, float r, bint entre_r){
	s8int i;
	u16int l;
	float Dist;

	Dist=0;
	for(i=1,l=1;i<=5;i++,l<<=1){
		if(!(parametros & l)) continue;
		Dist+=Xradsim[i-1]*polic(i,r,entre_r);
	}
	return Dist;
}

string crea_formulac_simetricas(u8int modelo,float* Xradsim,short decf){
	string s;
	s8int i;
	float a[5],f;
	char ss[20];
	bint b=false;
	char c;

	a[1]=0; a[2]=0; a[3]=0; a[4]=0;
	a[0]=*Xradsim;
	switch(modelo){
	  case 1:
		a[0]=Xradsim[0];
		f=Xradsim[1]/2;
		a[1]=5*f;
		a[0]-=3*f;
		f=Xradsim[2]/8;
		a[2]=63*f;
		a[1]-=70*f;
		a[0]+=15*f;
		f=Xradsim[3]/16;
		a[3]=429*f;
		a[2]-=693*f;
		a[1]+=315*f;
		a[0]-=35*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4]/128;
			a[4]=12155*f;
			a[3]-=25740*f;
			a[2]+=18018*f;
			a[1]-=4620*f;
			a[0]+=315*f;
		}
		break;
	  case 2:
		a[0]=Xradsim[0];
		f=Xradsim[1];
		a[1]=4*f;
		a[0]-=3*f;
		f=Xradsim[2];
		a[2]=15*f;
		a[1]-=20*f;
		a[0]+=6*f;
		f=Xradsim[3];
		a[3]=56*f;
		a[2]-=105*f;
		a[1]+=60*f;
		a[0]-=10*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4];
			a[4]=210*f;
			a[3]-=504*f;
			a[2]+=420*f;
			a[1]-=140*f;
			a[0]+=15*f;
		}
		break;
	  case 3:
		a[0]=Xradsim[0];
		f=Xradsim[1];
		a[1]=3*f;
		a[0]-=2*f;
		f=Xradsim[2];
		a[2]=9.F*f;
		a[1]-=11.4F*f;
		a[0]+=3.4F*f;
		f=Xradsim[3];
		a[3]=29.2F*f;
		a[2]-=53.1F*f;
		a[1]+=30.1F*f;
		a[0]-=5.2F*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4];
			a[4]=95.8F*f;
			a[3]-=225.4F*f;
			a[2]+=187.1F*f;
			a[1]-=63.9F*f;
			a[0]+=7.4F*f;
		}
		break;
	}
	s="";
	for(i=0;i<5;i++){
		if((f=a[i])==0) continue;
		if(b){s.append(" "); c='+';}
		else c='\0';
		s.append(str_float_dec(f,decf,ss,c,false));
		ss[0]='s';
		if(i){
			ss[1]='^';
			switch(modelo){
			  case 1: ss[2]=2*i+'1'; break;
			  case 2: case 3: ss[2]=i+'1'; break;
			}
			ss[3]='\0';
		}else ss[1]='\0';
		s.append(ss);
		b=true;
	}
	return s;
}
string crea_formulac_simetricar(u8int modelo,float* Xradsim,float semidiag,short decf){
	string s;
	s8int i;
	float a[5],f;
	char ss[20];
	bint b=false;
	float s2=semidiag*semidiag;
	float s3=s2*semidiag;
	float s4=s2*s2;
	float s5=s4*semidiag;
	char c;
	short d;
	float logs, paso;
	logs=log10(semidiag);
	if(modelo==2) paso=2.0F*logs;
	else paso=logs;

	a[1]=0; a[2]=0; a[3]=0; a[4]=0;
	a[0]=*Xradsim;
	switch(modelo){
	  case 1:
		a[0]=Xradsim[0];
		f=Xradsim[1]/2;
		a[1]=5*f;
		a[0]-=3*f;
		f=Xradsim[2]/8;
		a[2]=63*f;
		a[1]-=70*f;
		a[0]+=15*f;
		f=Xradsim[3]/16;
		a[3]=429*f;
		a[2]-=693*f;
		a[1]+=315*f;
		a[0]-=35*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4]/128;
			a[4]=12155*f;
			a[3]-=25740*f;
			a[2]+=18018*f;
			a[1]-=4620*f;
			a[0]+=315*f;
		}
		a[0]/=semidiag;
		a[1]/=s3;
		a[2]/=s5;
		a[3]/=s5*s2;
		a[4]/=s5*s4;
		break;
	  case 2:
		a[0]=Xradsim[0];
		f=Xradsim[1];
		a[1]=4*f;
		a[0]-=3*f;
		f=Xradsim[2];
		a[2]=15*f;
		a[1]-=20*f;
		a[0]+=6*f;
		f=Xradsim[3];
		a[3]=56*f;
		a[2]-=105*f;
		a[1]+=60*f;
		a[0]-=10*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4];
			a[4]=210*f;
			a[3]-=504*f;
			a[2]+=420*f;
			a[1]-=140*f;
			a[0]+=15*f;
		}
		a[0]/=semidiag;
		a[1]/=s2;
		a[2]/=s3;
		a[3]/=s4;
		a[4]/=s5;
		break;
	  case 3:
		a[0]=Xradsim[0];
		f=Xradsim[1];
		a[1]=3*f;
		a[0]-=2*f;
		f=Xradsim[2];
		a[2]=9.F*f;
		a[1]-=11.4F*f;
		a[0]+=3.4F*f;
		f=Xradsim[3];
		a[3]=29.2F*f;
		a[2]-=53.1F*f;
		a[1]+=30.1F*f;
		a[0]-=5.2F*f;
		if(Xradsim[4]!=0){
			f=Xradsim[4];
			a[4]=95.8F*f;
			a[3]-=225.4F*f;
			a[2]+=187.1F*f;
			a[1]-=63.9F*f;
			a[0]+=7.4F*f;
		}
		a[0]/=semidiag;
		a[1]/=s2;
		a[2]/=s3;
		a[3]/=s4;
		a[4]/=s5;
		break;
	}
	s="";
	for(i=0;i<5;i++,logs+=paso){
		if((f=a[i])==0) continue;

		if(b){s.append(" "); c='+';}
		else c='\0';
		d=decf+(int)(logs+0.9F);
		if(fabsf(f)>=0.001F) str_float_dec(f,d,ss,c,false);
		else{d+=log10n(f)+1; if(d<1) d=1;
			str_float_prec(f,d,ss,c);}
		s.append(ss);
		ss[0]='r';
		if(i){
			ss[1]='^';
			switch(modelo){
			  case 1: ss[2]=2*i+'1'; break;
			  case 2: case 3: ss[2]=i+'1'; break;
			}
			ss[3]='\0';
		}else ss[1]='\0';
		s.append(ss);
		b=true;
	}
	return s;
}

void colapsa_asimetrica_rt(u8int modelo,const float* Xradasim, float* a){
	float f;

	a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; a[5]=0;
	switch(modelo){
	  case 1:
		a[0]=Xradasim[0];
		a[1]=Xradasim[1];
		f=Xradasim[2]/2;
		a[2]+=7*f;
		a[0]-=5*f;
		f=Xradasim[3]/2;
		a[3]+=7*f;
		a[1]-=5*f;
		a[4]=Xradasim[4];
		a[5]=Xradasim[5];
		break;
	  case 2:
		a[0]=Xradasim[0];
		a[1]=Xradasim[1];
		f=Xradasim[2];
		a[0]-=5*f;
		a[2]+=6*f;
		f=Xradasim[3];
		a[1]-=5*f;
		a[3]+=6*f;
		a[4]=Xradasim[4];
		a[5]=Xradasim[5];
		break;
	  case 3:
		a[0]=Xradasim[0];
		a[1]=Xradasim[1];
		f=Xradasim[2];
		a[0]-=3*f;
		a[2]+=4*f;
		f=Xradasim[3];
		a[1]-=3*f;
		a[3]+=4*f;
		a[4]=Xradasim[4];
		a[5]=Xradasim[5];
		break;
	}
}
void colapsa_asimetrica_uv(u8int modelo,const float* Xserie, float* a){
	float f;	// 0 y 1 no se colapsan

	a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; a[5]=0;
	switch(modelo){
	  case 1:
		f=Xserie[2]/2;
		a[2]+=7*f;
		a[0]-=5*f;
		f=Xserie[3]/2;
		a[3]+=7*f;
		a[1]-=5*f;
		a[4]=Xserie[4];
		a[5]=Xserie[5];
		break;
	  case 2:
		f=Xserie[2];
		a[0]-=5*f;
		a[2]+=6*f;
		f=Xserie[3];
		a[1]-=5*f;
		a[3]+=6*f;
		a[4]=Xserie[4];
		a[5]=Xserie[5];
		break;
	  case 3:
		f=Xserie[2];
		a[0]-=3*f;
		a[2]+=4*f;
		f=Xserie[3];
		a[1]-=3*f;
		a[3]+=4*f;
		a[4]=Xserie[4];
		a[5]=Xserie[5];
		break;
	}
}
