File: cmtkTransformedVolumeAxes.h

package info (click to toggle)
cmtk 3.3.1p2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 10,492 kB
  • sloc: cpp: 87,098; ansic: 23,347; sh: 3,896; xml: 1,551; perl: 707; makefile: 332
file content (133 lines) | stat: -rw-r--r-- 5,101 bytes parent folder | download | duplicates (5)
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
/*
//
//  Copyright 1997-2009 Torsten Rohlfing
//
//  Copyright 2004-2011 SRI International
//
//  This file is part of the Computational Morphometry Toolkit.
//
//  http://www.nitrc.org/projects/cmtk/
//
//  The Computational Morphometry Toolkit is free software: you can
//  redistribute it and/or modify it under the terms of the GNU General Public
//  License as published by the Free Software Foundation, either version 3 of
//  the License, or (at your option) any later version.
//
//  The Computational Morphometry Toolkit is distributed in the hope that it
//  will be useful, but WITHOUT ANY WARRANTY; without even the implied
//  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License along
//  with the Computational Morphometry Toolkit.  If not, see
//  <http://www.gnu.org/licenses/>.
//
//  $Revision: 5436 $
//
//  $LastChangedDate: 2018-12-10 19:01:20 -0800 (Mon, 10 Dec 2018) $
//
//  $LastChangedBy: torstenrohlfing $
//
*/

#ifndef __cmtkTransformedVolumeAxes_h_included_
#define __cmtkTransformedVolumeAxes_h_included_

#include <cmtkconfig.h>

#include <Base/cmtkVector3D.h>
#include <Base/cmtkAffineXform.h>
#include <Base/cmtkParametricPlane.h>
#include <Base/cmtkUniformVolume.h>

namespace
cmtk
{

/** \addtogroup Base */
//@{

/** Class that represents pre-transformed axes samples for 3D volumes.
 * This class generates an array of 3D coordinate vectors for each of the
 * three coordinate axes X, Y, and Z. These arrays contain direction vectors
 * that directly point to the coordinate of every sample on the respective
 * axis. These vectors are computed with respect to the object's coordinate
 * transformation as well as a second Volume's transformation and coordinate
 * offset. The Z-axis array contains this Volume's coordinate offset as 
 * defined by the transformation translation component as well.
 * The vectors from the arrays can therefore directly be used for probing
 * the other Volume using the ProbeNoXform member function.
 */
class TransformedVolumeAxes
{
public:
  /// This class.
  typedef TransformedVolumeAxes Self;

  /// Smart pointer to this class.
  typedef SmartPointer<Self> SmartPtr;

  /** Constructor using affine transformation.
   *\param volume The volume for which we are constructing an axes hash.
   *\param xform Coordinate transformation. If this pointer is NULL, identity is assumed.
   *\param deltas If this parameter is given, it is used as a pointer to a
   * three-element coordinate array defining the voxel size in the other volume
   * to obtain fractional voxel indices rather than actual coordinates.
   *
   * Alternatively, this parameter can also be used to provide the volume size (Volume::Size), which creates
   * normalized coordinates (0..1) for each volume axis.
   *
   *\param otherOrigin If this parameter is given, it is used as a pointer to a
   * three-element coordinate array defining an m_Origin vector for the transformed
   * coordinates.
   *\return Pointer to an array of three pointers. Each of these points to an
   * array of Vector3D objects that contain the vector hashes for the X-, Y-, 
   * and Z-axis.
   */
  TransformedVolumeAxes( const UniformVolume& volume, const AffineXform* xform = NULL, const Types::Coordinate* deltas = NULL, const Types::Coordinate* otherOrigin = NULL );
  
  /** Constructor using mirror plane.
   *\param volume The volume whose axes we are transforming.
   *\param mirrorPlane Mirror plane with respect to which the coordinates of
   * this volume and thus all hash values are mirrored.
   *\param deltas If this parameter is given, it is used as a pointer to a
   * 3 element coordinate array defining the voxel size in the other volume
   * to obtain fractional voxel indices rather than actual coordinates. 
   *
   * Alternatively, this parameter can also be used to provide the volume size (Volume::Size), which creates
   * normalized coordinates (0..1) for each volume axis.
   */
  TransformedVolumeAxes( const UniformVolume& volume, const ParametricPlane& mirrorPlane, const Types::Coordinate* deltas = NULL );

  /// Free all storage.
  ~TransformedVolumeAxes();

  /// Access operator.
  const Vector3D* operator[]( const size_t index ) const
  {
    return this->m_Hash[index];
  }

  /// Get dimensions.
  const FixedVector<3,int>& Dims() const
  {
    return this->m_Dims;
  }

private:
  /// Array of pointers to transformed axes points.
  FixedArray<3,UniformVolume::SpaceVectorType*> m_Hash;

  /// Dimensions of the transformed grid: numbers of samples per axis.
  FixedVector<3,int> m_Dims;

  /// Create the actual hash: allocate and fill according to given offset and delta vectors.
  void MakeHash( const UniformVolume& volume, const UniformVolume::SpaceVectorType& offset, const UniformVolume::SpaceVectorType& dX, const UniformVolume::SpaceVectorType& dY, const UniformVolume::SpaceVectorType& dZ );

};

//@}

} // namespace cmtk

#endif // #ifndef __cmtkTransformedVolumeAxes_h_included_