LibCarna Version 3.4.0
Loading...
Searching...
No Matches
VolumeGrid.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010 - 2016 Leonid Kostrykin
3 *
4 * Chair of Medical Engineering (mediTEC)
5 * RWTH Aachen University
6 * Pauwelsstr. 20
7 * 52074 Aachen
8 * Germany
9 *
10 *
11 * Copyright (C) 2021 - 2025 Leonid Kostrykin
12 *
13 */
14
15#ifndef VOLUMEGRID_H_6014714286
16#define VOLUMEGRID_H_6014714286
17
23#include <LibCarna/LibCarna.hpp>
27
28namespace LibCarna
29{
30
31namespace base
32{
33
34
35
36// ----------------------------------------------------------------------------------
37// VolumeGrid< SegmentIntensityVolumeType, SegmentNormalsVolumeType >
38// ----------------------------------------------------------------------------------
39
61template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
63{
64
66
67public:
68
73
78
83
91
95 virtual ~VolumeGrid();
96
99
105
109
112 Segment& segmentAt( unsigned int segmentX, unsigned int segmentY, unsigned int segmentZ );
113
116 const Segment& segmentAt( unsigned int segmentX, unsigned int segmentY, unsigned int segmentZ ) const;
117
118 // ------------------------------------------------------------------------------
119 // VolumeGrid< SegmentIntensityVolumeType, SegmentNormalsVolumeType > :: IntensitySelector
120 // ------------------------------------------------------------------------------
121
126 {
130 typedef typename SegmentIntensityVolumeType::Value VoxelType;
131
136
140 };
141
142 // ------------------------------------------------------------------------------
143 // VolumeGrid< SegmentIntensityVolumeType, SegmentNormalsVolumeType > :: NormalSelector
144 // ------------------------------------------------------------------------------
145
150 {
154 typedef typename SegmentNormalsVolumeType::Value VoxelType;
155
160
164 };
165
166 // ------------------------------------------------------------------------------
167
172 template< typename Selector >
173 typename Selector::VoxelType getVoxel( const math::Vector3ui& location );
174
177 template< typename Selector >
178 typename Selector::VoxelType getVoxel( unsigned int x, unsigned int y, unsigned int z );
179
184 template< typename Selector >
185 void setVoxel( const math::Vector3ui& location, const typename Selector::VoxelType& voxel );
186
189 template< typename Selector >
190 void setVoxel( unsigned int x, unsigned int y, unsigned int z, const typename Selector::VoxelType& voxel );
191
192private:
193
194 std::vector< Segment* > segments;
195
196 std::size_t segmentIndex( unsigned int segmentX, unsigned int segmentY, unsigned int segmentZ ) const;
197
198}; // VolumeGrid
199
200
201template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
203 ( const math::Vector3ui& maxSegmentSize
204 , const math::Vector3ui& segmentCounts )
205 : maxSegmentSize( maxSegmentSize )
206 , segmentCounts( segmentCounts )
207{
208 LIBCARNA_ASSERT( maxSegmentSize.x() > 0 && maxSegmentSize.y() > 0 && maxSegmentSize.z() > 0 );
209 LIBCARNA_ASSERT( segmentCounts.x() > 0 && segmentCounts.y() > 0 && segmentCounts.z() > 0 );
210 segments.resize( segmentCounts.x() * segmentCounts.y() * segmentCounts.z() );
211 for( unsigned int z = 0; z < segmentCounts.z(); ++z )
212 for( unsigned int y = 0; y < segmentCounts.y(); ++y )
213 for( unsigned int x = 0; x < segmentCounts.x(); ++x )
214 {
215 const std::size_t index = segmentIndex( x, y, z );
216 Segment* const segment = new Segment( *this );
217 segment->offset = math::Vector3ui( x * maxSegmentSize.x(), y * maxSegmentSize.y(), z * maxSegmentSize.z() );
218 segments[ index ] = segment;
219 }
220}
221
222
223template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
225{
226 std::for_each( segments.begin(), segments.end(), std::default_delete< Segment >() );
227}
228
229
230template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
232 ( unsigned int segmentX
233 , unsigned int segmentY
234 , unsigned int segmentZ ) const
235{
236 return segmentX + segmentY * segmentCounts.x() + segmentZ * segmentCounts.x() * segmentCounts.y();
237}
238
239
240template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
243 ( const base::math::Vector3ui& p )
244{
245 return segmentAt( p.x(), p.y(), p.z() );
246}
247
248
249template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
252 ( const base::math::Vector3ui& p ) const
253{
254 return segmentAt( p.x(), p.y(), p.z() );
255}
256
257
258template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
261 ( unsigned int segmentX
262 , unsigned int segmentY
263 , unsigned int segmentZ )
264{
265 const std::size_t index = segmentIndex( segmentX, segmentY, segmentZ );
266 Segment& segment = *segments[ index ];
267 return segment;
268}
269
270
271template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
274 ( unsigned int segmentX
275 , unsigned int segmentY
276 , unsigned int segmentZ ) const
277{
278 const std::size_t index = segmentIndex( segmentX, segmentY, segmentZ );
279 const Segment& segment = *segments[ index ];
280 return segment;
281}
282
283
284template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
285template< typename Selector >
287 ( unsigned int x, unsigned int y, unsigned int z )
288{
289 const unsigned int segmentX = x / maxSegmentSize.x();
290 const unsigned int segmentY = y / maxSegmentSize.y();
291 const unsigned int segmentZ = z / maxSegmentSize.z();
292
293 const unsigned int localX = x % maxSegmentSize.x();
294 const unsigned int localY = y % maxSegmentSize.y();
295 const unsigned int localZ = z % maxSegmentSize.z();
296
297 const Segment& segment = segmentAt( segmentX, segmentY, segmentZ );
298 return Selector::volume( segment )( localX, localY, localZ );
299}
300
301
302template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
303template< typename Selector >
305 ( const math::Vector3ui& at )
306{
307 return getVoxel< Selector >( at.x(), at.y(), at.z() );
308}
309
310
311template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
312template< typename Selector >
314 ( unsigned int x, unsigned int y, unsigned int z, const typename Selector::VoxelType& voxel )
315{
316 const unsigned int segmentX = x / maxSegmentSize.x();
317 const unsigned int segmentY = y / maxSegmentSize.y();
318 const unsigned int segmentZ = z / maxSegmentSize.z();
319
320 const unsigned int localX = x % maxSegmentSize.x();
321 const unsigned int localY = y % maxSegmentSize.y();
322 const unsigned int localZ = z % maxSegmentSize.z();
323
324 Segment& segment = segmentAt( segmentX, segmentY, segmentZ );
325 Selector::volume( segment ).setVoxel( localX, localY, localZ, voxel );
326
327 /* Note that segments are not disjoint,
328 * so we might need to update the redundant texels as well.
329 */
330 const bool updateRedundantX = localX == 0 && segmentX > 0;
331 const bool updateRedundantY = localY == 0 && segmentY > 0;
332 const bool updateRedundantZ = localZ == 0 && segmentZ > 0;
333
334 if( updateRedundantX )
335 {
336 Selector::volume( segmentAt( segmentX - 1, segmentY, segmentZ ) )
337 .setVoxel( maxSegmentSize.x(), localY, localZ, voxel );
338 }
339 if( updateRedundantY )
340 {
341 Selector::volume( segmentAt( segmentX, segmentY - 1, segmentZ ) )
342 .setVoxel( localX, maxSegmentSize.y(), localZ, voxel );
343 }
344 if( updateRedundantZ )
345 {
346 Selector::volume( segmentAt( segmentX, segmentY, segmentZ - 1 ) )
347 .setVoxel( localX, localY, maxSegmentSize.z(), voxel );
348 }
349
351 {
352 Selector::volume( segmentAt( segmentX - 1, segmentY - 1, segmentZ ) )
353 .setVoxel( maxSegmentSize.x(), maxSegmentSize.y(), localZ, voxel );
354 }
356 {
357 Selector::volume( segmentAt( segmentX - 1, segmentY, segmentZ - 1 ) )
358 .setVoxel( maxSegmentSize.x(), localY, maxSegmentSize.z(), voxel );
359 }
361 {
362 Selector::volume( segmentAt( segmentX, segmentY - 1, segmentZ - 1 ) )
363 .setVoxel( localX, maxSegmentSize.y(), maxSegmentSize.z(), voxel );
364 }
365
367 {
368 Selector::volume( segmentAt( segmentX - 1, segmentY - 1, segmentZ - 1 ) )
369 .setVoxel( maxSegmentSize, voxel );
370 }
371}
372
373
374template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
375template< typename Selector >
377 ( const math::Vector3ui& at, const typename Selector::VoxelType& voxel )
378{
379 setVoxel< Selector >( at.x(), at.y(), at.z(), voxel );
380}
381
382
383
384// ----------------------------------------------------------------------------------
385// VolumeGrid< SegmentIntensityVolumeType, SegmentNormalsVolumeType > :: IntensitySelector
386// ----------------------------------------------------------------------------------
387
388template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
394
395
396template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
402
403
404
405// ----------------------------------------------------------------------------------
406// VolumeGrid< SegmentIntensityVolumeType, SegmentNormalsVolumeType > :: NormalSelector
407// ----------------------------------------------------------------------------------
408
409template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
415
416
417template< typename SegmentIntensityVolumeType, typename SegmentNormalsVolumeType >
423
424
425
426} // namespace LibCarna :: base
427
428} // namespace LibCarna
429
430#endif // VOLUMEGRID_H_6014714286
Defines LibCarna::base::IntensityVolume.
Defines LibCarna::base::LibCarnaException and LibCarna::base::AssertionFailure.
#define LIBCARNA_ASSERT(expression)
If the given expression is false, a break point is raised in debug mode and an AssertionFailure throw...
Contains forward-declarations.
Defines LibCarna::base::VolumeSegment.
Represents an association.
Represents a particular partitioning of volumetric data.
Selector::VoxelType getVoxel(const math::Vector3ui &location)
Reads the voxel of the volume that the Selector selects from the partition at location.
SegmentNormalsVolumeType SegmentNormalsVolume
Reflects the type to use for storing the normal map of a single partition.
VolumeGrid(const math::Vector3ui &maxSegmentSize, const math::Vector3ui &segmentCounts)
Instantiates.
SegmentIntensityVolumeType SegmentIntensityVolume
Reflects the type to use for storing the intensity volume of a single partition.
Segment & segmentAt(unsigned int segmentX, unsigned int segmentY, unsigned int segmentZ)
void setVoxel(unsigned int x, unsigned int y, unsigned int z, const typename Selector::VoxelType &voxel)
const math::Vector3ui maxSegmentSize
Holds the maximum resolution of a single partition.
Selector::VoxelType getVoxel(unsigned int x, unsigned int y, unsigned int z)
Segment & segmentAt(const base::math::Vector3ui &location)
References the partition at location.
virtual ~VolumeGrid()
Deletes this and all partitions.
void setVoxel(const math::Vector3ui &location, const typename Selector::VoxelType &voxel)
Writes the voxel of the volume that the Selector selects from the partition at location.
const Segment & segmentAt(const base::math::Vector3ui &) const
const Segment & segmentAt(unsigned int segmentX, unsigned int segmentY, unsigned int segmentZ) const
VolumeSegment< SegmentIntensityVolumeType, SegmentNormalsVolumeType > Segment
Reflects the data type that represents a single partition.
const math::Vector3ui segmentCounts
Holds the number of partitions along each dimension.
Represents a single volumetric data partition.
Eigen::Matrix< unsigned int, 3, 1 > Vector3ui
Defines vector.
Definition math.hpp:203
#define NON_COPYABLE
Marks the class that it is placed in as non-copyable.
References the intensity volume of a given partition.
static SegmentIntensityVolumeType & volume(Segment &segment)
References the intensity volume of a given partition.
SegmentIntensityVolumeType::Value VoxelType
Reflects the voxel type of the volume this selector references.
References the normal map of a given partition.
SegmentNormalsVolumeType::Value VoxelType
Reflects the voxel type of the volume this selector references.
static SegmentNormalsVolumeType & volume(Segment &segment)
References the normal map of a given partition.