28 #include "../graphicsEngine/WROIArbitrary.h"
29 #include "../graphicsEngine/WROIBox.h"
31 #include "WSelectorRoi.h"
34 WSelectorRoi::WSelectorRoi( osg::ref_ptr< WROI > roi, std::shared_ptr< const WDataSetFibers > fibers, std::shared_ptr< WKdTree> kdTree ) :
38 m_size( fibers->size() ),
41 m_bitField = std::shared_ptr< std::vector<bool> >(
new std::vector<bool>(
m_size,
false ) );
47 = std::shared_ptr< boost::function< void() > >(
new boost::function< void() >( boost::bind( &
WSelectorRoi::setDirty,
this ) ) );
65 if( osg::dynamic_pointer_cast<WROIBox>(
m_roi ).get() )
70 osg::ref_ptr<WROIBox> box = osg::dynamic_pointer_cast<WROIBox>(
m_roi );
82 if( osg::dynamic_pointer_cast<WROIArbitrary>(
m_roi ).get() )
84 osg::ref_ptr<WROIArbitrary>roi = osg::dynamic_pointer_cast<WROIArbitrary>(
m_roi );
86 float threshold =
static_cast<float>( roi->getThreshold() );
88 size_t nx = roi->getCoordDimensions()[0];
89 size_t ny = roi->getCoordDimensions()[1];
91 double dx = roi->getCoordOffsets()[0];
92 double dy = roi->getCoordOffsets()[1];
93 double dz = roi->getCoordOffsets()[2];
97 size_t x =
static_cast<size_t>( ( *m_currentArray )[i * 3 ] / dx );
98 size_t y =
static_cast<size_t>( ( *m_currentArray )[i * 3 + 1] / dy );
99 size_t z =
static_cast<size_t>( ( *m_currentArray )[i * 3 + 2] / dz );
100 int index = x + y * nx + z * nx * ny;
102 if(
static_cast<float>( roi->getValue( index ) ) - threshold > 0.1 )
118 int root = left + ( ( right - left ) / 2 );
119 int axis1 = ( axis + 1 ) % 3;
120 int pointIndex =
m_kdTree->m_tree[root] * 3;
124 boxTest( root + 1, right, axis1 );
128 boxTest( left, root - 1, axis1 );
132 int axis2 = ( axis + 2 ) % 3;
134 >=
m_boxMin[axis1] && ( *m_currentArray )[pointIndex + axis2] <=
m_boxMax[axis2]
135 && ( *m_currentArray )[pointIndex + axis2] >=
m_boxMin[axis2] )
139 boxTest( left, root - 1, axis1 );
140 boxTest( root + 1, right, axis1 );
std::shared_ptr< std::vector< float > > m_currentArray
pointer to the array that is used for updating this is used for the recurse update function,...
std::shared_ptr< const WDataSetFibers > m_fibers
Pointer to the fiber data set.
void recalculate()
updates the output bitfiel when something with the rois has changed
void boxTest(int left, int right, int axis)
recursive function to check for intersections with the roi
std::shared_ptr< std::vector< size_t > > m_currentReverse
pointer to the reverse array that is used for updating this is used for the recurse update function,...
WSelectorRoi(osg::ref_ptr< WROI > roi, std::shared_ptr< const WDataSetFibers > fibers, std::shared_ptr< WKdTree > kdTree)
constructor
std::vector< float > m_boxMin
lower boundary of the box, used for boxtest
std::shared_ptr< WKdTree > m_kdTree
Stores a pointer to the kdTree used for fiber selection.
size_t getLineForPoint(size_t point)
getter
osg::ref_ptr< WROI > m_roi
pointer to the roi
size_t m_size
size of the fiber dataset, stored for convinience
std::vector< float > m_boxMax
upper boundary of the box, used for boxtest
~WSelectorRoi()
destructor
std::shared_ptr< boost::function< void() > > m_changeRoiSignal
Signal that can be used to update the selector ROI.
void setDirty()
setter sets the dirty flag
std::shared_ptr< std::vector< bool > > m_bitField
the bitfield that is given to the outside world
std::shared_ptr< std::vector< bool > > m_workerBitfield
the bitfield we work on