CTL  0.6.1
Computed Tomography Library
sparsevoxelvolume.h
1 #ifndef CTL_SPARSEVOXELVOLUME_H
2 #define CTL_SPARSEVOXELVOLUME_H
3 
4 #include <array>
5 
6 #include "voxelvolume.h"
7 
8 typedef unsigned int uint;
9 
10 namespace CTL {
11 
12 template <typename> class Range;
13 
15 {
16 public:
17  class SingleVoxel;
18 
19  using VoxelSize = VoxelVolume<float>::VoxelSize;
20  using Dimensions = VoxelVolume<float>::Dimensions;
21  using Offset = VoxelVolume<float>::Offset;
22 
23 public:
24 
25  typedef std::vector<SingleVoxel>::iterator iterator;
26  typedef std::vector<SingleVoxel>::const_iterator const_iterator;
27  typedef std::reverse_iterator<iterator> reverse_iterator;
28  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
29 
30  // ctors
31  SparseVoxelVolume(const VoxelSize& voxelSize);
32  SparseVoxelVolume(const VoxelSize& voxelSize, std::vector<SingleVoxel> data);
33 
34  // voxel iterators
35  iterator begin();
36  iterator end();
37  const_iterator begin() const;
38  const_iterator end() const;
39  const_iterator cbegin() const;
40  const_iterator cend() const;
41  reverse_iterator rbegin();
42  reverse_iterator rend();
43  const_reverse_iterator rbegin() const;
44  const_reverse_iterator rend() const;
45  const_reverse_iterator crbegin() const;
46  const_reverse_iterator crend() const;
47 
48  void addVoxel(const SingleVoxel& voxel);
49  void addVoxel(float x, float y, float z, float val);
50  std::array<Range<float>, 3> boundingBox() const;
51  const std::vector<SingleVoxel>& data() const;
52  std::vector<SingleVoxel>& data();
53  uint nbVoxels() const;
54  void removeVoxel(uint i);
55  float sparsityLevel() const;
56  float sparsityLevel(const Dimensions& referenceDimension) const;
57  const SingleVoxel& voxel(uint i) const;
58  SingleVoxel& voxel(uint i);
59  const VoxelSize& voxelSize() const;
60 
61  // conversion to VoxelVolume
62  void paintToVoxelVolume(VoxelVolume<float>& volume) const;
63  VoxelVolume<float> toVoxelVolume() const;
64  VoxelVolume<float> toVoxelVolume(const Offset& offset) const;
65  VoxelVolume<float> toVoxelVolume(const Dimensions& dimension,
66  const Offset& offset = { 0.0f, 0.0f, 0.0f }) const;
67 
68 private:
69  std::vector<SingleVoxel> _data;
70  VoxelSize _voxelSize;
71 };
72 
74 {
75 public:
76  SingleVoxel(float x, float y, float z, float val)
77  : _x(x), _y(y), _z(z), _value(val)
78  { }
79 
80  float x() const { return _x; }
81  float y() const { return _y; }
82  float z() const { return _z; }
83  float value() const { return _value; }
84  float& value() { return _value; }
85 
86  operator float&() { return _value; }
87  operator const float&() const { return _value; }
88 
89 private:
90  float _x;
91  float _y;
92  float _z;
93  float _value;
94 };
95 
96 } // namespace CTL
97 
98 #endif // CTL_SPARSEVOXELVOLUME_H
The VoxelVolume class provides a simple container for storage of voxelized 3D volume data.
Definition: ctsystemview.h:14
Definition: sparsevoxelvolume.h:14
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
Definition: sparsevoxelvolume.h:73
The Range class holds start and end point of a value range (or interval) and provides a few convenien...
Definition: sparsevoxelvolume.h:12