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,
86 boost::shared_ptr< const WGrid > i_grid,
87 boost::shared_ptr< const WValueSetBase > i_valueSet,
89 boost::shared_ptr< WGridRegular3D::CellVertexArray > vertexIds )
91 boost::shared_ptr< const WGridRegular3D > grid = boost::dynamic_pointer_cast<
const WGridRegular3D >( i_grid );
93 WAssert( grid,
"This data set has a grid whose type is not yet supported for interpolation." );
94 WAssert( ( i_valueSet->order() == 1 && i_valueSet->dimension() == 3 ),
95 "Only implemented for 3D Vectors so far." );
96 boost::array< double, 8 > h;
99 size_t cellId = grid->getCellId( pos, &isInside );
108 *vertexIds = grid->getCellVertexIds( cellId );
110 WPosition localPos = grid->getTransform().positionToGridSpace( pos - grid->getPosition( ( *vertexIds )[0] ) );
112 double lambdaX = localPos[0];
113 double lambdaY = localPos[1];
114 double lambdaZ = localPos[2];
125 h[0] = ( 1 - lambdaX ) * ( 1 - lambdaY ) * ( 1 - lambdaZ );
126 h[1] = ( lambdaX ) * ( 1 - lambdaY ) * ( 1 - lambdaZ );
127 h[2] = ( 1 - lambdaX ) * ( lambdaY ) * ( 1 - lambdaZ );
128 h[3] = ( lambdaX ) * ( lambdaY ) * ( 1 - lambdaZ );
129 h[4] = ( 1 - lambdaX ) * ( 1 - lambdaY ) * ( lambdaZ );
130 h[5] = ( lambdaX ) * ( 1 - lambdaY ) * ( lambdaZ );
131 h[6] = ( 1 - lambdaX ) * ( lambdaY ) * ( lambdaZ );
132 h[7] = ( lambdaX ) * ( lambdaY ) * ( lambdaZ );
141 boost::array< double, 8 > h = computePrefactors( pos,
m_grid,
m_valueSet, success, vertexIds );
146 for(
size_t i = 0; i < 8; ++i )
158 boost::array< double, 8 > h = computePrefactors( pos,
m_grid,
m_valueSet, success, vertexIds );
163 for(
size_t i = 0; i < 8; ++i )
170 result += h[i] * sign *
getVectorAt( ( *vertexIds )[i] );
181 case W_DT_UNSIGNED_CHAR:
189 case W_DT_SIGNED_INT:
202 WAssert(
false,
"Unknow data type in dataset." );