File: itkOctreeNode.h

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (168 lines) | stat: -rw-r--r-- 4,959 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/
#ifndef itkOctreeNode_h
#define itkOctreeNode_h
#include "itkMacro.h"
#include "itkCommonEnums.h"

namespace itk
{

// Forward reference because of circular dependencies
class ITK_FORWARD_EXPORT OctreeNodeBranch;
class ITK_FORWARD_EXPORT OctreeBase;

/**
 * \class OctreeNode
 * \brief A data structure representing a node in an Octree.
 *
 * OctreeNode is the basic building block of an octree. It is rarely used by
 * itself, and commonly used by the Octree class.
 *
 * OctreeNodes have two states: 1) They are a Colored node and the m_Branch is
 * a sentinel value indicating the color, or 2) they are a branch node, and
 * m_Branch is a dynamically allocated array of 8 pointers to OctreeNodes. In
 * the second state, the 8 child OctreeNodes are instantiated by the parent node.
 *
 * \author Hans J. Johnson
 * \todo FIXME copy & paste documentation in all methods.
 * \ingroup ITKCommon
 */
class ITKCommon_EXPORT OctreeNode
{
public:
  /**
   * Default constructor
   * \post After construction, it is assumed all children of this node are colored
   * with values of 0.
   */
  OctreeNode();

  /**
   * Default destructor
   */
  virtual ~OctreeNode();

  using LeafIdentifierEnum = OctreeEnums::LeafIdentifier;
#if !defined(ITK_LEGACY_REMOVE)
  // We need to expose the enum values at the class level
  // for backwards compatibility
  static constexpr LeafIdentifierEnum ZERO = LeafIdentifierEnum::ZERO;
  static constexpr LeafIdentifierEnum ONE = LeafIdentifierEnum::ONE;
  static constexpr LeafIdentifierEnum TWO = LeafIdentifierEnum::TWO;
  static constexpr LeafIdentifierEnum THREE = LeafIdentifierEnum::THREE;
  static constexpr LeafIdentifierEnum FOUR = LeafIdentifierEnum::FOUR;
  static constexpr LeafIdentifierEnum FIVE = LeafIdentifierEnum::FIVE;
  static constexpr LeafIdentifierEnum SIX = LeafIdentifierEnum::SIX;
  static constexpr LeafIdentifierEnum SEVEN = LeafIdentifierEnum::SEVEN;
#endif

  /**
   * Returns the value of the specified Child for this OctreeNode
   * \param ChildID The numerical identifier of the desired child.
   * \return A pointer to the Desired child. NOTE: This is always an
   * instance of an OctreeNode.
   * @{
   */
  OctreeNode &
  GetChild(const LeafIdentifierEnum ChildID) const;

  OctreeNode &
  GetChild(const LeafIdentifierEnum ChildID);
  /** @}
   */

  /**
   * Determines the color value of the specified Child for this OctreeNode
   * \pre Must determine that the specified node is colored (Use IsNodeColored()
   * member function.  Behavior is undefined when the child is another Octree.
   * \return A value between 0 and 255 to indicate the color of the Desired child.
   */
  long
  GetColor() const;

  /**
   * Sets the color value of the specified Child for this OctreeNode
   * \param color The desired color of this node.
   * \post All children of the specified child are removed, and the child is set to
   * the desired value.
   */
  void
  SetColor(int color);

  /**
   * Sets the color value of the specified Child for this OctreeNode
   * \post All children of the specified child are removed, and the child is set to
   * the desired value.
   */
  void
  SetBranch(OctreeNodeBranch * NewBranch);

  /**
   * Determines if the child is a leaf node (colored), or a branch node (uncolored)
   * \return true if it is colored, false if it is not
   */
  bool
  IsNodeColored() const;

  inline void
  SetParentOctree(OctreeBase * parent)
  {
    m_Parent = parent;
  }

protected:
private:
  /**
   * Removes all children from this node down, and sets the value
   * value of the children to background.
   */
  void
  RemoveChildren();

  /**
   * Each element holds COLOR or pointer to another octree node
   */
  OctreeNodeBranch * m_Branch{};
  OctreeBase *       m_Parent{};
};

class ITKCommon_EXPORT OctreeNodeBranch
{
public:
  OctreeNodeBranch() = default;
  OctreeNodeBranch(OctreeBase * parent)
  {
    for (auto & leaf : m_Leaves)
    {
      leaf.SetParentOctree(parent);
    }
  }

  inline OctreeNode *
  GetLeaf(OctreeNode::LeafIdentifierEnum LeafID)
  {
    return &m_Leaves[static_cast<uint8_t>(LeafID)];
  }

private:
  OctreeNode m_Leaves[8];
};

} // namespace itk
#endif /* itkOctreeNode_h */