118 this->useDotRatios = useDotRatios;
119 this->reflectBoundary = reflectBoundary;
129 for(
int i=0 ; i<=Degree ; i++ ) baseBSpline[i] = Polynomial< Degree >::BSplineComponent( i ).shift(
static_cast<double>(-(Degree+1)/2) + i - 0.5 );
133 for(
int i=0 ; i<Degree+3 ; i++ )
135 sPolys[i].
start =
static_cast<double>(-(Degree+1)/2) + i - 1.5;
137 if( i<=Degree ) sPolys[i].
p +=
baseBSpline[i ].shift( -1 );
138 if( i>=1 && i<=Degree+1 ) sPolys[i].
p +=
baseBSpline[i-1];
139 for(
int j=0 ; j<i ; j++ ) sPolys[i].p -= sPolys[j].p;
142 for(
int i=0 ; i<Degree+3 ; i++ )
144 sPolys[i].
start =
static_cast<double>(-(Degree+1)/2) + i - 0.5;
147 if( i>=1 && i<=Degree+1 ) sPolys[i].
p +=
baseBSpline[i-1].shift( 1 );
148 for(
int j=0 ; j<i ; j++ ) sPolys[i].p -= sPolys[j].p;
162 if( reflectBoundary )
192 double vvIntegrals[Degree+1][Degree+1];
193 double vdIntegrals[Degree+1][Degree ];
194 double dvIntegrals[Degree ][Degree+1];
195 double ddIntegrals[Degree ][Degree ];
196 int vvSums[Degree+1][Degree+1];
197 int vdSums[Degree+1][Degree ];
198 int dvSums[Degree ][Degree+1];
199 int ddSums[Degree ][Degree ];
205 for(
int d1=0 ; d1<=
depth ; d1++ )
206 for(
int off1=0 ; off1<(1<<d1) ; off1++ )
216 for(
int i=0 ; i<int(b1.size()) ; i++ )
for(
int j=0 ; j<=Degree ; j++ )
218 if( b1[i][j] && start1==-1 ) start1 = i;
219 if( b1[i][j] ) end1 = i+1;
221 for(
int d2=d1 ; d2<=
depth ; d2++ )
223 for(
int off2=0 ; off2<(1<<d2) ; off2++ )
225 int start2 = off2-Degree;
226 int end2 = off2+Degree+1;
227 if( start2>=end1 || start1>=end2 )
continue;
228 start2 = std::max< int >( start1 , start2 );
229 end2 = std::min< int >( end1 , end2 );
230 if( d1==d2 && off2<off1 )
continue;
237 int idx1 =
Index( ii , jj ) , idx2 =
Index( jj , ii );
239 memset( vvSums , 0 ,
sizeof(
int ) * ( Degree+1 ) * ( Degree+1 ) );
240 memset( vdSums , 0 ,
sizeof(
int ) * ( Degree+1 ) * ( Degree ) );
241 memset( dvSums , 0 ,
sizeof(
int ) * ( Degree ) * ( Degree+1 ) );
242 memset( ddSums , 0 ,
sizeof(
int ) * ( Degree ) * ( Degree ) );
243 for(
int i=start2 ; i<end2 ; i++ )
245 for(
int j=0 ; j<=Degree ; j++ )
for(
int k=0 ; k<=Degree ; k++ ) vvSums[j][k] += b1[i][j] * b2[i][k];
246 for(
int j=0 ; j<=Degree ; j++ )
for(
int k=0 ; k< Degree ; k++ ) vdSums[j][k] += b1[i][j] * db2[i][k];
247 for(
int j=0 ; j< Degree ; j++ )
for(
int k=0 ; k<=Degree ; k++ ) dvSums[j][k] += db1[i][j] * b2[i][k];
248 for(
int j=0 ; j< Degree ; j++ )
for(
int k=0 ; k< Degree ; k++ ) ddSums[j][k] += db1[i][j] * db2[i][k];
250 double vvDot = 0 , dvDot = 0 , vdDot = 0 , ddDot = 0;
251 for(
int j=0 ; j<=Degree ; j++ )
for(
int k=0 ; k<=Degree ; k++ ) vvDot += vvIntegrals[j][k] * vvSums[j][k];
252 for(
int j=0 ; j<=Degree ; j++ )
for(
int k=0 ; k< Degree ; k++ ) vdDot += vdIntegrals[j][k] * vdSums[j][k];
253 for(
int j=0 ; j< Degree ; j++ )
for(
int k=0 ; k<=Degree ; k++ ) dvDot += dvIntegrals[j][k] * dvSums[j][k];
254 for(
int j=0 ; j< Degree ; j++ )
for(
int k=0 ; k< Degree ; k++ ) ddDot += ddIntegrals[j][k] * ddSums[j][k];
261 if( fabs(vvDot)<1e-15 )
continue;
281 for(
int i=0 ; i<int(b1.size()) ; i++ )
for(
int j=0 ; j<=Degree ; j++ )
283 if( b1[i][j] && start1==-1 ) start1 = i;
284 if( b1[i][j] ) end1 = i+1;