static gboolean intersection2(t_env *rt, t_vector ray, t_vector origin, int i) { if ((rt->object[i].name == L_SPHERE && limited_sphere(ray, rt->object[i], origin, rt)) || (rt->object[i].name == L_CYLINDER && limited_cylinder(ray, rt->object[i], origin, rt)) || (rt->object[i].name == L_CONE && limited_cone(ray, rt->object[i] , origin, rt)) || (rt->object[i].name == TRIANGLE && triangle(ray, rt->object[i], &rt->t, origin)) || (rt->object[i].name == TORUS && torus(ray, rt->object[i], &rt->t , origin)) || (rt->object[i].name == ELLIPSOIDE && ellipsoide(ray, rt->object[i], &rt->t, origin)) || (rt->object[i].name == PARABOL && parabol(ray, rt->object[i], &rt->t, origin)) || (rt->object[i].name == QUADRILATERAL && quadrilateral(ray, rt->object[i], &rt->t, origin)) || (rt->object[i].name == CUBE && cube(ray, &rt->object[i], &rt->t, origin))) return (1); return (0); }
int main() { const int a = 0; const int b = 1; const float step = 0.1; p0.x = 0; p0.y = y(p0.x); p1.x = 1; p1.y = y(p1.x); p2.x = 2; p2.y = y(p2.x); printf("y(x) = (x-1)^3+(2x+3)^3-27x^3-8\n\n"); printf("X\t Y\t Linear Parabol Lagranj1 Lagranj2 Nyton1 Nyton2\n"); for (float x = a; x < b; x += step) { printf("%g\t%f %f %f %f %f %f %f\n", x, y(x), linear(x), parabol(x), Lagranj1(x), Lagranj2(x), Nyton1(x), Nyton2(x)); } system("pause"); return 0; }
void vpTemplateTracker::computeOptimalBrentGain(const vpImage<unsigned char> &I,vpColVector &tp,double tMI,vpColVector &direction,double &alpha) { vpColVector **ptp; ptp=new vpColVector*[4]; vpColVector p0(nbParam); p0=tp; //valeur necessaire si conditionnel vpColVector dpt(Warp->getNbParam()); vpColVector adpt(Warp->getNbParam()); vpColVector p1(nbParam); if(useCompositionnal) { if(useInverse) Warp->getParamInverse(direction,dpt); else dpt=direction; Warp->pRondp(tp,dpt,p1); } else { p1=tp+direction; } vpColVector p2(nbParam); if(useCompositionnal) { adpt=alpha*direction; if(useInverse) Warp->getParamInverse(adpt,dpt); else dpt=adpt; Warp->pRondp(tp,dpt,p2); } else { p2=tp+alpha*direction; } vpColVector p3(nbParam); ptp[0]=&p0; ptp[1]=&p1; ptp[2]=&p2; ptp[3]=&p3; double *Cost=new double[4]; //Cost[0]=getCost(I,p0); Cost[0]=tMI; Cost[1]=getCost(I,p1); Cost[2]=getCost(I,p2); double *talpha=new double[4]; talpha[0]=0; talpha[1]=1.; talpha[2]=alpha; //for(int i=0;i<3;i++) // std::cout<<"alpha["<<i<<"] = "<<talpha[i]<<" Cost["<<i<<"] = "<<Cost[i]<<std::endl; //Utilise trois estimï¿œes de paraboles succesive ... //A changer pour rendre adaptable for(unsigned int opt=0;opt<nbIterBrent;opt++) { //double a=talpha[0]; //double b=talpha[1]; //double c=talpha[2]; //double Cost0=Cost[0]; //double Cost1=Cost[1]; //double Cost2=Cost[2]; vpMatrix A(3,3); for(unsigned int i=0;i<3;i++){A[i][0]=talpha[i]*talpha[i];A[i][1]=talpha[i];A[i][2]=1.;} //std::cout<<"A="<<A<<std::endl; vpColVector B(3);for(unsigned int i=0;i<3;i++)B[i]=Cost[i]; vpColVector parabol(3);parabol=(A.t()*A).inverseByLU()*A.t()*B; //vpColVector parabol(3);parabol=A.pseudoInverse()*B; //si convexe if(parabol[0]>0) { talpha[3]=-0.5*parabol[1]/parabol[0]; //std::cout<<"parabol = "<<parabol<<std::endl; //std::cout<<"convexe talpha = "<<talpha[3]<<std::endl; } else//si concave { int tindic_x_min=0; int tindic_x_max=0; for(int i=1;i<3;i++) { if(talpha[i]<talpha[tindic_x_min]) tindic_x_min=i; if(talpha[i]>talpha[tindic_x_max]) tindic_x_max=i; } if(Cost[tindic_x_max]<Cost[tindic_x_min]) { //talpha[3]=talpha[tindic_x_max]+1.; talpha[3]=talpha[tindic_x_max]+1.; /*if(talpha[tindic_x_min]>talpha[tindic_x_max]) talpha[3]=talpha[tindic_x_min]+1.; else talpha[3]=talpha[tindic_x_min]-1.;*/ } else { //talpha[3]=talpha[tindic_x_min]-1.; talpha[3]=talpha[tindic_x_min]-1.; /*if(talpha[tindic_x_min]<talpha[tindic_x_max]) talpha[3]=talpha[tindic_x_max]+1.; else talpha[3]=talpha[tindic_x_max]-1.;*/ } //std::cout<<"concave talpha="<<talpha[3]<<std::endl; } //std::cout<<"talpha="<<talpha[3]<<std::endl; int indic_x_min=0; int indic_x_max=0; for(int i=1;i<3;i++) { if(talpha[i]<talpha[indic_x_min]) indic_x_min=i; if(talpha[i]>talpha[indic_x_max]) indic_x_max=i; } //std::cout<<"talpha = "<<talpha[3]<<std::endl; if(talpha[3]>talpha[indic_x_max]) if((talpha[3]-talpha[indic_x_max])>alpha)talpha[3]=talpha[indic_x_max]+4.; if(talpha[3]<talpha[indic_x_min]) if((talpha[indic_x_min]-talpha[3])>alpha)talpha[3]=talpha[indic_x_min]-4.; /*if(((b-a)*(Cost1-Cost2)-(b-c)*(Cost1-Cost0))==0) {Cost[3]=1000;break;} //calcul du gain correspondant au minimum de la parabole estimï¿œe talpha[3]=b-0.5*((b-a)*(b-a)*(Cost1-Cost2)-(b-c)*(b-c)*(Cost1-Cost0))/((b-a)*(Cost1-Cost2)-(b-c)*(Cost1-Cost0)); int indic_x_min=0; int indic_x_max=0; for(int i=1;i<3;i++) { if(talpha[i]<talpha[indic_x_min]) indic_x_min=i; if(talpha[i]>talpha[indic_x_max]) indic_x_max=i; } std::cout<<"talpha = "<<talpha[3]<<std::endl; if(talpha[3]>talpha[indic_x_max]) if((talpha[3]-talpha[indic_x_max])>alpha)talpha[3]=talpha[indic_x_max]+alpha; if(talpha[3]<talpha[indic_x_min]) if((talpha[indic_x_min]-talpha[3])>alpha)talpha[3]=talpha[indic_x_min]-alpha;*/ //p3=tp-talpha[3]*direction; if(useCompositionnal) { adpt=talpha[3]*direction; if(useInverse) Warp->getParamInverse(adpt,dpt); else dpt=adpt; Warp->pRondp(tp,dpt,p3); } else { p3=tp+talpha[3]*direction; } Cost[3]=getCost(I,p3); //std::cout<<"new cost="<<Cost[3]<<std::endl; int indice_f_max=0; for(int i=1;i<4;i++) if(Cost[i]>Cost[indice_f_max]) indice_f_max=i; if(indice_f_max!=3) { *ptp[indice_f_max]=*ptp[3]; Cost[indice_f_max]=Cost[3]; talpha[indice_f_max]=talpha[3]; } else break; } int indice_f_min=0; for(int i=0;i<4;i++) if(Cost[i]<Cost[indice_f_min]) indice_f_min=i; alpha=talpha[indice_f_min]; if(alpha<1)alpha=1.; delete[] ptp; delete[] Cost; delete[] talpha; }