Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkSphereLandmarkProjector.h"
00020 #include <vtkThinPlateSplineTransform.h>
00021
00022 #include <vtkTransform.h>
00023 #include <vtkSphericalTransform.h>
00024 #include <vtkGeneralTransform.h>
00025
00026 mitk::SphereLandmarkProjector::SphereLandmarkProjector()
00027 {
00028 m_SphericalTransform = vtkSphericalTransform::New();
00029 m_SphereRotation = vtkTransform::New();
00030 m_SpatialPlacementTransform = vtkTransform::New();
00031 m_PlaneToSphericalTransform = vtkGeneralTransform::New();
00032
00033 m_SphereRotation->RotateX(90);
00034
00035
00036 mitk::ScalarType origin[3] = {1, 0, 2*vnl_math::pi};
00037 mitk::ScalarType right[3] = {0, 0, -2*vnl_math::pi};
00038 mitk::ScalarType bottom[3] = {0, vnl_math::pi, 0};
00039
00040 m_SphereParameterPlane = mitk::PlaneGeometry::New();
00041 m_SphereParameterPlane->InitializeStandardPlane(right, bottom);
00042 m_SphereParameterPlane->SetOrigin(origin);
00043 m_SphereParameterPlane->SetSizeInUnits(100, 50);
00044
00045 m_ParameterPlane = m_SphereParameterPlane;
00046 }
00047
00048 mitk::SphereLandmarkProjector::~SphereLandmarkProjector()
00049 {
00050 m_SphericalTransform->Delete();
00051 m_SphereRotation->Delete();
00052 m_SpatialPlacementTransform->Delete();
00053 m_PlaneToSphericalTransform->Delete();
00054 }
00055
00056 void mitk::SphereLandmarkProjector::ComputeCompleteAbstractTransform()
00057 {
00058 m_PlaneToSphericalTransform->Identity();
00059 m_PlaneToSphericalTransform->PostMultiply();
00060 m_PlaneToSphericalTransform->Concatenate(m_SphericalTransform);
00061 m_PlaneToSphericalTransform->Concatenate(m_SphereRotation);
00062 m_PlaneToSphericalTransform->Concatenate(m_InterpolatingAbstractTransform);
00063 m_PlaneToSphericalTransform->Concatenate(m_SpatialPlacementTransform);
00064
00065 m_CompleteAbstractTransform = m_PlaneToSphericalTransform;
00066 }
00067
00068 void mitk::SphereLandmarkProjector::ProjectLandmarks(
00069 const mitk::PointSet::DataType::PointsContainer* targetLandmarks)
00070 {
00071 unsigned int size=targetLandmarks->Size();
00072 mitk::PointSet::DataType::PointsContainer::ConstIterator pointiterator, start = targetLandmarks->Begin();
00073 mitk::PointSet::DataType::PointsContainer::ElementIdentifier id;
00074
00075
00076 mitk::Point3D center;
00077 center.Fill(0);
00078 mitk::ScalarType radius;
00079 mitk::PointSet::PointType point;
00080
00081 for(id=0, pointiterator=start;id<size;++id, ++pointiterator)
00082 {
00083 point = pointiterator->Value();
00084 center[0]+=point[0];
00085 center[1]+=point[1];
00086 center[2]+=point[2];
00087 }
00088 center[0]/=(mitk::ScalarType)size;
00089 center[1]/=(mitk::ScalarType)size;
00090 center[2]/=(mitk::ScalarType)size;
00091
00092 switch(0)
00093 {
00094 case 0:
00095 radius = mitk::ScalarTypeNumericTraits::max();
00096 for(id=0, pointiterator=start;id<size;++id, ++pointiterator)
00097 {
00098 point = pointiterator->Value();
00099 mitk::Vector3D v;
00100 v[0]=point[0]-center[0];
00101 v[1]=point[1]-center[1];
00102 v[2]=point[2]-center[2];
00103 if (v.GetNorm() < radius) radius = v.GetNorm();
00104 }
00105 break;
00106 case 1:
00107 radius = 0;
00108 for(id=0, pointiterator=start;id<size;++id, ++pointiterator)
00109 {
00110 point = pointiterator->Value();
00111 mitk::Vector3D v;
00112 v[0]=point[0]-center[0];
00113 v[1]=point[1]-center[1];
00114 v[2]=point[2]-center[2];
00115 if (v.GetNorm() > radius) radius = v.GetNorm();
00116 }
00117 break;
00118 case 2:
00119 radius = 0;
00120 for(id=0, pointiterator=start;id<size;++id, ++pointiterator)
00121 {
00122 point = pointiterator->Value();
00123 mitk::Vector3D v;
00124 v[0]=point[0]-center[0];
00125 v[1]=point[1]-center[1];
00126 v[2]=point[2]-center[2];
00127 radius += v.GetNorm();
00128 }
00129 radius*=1.0/size;
00130 break;
00131 }
00132 mitk::Point3D origin = m_SphereParameterPlane->GetOrigin(); origin[0]=radius; m_SphereParameterPlane->SetOrigin(origin);
00133 m_SpatialPlacementTransform->GetMatrix()->SetElement(0, 3, center[0]);
00134 m_SpatialPlacementTransform->GetMatrix()->SetElement(1, 3, center[1]);
00135 m_SpatialPlacementTransform->GetMatrix()->SetElement(2, 3, center[2]);
00136
00137
00138
00139 mitk::Point3D projectedPoint;
00140
00141 m_WritableFinalTargetLandmarks->Initialize();
00142 m_ProjectedLandmarks->Initialize();
00143
00144 m_WritableFinalTargetLandmarks->Reserve(size);
00145 m_ProjectedLandmarks->Reserve(size);
00146 for(id=0, pointiterator=start;id<size;++id, ++pointiterator)
00147 {
00148 point = pointiterator->Value();
00149
00150 mitk::Vector3D v;
00151 v=point-center;
00152 mitk::FillVector3D(point, v[0], v[1], v[2]);
00153 v.Normalize(); v*=radius;
00154 mitk::FillVector3D(projectedPoint, v[0], v[1], v[2]);
00155
00156 m_WritableFinalTargetLandmarks->InsertElement(id, point);
00157 m_ProjectedLandmarks->InsertElement(id, projectedPoint);
00158 }
00159 }