30 #include <boost/array.hpp>
32 #include "../common/WAssert.h"
33 #include "WDataSetSingle.h"
34 #include "WDataSetVector.h"
40 boost::shared_ptr< WGrid > newGrid )
43 WAssert( newValueSet,
"No value set given." );
44 WAssert( newGrid,
"No grid given." );
45 WAssert( newValueSet->size() == newGrid->size(),
"Number of values unequal number of positions in grid." );
46 WAssert( newValueSet->order() == 1,
"The value set does not contain vectors." );
85 boost::array< double, 8 > computePrefactors(
const WPosition& pos, boost::shared_ptr< const WGrid > i_grid,
86 boost::shared_ptr< const WValueSetBase > i_valueSet,
bool *success, boost::shared_ptr< std::vector< size_t > > vertexIds )
88 boost::shared_ptr< const WGridRegular3D > grid = boost::shared_dynamic_cast<
const WGridRegular3D >( i_grid );
90 WAssert( grid,
"This data set has a grid whose type is not yet supported for interpolation." );
91 WAssert( grid->isNotRotated(),
"Only feasible for grids that are only translated or scaled so far." );
92 WAssert( ( i_valueSet->order() == 1 && i_valueSet->dimension() == 3 ),
93 "Only implemented for 3D Vectors so far." );
94 boost::array< double, 8 > h;
97 size_t cellId = grid->getCellId( pos, &isInside );
106 *vertexIds = grid->getCellVertexIds( cellId );
108 WPosition localPos = pos - grid->getPosition( ( *vertexIds )[0] );
110 double lambdaX = localPos[0] / grid->getOffsetX();
111 double lambdaY = localPos[1] / grid->getOffsetY();
112 double lambdaZ = localPos[2] / grid->getOffsetZ();
123 h[0] = ( 1 - lambdaX ) * ( 1 - lambdaY ) * ( 1 - lambdaZ );
124 h[1] = ( lambdaX ) * ( 1 - lambdaY ) * ( 1 - lambdaZ );
125 h[2] = ( 1 - lambdaX ) * ( lambdaY ) * ( 1 - lambdaZ );
126 h[3] = ( lambdaX ) * ( lambdaY ) * ( 1 - lambdaZ );
127 h[4] = ( 1 - lambdaX ) * ( 1 - lambdaY ) * ( lambdaZ );
128 h[5] = ( lambdaX ) * ( 1 - lambdaY ) * ( lambdaZ );
129 h[6] = ( 1 - lambdaX ) * ( lambdaY ) * ( lambdaZ );
130 h[7] = ( lambdaX ) * ( lambdaY ) * ( lambdaZ );
138 boost::shared_ptr< std::vector< size_t > > vertexIds(
new std::vector< size_t > );
139 boost::array< double, 8 > h = computePrefactors( pos,
m_grid,
m_valueSet, success, vertexIds );
144 for(
size_t i = 0; i < 8; ++i )
155 boost::shared_ptr< std::vector< size_t > > vertexIds(
new std::vector< size_t > );
156 boost::array< double, 8 > h = computePrefactors( pos,
m_grid,
m_valueSet, success, vertexIds );
161 for(
size_t i = 0; i < 8; ++i )
168 result += h[i] * sign *
getVectorAt( ( *vertexIds )[i] );
179 case W_DT_UNSIGNED_CHAR:
187 case W_DT_SIGNED_INT:
200 WAssert(
false,
"Unknow data type in dataset." );