X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fsynfigapp%2Fblineconvert.cpp;h=3c6f3f94f1976f1e301f3eb9107a924f9dc22b28;hb=917cf8e85c1da64b71c9ce19d593f4f6de85c6ad;hp=cc01ce95df0ef18d09b971aebc1f65488d002517;hpb=a191da9427eede988cf72a4ea3c9e4db210062fc;p=synfig.git diff --git a/synfig-studio/trunk/src/synfigapp/blineconvert.cpp b/synfig-studio/trunk/src/synfigapp/blineconvert.cpp index cc01ce9..3c6f3f9 100644 --- a/synfig-studio/trunk/src/synfigapp/blineconvert.cpp +++ b/synfig-studio/trunk/src/synfigapp/blineconvert.cpp @@ -99,94 +99,95 @@ inline void ThreePointdt(T &df, const T &f1, const T &f2, const T &f3, int bias) } } -template < class T > -inline void ThreePointddt(T &df, const T &f1, const T &f2, const T &f3, int bias) -{ - //a 3 point approximation pretends to have constant acceleration, so only one algorithm needed for left, middle, or right - df = (f1 -f2*2 + f3)*(1/2.0f); -} - -// WARNING -- totally broken -template < class T > -inline void FivePointddt(T &df, const T &f1, const T &f2, const T &f3, int bias) -{ - if(bias == 0) - { - assert(0); // !? - //middle - //df = (- f1 + f2*16 - f3*30 + f4*16 - f5)*(1/12.0f); - }/*else if(bias < 0) - { - //left - df = (f1*7 - f2*26*4 + f3*19*6 - f4*14*4 + f5*11)*(1/12.0f); - }else - { - //right - df = (f1*3 - f2*16 + f3*36 - f4*48 + f5*25)*(1/12.0f); - }*/ - //side ones don't work, use 3 point -} - -//implement an arbitrary derivative -//dumb algorithm -template < class T > -void DerivativeApprox(T &df, const T f[], const Real t[], int npoints, int indexval) -{ - /* - Lj(x) = PI_i!=j (x - xi) / PI_i!=j (xj - xi) - - so Lj'(x) = SUM_k PI_i!=j|k (x - xi) / PI_i!=j (xj - xi) - */ - - unsigned int i,j,k,i0,i1; - - Real Lpj,mult,div,tj; - Real tval = t[indexval]; - - //sum k - for(j=0;j +// inline void ThreePointddt(T &df, const T &f1, const T &f2, const T &f3, int bias) +// { +// // a 3 point approximation pretends to have constant acceleration, +// // so only one algorithm needed for left, middle, or right +// df = (f1 -f2*2 + f3)*(1/2.0f); +// } +// +// // WARNING -- totally broken +// template < class T > +// inline void FivePointddt(T &df, const T &f1, const T &f2, const T &f3, int bias) +// { +// if(bias == 0) +// { +// assert(0); // !? +// //middle +// //df = (- f1 + f2*16 - f3*30 + f4*16 - f5)*(1/12.0f); +// }/*else if(bias < 0) +// { +// //left +// df = (f1*7 - f2*26*4 + f3*19*6 - f4*14*4 + f5*11)*(1/12.0f); +// }else +// { +// //right +// df = (f1*3 - f2*16 + f3*36 - f4*48 + f5*25)*(1/12.0f); +// }*/ +// //side ones don't work, use 3 point +// } +// +// //implement an arbitrary derivative +// //dumb algorithm +// template < class T > +// void DerivativeApprox(T &df, const T f[], const Real t[], int npoints, int indexval) +// { +// /* +// Lj(x) = PI_i!=j (x - xi) / PI_i!=j (xj - xi) +// +// so Lj'(x) = SUM_k PI_i!=j|k (x - xi) / PI_i!=j (xj - xi) +// */ +// +// unsigned int i,j,k,i0,i1; +// +// Real Lpj,mult,div,tj; +// Real tval = t[indexval]; +// +// //sum k +// for(j=0;j -inline int sign(T f, T tol) -{ - if(f < -tol) return -1; - if(f > tol) return 1; - return 0; -} +// template < class T > +// inline int sign(T f, T tol) +// { +// if(f < -tol) return -1; +// if(f > tol) return 1; +// return 0; +// } void GetFirstDerivatives(const std::vector &f, unsigned int left, unsigned int right, char *out, unsigned int dfstride) { @@ -361,8 +362,12 @@ int tessellate_curves(const std::vector &inds, const std::vector //build hermite curve, it's easier curve.p1() = f[i0]; curve.p2() = f[i3]; - curve.t1() = df[i0]*(df[i0].mag_squared() > 1e-4 ? j2->tangentscale/df[i0].mag() : j2->tangentscale); - curve.t2() = df[i3]*(df[i3].mag_squared() > 1e-4 ? j->tangentscale/df[i3].mag() : j->tangentscale); + curve.t1() = df[i0-ibase] * (df[i0-ibase].mag_squared() > 1e-4 + ? j2->tangentscale/df[i0-ibase].mag() + : j2->tangentscale); + curve.t2() = df[i3-ibase] * (df[i3-ibase].mag_squared() > 1e-4 + ? j->tangentscale/df[i3-ibase].mag() + : j->tangentscale); curve.sync(); //MUST include the end point (since we are ignoring left one) @@ -625,7 +630,7 @@ synfigapp::BLineConverter::operator () (std::list &out, cons df.resize(size); GetFirstDerivatives(ftemp,0,size,(char*)&df[0],sizeof(df[0])); //GetSimpleDerivatives(ftemp,0,size,df,0,di); - //< don't have to worry about indexing stuff as it is all being taken car of right now + //< don't have to worry about indexing stuff as it is all being taken care of right now //preproceval += timer(); //numpre++;