37 if ( m_OptimalAngle < 0 )
39 mitkThrow() <<
"Optimal angle must be set before call of update.";
42 if ( m_TargetPoints.IsNull() )
44 mitkThrow() <<
"Targets points must be set before call of update.";
50 centerOfMass->SetUseScalarsAsWeights(
false);
51 centerOfMass->SetInputData(targetSurface);
52 centerOfMass->Update();
54 double targetCenter[3];
55 centerOfMass->GetCenter(targetCenter);
57 mitk::Point3D targetCenterPoint;
58 targetCenterPoint[0] = targetCenter[0];
59 targetCenterPoint[1] = targetCenter[1];
60 targetCenterPoint[2] = targetCenter[2];
62 MITK_INFO(
"QmitkUSAbstractNavigationStep")(
"QmitkUSNavigationStepPlacementPlanning")
63 <<
"Center of mass of the target calculated as: " << targetCenterPoint;
66 std::vector< itk::Vector<float, 3u> > targetsToCenterOfMassVectors;
68 for ( mitk::PointSet::PointsConstIterator it = m_TargetPoints->Begin();
69 it != m_TargetPoints->End(); ++it )
74 mitk::Point3D origin = it->Value();
75 plannedTargetsPoints->InsertNextPoint(origin[0], origin[1], origin[2]);
79 itk::Vector<float, 3u> vector = targetCenterPoint - origin;
81 targetsToCenterOfMassVectors.push_back(vector);
85 plannedTargetsPointSet->SetPoints(plannedTargetsPoints);
87 centerOfMass->SetInputData(plannedTargetsPointSet);
88 centerOfMass->Update();
89 double plannedCenter[3];
90 centerOfMass->GetCenter(plannedCenter);
92 mitk::Point3D plannedTargetsCenterPoint;
93 plannedTargetsCenterPoint[0] = plannedCenter[0];
94 plannedTargetsCenterPoint[1] = plannedCenter[1];
95 plannedTargetsCenterPoint[2] = plannedCenter[2];
97 MITK_INFO(
"QmitkUSAbstractNavigationStep")(
"QmitkUSNavigationStepPlacementPlanning")
98 <<
"Center of mass of the planned target points calculated as: " << plannedTargetsCenterPoint;
100 m_CentersOfMassDistance = targetCenterPoint.EuclideanDistanceTo(plannedTargetsCenterPoint);
101 MITK_INFO(
"QmitkUSAbstractNavigationStep")(
"QmitkUSNavigationStepPlacementPlanning")
102 <<
"Distance between target center of mass and planned target points center of mass: " << m_CentersOfMassDistance;
104 unsigned int numberOfAngles = targetsToCenterOfMassVectors.size() * (targetsToCenterOfMassVectors.size()-1) / 2;
106 m_AngleDifferences.set_size(numberOfAngles);
109 m_MeanAngleDifference = 0;
110 for (
unsigned int i = 0; i < targetsToCenterOfMassVectors.size(); i++ )
112 for (
unsigned int j = i+1; j < targetsToCenterOfMassVectors.size(); j++ )
114 double angleDiff = acos ( targetsToCenterOfMassVectors.at(i) * targetsToCenterOfMassVectors.at(j) ) - m_OptimalAngle;
115 if ( angleDiff < 0 ) { angleDiff = -angleDiff; }
117 m_AngleDifferences.put(n++, angleDiff);
118 m_MeanAngleDifference += angleDiff;
122 m_MeanAngleDifference /= numberOfAngles;
123 m_MeanAngleDifference = vtkMath::DegreesFromRadians(m_MeanAngleDifference);
125 MITK_INFO(
"QmitkUSAbstractNavigationStep")(
"QmitkUSNavigationStepPlacementPlanning")
126 <<
"Angles between the target points: " << m_AngleDifferences;
127 MITK_INFO(
"QmitkUSAbstractNavigationStep")(
"QmitkUSNavigationStepPlacementPlanning")
128 <<
"Mean difference of angles between the target points: " << m_MeanAngleDifference;