00001
00002
00003
00004
00005
00006 #ifndef realroot_SOLVE_SBDSLV_LOOPS_BRNOPS_H
00007 #define realroot_SOLVE_SBDSLV_LOOPS_BRNOPS_H
00008
00009 #include<algorithm>
00010
00011 namespace mmx {
00012
00013
00014
00015 namespace brnops
00016 {
00017
00018
00019
00020
00021
00022 template<typename real_t>
00023 void decasteljau( real_t * r, unsigned sz, const real_t& t, int str = 1 )
00024 {
00025 real_t *er, *p;
00026 for ( er = r + (sz-1)*str; er != r; er -= str )
00027 for ( p = r; p != er; p += str )
00028 *p = (1.0-t)**p+t**(p+str);
00029 };
00030
00031
00032
00033
00034
00035
00036 template<typename real_t>
00037 void decasteljau( real_t * r, unsigned sz, int str = 1 )
00038 {
00039 real_t *er, *p;
00040 for ( er = r + (sz-1)*str; er != r; er -= str )
00041 for ( p = r; p != er; p += str )
00042 *p = (*p+*(p+str))/2.0;
00043 };
00044
00045
00046 template<typename real_t>
00047 real_t eval( real_t const * const src, unsigned sz, const real_t& t, int st = 1 )
00048 {
00049 real_t tmp[sz];
00050 std::copy( src, src + sz, tmp );
00051 decasteljau( tmp, sz, t );
00052 return tmp[0];
00053 };
00054
00055
00056 template<typename real_t>
00057 real_t eval( real_t const * const src, unsigned sz, int st = 1 )
00058 {
00059 real_t tmp[sz];
00060 std::copy( src, src + sz, tmp );
00061 decasteljau( tmp, sz );
00062 return tmp[0];
00063 };
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 template<typename real_t>
00079 void decasteljau( real_t * r, real_t * l, unsigned sz, const real_t& t, int str = 1, int stl = 1 )
00080 {
00081 real_t * er, * p;
00082 for ( er = r + (sz-1)*str; er != r; er -= str, l += stl )
00083 {
00084 *l = *r;
00085 for ( p = r; p != er; p += str )
00086 *p = (1.0-t)**p+t**(p+str);
00087 };
00088 *l = *r;
00089 };
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 template<typename real_t>
00104 void decasteljau( real_t * r, real_t * l, unsigned sz, int str = 1, int stl = 1 )
00105 {
00106 real_t * er, * p;
00107 er = r + (sz-1)*str;
00108 for ( er = r + (sz-1)*str; er != r; er -= str, l += stl )
00109 {
00110 *l = *r;
00111 for ( p = r; p != er; p += str )
00112 *p = (*p+*(p+str))/2.0;
00113 };
00114 *l = *r;
00115 };
00116
00117
00118
00119
00120
00121
00122 template<typename real_t>
00123 void lrestrict( real_t * data, int sz, const real_t& t, int st )
00124 { decasteljau(data,sz,t,st); };
00125
00126
00127
00128
00129
00130
00131 template<typename real_t>
00132 void rrestrict( real_t * data, int sz, const real_t& t, int st )
00133 { decasteljau( data + (sz-1)*st, sz, (real_t)(real_t(1)-t), -st ); };
00134
00135
00136
00137 template<typename real_t>
00138 void hodograph( real_t * dst, real_t const * const src, unsigned sz, int st)
00139 {
00140 int p = 0;
00141 for ( unsigned i = 0; i < sz-1; i ++, p += st ) dst[p] = src[p+st]-src[p];
00142 };
00143
00144 template<typename real_t>
00145 void diff( real_t * dst, real_t const * const src, unsigned sz, int sta = 1, int stout = 1)
00146 {
00147 int pa = 0;
00148 int po = 0;
00149 for ( unsigned i = 0; i < sz-1; i ++, pa += sta, po += stout )
00150 dst[po] = (sz-1)*(src[pa+sta]-src[pa]);
00151 };
00152
00153
00154 template<typename real_t>
00155 bool rockwood_cut( real_t& t, real_t const * b, unsigned sz, int st = 1 )
00156 {
00157 for ( unsigned i = 0; i < sz-1; i ++ )
00158 {
00159 if ( b[i*st]*b[(i+1)*st] <= 0 )
00160 {
00161 real_t d = b[i*st]-b[(i+1)*st];
00162 t = (i*d+b[i])/(sz*d);
00163 return true;
00164 };
00165 };
00166 return false;
00167 };
00168 };
00169
00170 }
00171
00172 #endif //