20 #ifndef __itkDeformableSimplexMesh3DFilter_txx
21 #define __itkDeformableSimplexMesh3DFilter_txx
24 #include "itkNumericTraits.h"
28 #include <vxl_version.h>
29 #if VXL_VERSION_DATE_FULL > 20040406
30 # include <vnl/vnl_cross.h>
31 # define itk_cross_3d vnl_cross_3d
33 # define itk_cross_3d cross_3d
40 template <
typename TInputMesh,
typename TOutputMesh>
65 template <
typename TInputMesh,
typename TOutputMesh>
73 template <
typename TInputMesh,
typename TOutputMesh>
78 Superclass::PrintSelf(os,indent);
79 os << indent <<
"Alpha = " << this->GetAlpha() << std::endl;
80 os << indent <<
"Beta = " << this->GetBeta() << std::endl;
81 os << indent <<
"Gamma = " << this->GetGamma() << std::endl;
82 os << indent <<
"Rigidity = " << this->GetRigidity() << std::endl;
83 os << indent <<
"Iterations = " << this->GetIterations() << std::endl;
84 os << indent <<
"Step = " << this->GetStep() << std::endl;
85 os << indent <<
"ImageDepth = " << this->GetImageDepth() << std::endl;
86 if( this->GetGradient().IsNotNull() )
88 os << indent <<
"Gradient = " << this->GetGradient() << std::endl;
92 os << indent <<
"Gradient = " <<
"(None)" << std::endl;
94 os << indent <<
"ImageHeight = " << this->GetImageHeight() << std::endl;
95 os << indent <<
"ImageWidth = " << this->GetImageWidth() << std::endl;
96 os << indent <<
"Damping = " << this->GetDamping() << std::endl;
97 if( this->m_Data.IsNotNull() )
99 os << indent <<
"Data = " << this->GetData() << std::endl;
103 os << indent <<
"Data = " <<
"(None)" << std::endl;
111 template <
typename TInputMesh,
typename TOutputMesh>
120 while ( m_Step < m_Iterations )
122 const float progress =
static_cast<float>( m_Step ) /
123 static_cast<float>( m_Iterations );
125 this->UpdateProgress( progress );
127 this->ComputeGeometry();
129 if ( m_Step % 10 == 0 && m_Step > 0 )
131 this->UpdateReferenceMetrics();
134 this->ComputeDisplacement();
142 while( pointItr != points->End() )
145 unsigned long idx = pointItr.Index();
146 data = this->m_Data->GetElement(idx);
150 this->ComputeOutput();
156 template <
typename TInputMesh,
typename TOutputMesh>
165 if ( this->m_Gradient.IsNotNull() )
169 m_ImageWidth = imageSize[0];
170 m_ImageHeight = imageSize[1];
171 m_ImageDepth = imageSize[2];
180 if( this->m_Data.IsNull() )
182 this->m_Data = this->GetInput(0)->GetGeometryData();
185 while( pointItr != points->End() )
188 unsigned long idx = pointItr.Index();
190 data = this->m_Data->GetElement(idx);
191 data->
pos = pointItr.Value();
200 InputNeighbors* neighborsList = this->GetInput(0)->GetNeighbors( pointItr.Index() , m_Rigidity);
204 while ( neighborIt != neighborsList->end() )
206 neighborSet->insert( *neighborIt++ );
209 delete neighborsList;
219 template <
typename TInputMesh,
typename TOutputMesh>
233 typename GeometryMapType::Iterator dataIt = this->m_Data->Begin();
237 while ( dataIt != this->m_Data->End() )
240 data = dataIt.Value();
266 double sinphi = 2 * data->
circleRadius * D * vnl_math_sgn( tmpNormalProd );
267 double phi = vcl_asin(sinphi);
274 double distance = -tmpNormalProd;
281 data->
eps = ComputeBarycentricCoordinates( Foot, data);
282 dataIt.Value() = data;
287 template <
typename TInputMesh,
typename TOutputMesh>
299 typename GeometryMapType::Iterator dataIt = this->m_Data->Begin();
303 while( dataIt != this->m_Data->End() )
305 data = dataIt.Value();
307 this->ComputeInternalForce( data );
309 this->ComputeExternalForce( data );
314 data->
pos += displacement;
315 nonConstPoints->InsertElement( dataIt.Index(), data->
pos );
322 template <
typename TInputMesh,
typename TOutputMesh>
328 double eps1Diff, eps2Diff, eps3Diff;
341 eps1Diff = epsRef[0]-eps[0];
342 eps2Diff = epsRef[1]-eps[1];
343 eps3Diff = epsRef[2]-eps[2];
347 eps2Diff * (data->
neighbors[1]).Get_vnl_vector() +
348 eps3Diff * (data->
neighbors[2]).Get_vnl_vector()
360 while ( neighborIt != neighborSet->end() )
362 phiRef += this->m_Data->GetElement(*neighborIt++)->phi;
364 phiRef /= (double) neighborSet->size();
366 double L = L_Func(r,d,phi);
367 double L_Ref = L_Func(r,d,phiRef);
374 if (L_Ref != (
double) NumericTraits<unsigned long>::max() && L != (
double) NumericTraits<unsigned long>::max())
382 template <
typename TInputMesh,
typename TOutputMesh>
387 PointType vec_for, tmp_vec_1, tmp_vec_2, tmp_vec_3;
398 tmp_co_1[0] = coord2[0];
399 tmp_co_1[1] = coord[1];
400 tmp_co_1[2] = coord[2];
402 tmp_co_2[0] = coord[0];
403 tmp_co_2[1] = coord2[1];
404 tmp_co_2[2] = coord[2];
406 tmp_co_3[0] = coord[0];
407 tmp_co_3[1] = coord[1];
408 tmp_co_3[2] = coord2[2];
410 if ( (coord[0] >= 0) && (coord[1] >= 0) && (coord[2] >= 0) &&
411 (coord2[0] < m_ImageWidth) && (coord2[1] < m_ImageHeight) && (coord2[2] < m_ImageDepth) )
413 vec_for[0] = m_Gradient->GetPixel(coord)[0];
414 vec_for[1] = m_Gradient->GetPixel(coord)[1];
415 vec_for[2] = m_Gradient->GetPixel(coord)[2];
417 tmp_vec_1[0] = m_Gradient->GetPixel(tmp_co_1)[0] - m_Gradient->GetPixel(coord)[0];
418 tmp_vec_1[1] = m_Gradient->GetPixel(tmp_co_1)[1] - m_Gradient->GetPixel(coord)[1];
419 tmp_vec_1[2] = m_Gradient->GetPixel(tmp_co_1)[2] - m_Gradient->GetPixel(coord)[2];
420 tmp_vec_2[0] = m_Gradient->GetPixel(tmp_co_2)[0] - m_Gradient->GetPixel(coord)[0];
421 tmp_vec_2[1] = m_Gradient->GetPixel(tmp_co_2)[1] - m_Gradient->GetPixel(coord)[1];
422 tmp_vec_2[2] = m_Gradient->GetPixel(tmp_co_2)[2] - m_Gradient->GetPixel(coord)[2];
423 tmp_vec_3[0] = m_Gradient->GetPixel(tmp_co_3)[0] - m_Gradient->GetPixel(coord)[0];
424 tmp_vec_3[1] = m_Gradient->GetPixel(tmp_co_3)[1] - m_Gradient->GetPixel(coord)[1];
425 tmp_vec_3[2] = m_Gradient->GetPixel(tmp_co_3)[2] - m_Gradient->GetPixel(coord)[2];
427 vec_for[0] = vec_for[0] + ((data->
pos)[0]-coord[0])*tmp_vec_1[0]
428 + ((data->
pos)[1]-coord[1])*tmp_vec_2[0] + ((data->
pos)[2]-coord[2])*tmp_vec_3[0];
429 vec_for[1] = vec_for[1] + ((data->
pos)[1]-coord[1])*tmp_vec_2[1]
430 + ((data->
pos)[0]-coord[0])*tmp_vec_1[1] + ((data->
pos)[2]-coord[2])*tmp_vec_3[1];
431 vec_for[2] = vec_for[2] + ((data->
pos)[2]-coord[2])*tmp_vec_3[2]
432 + ((data->
pos)[1]-coord[1])*tmp_vec_2[2] + ((data->
pos)[0]-coord[0])*tmp_vec_1[2];
442 vec_for[0] = mag*(data->
normal)[0];
443 vec_for[1] = mag*(data->
normal)[1];
444 vec_for[2] = mag*(data->
normal)[2];
450 for (
int i=0; i<3; i++)
451 vec_for[i] = (0.5 * vec_for[i])/mag;
461 template <
typename TInputMesh,
typename TOutputMesh>
468 this->CopyInputMeshToOutputMeshPoints();
469 this->CopyInputMeshToOutputMeshPointData();
470 this->CopyInputMeshToOutputMeshCells();
471 this->CopyInputMeshToOutputMeshCellData();
473 output->SetGeometryData(this->m_Data);
474 output->SetLastCellId( this->GetInput(0)->GetLastCellId() );
479 template <
typename TInputMesh,
typename TOutputMesh>
500 while ( dataIt != this->m_Data->End() )
502 data = dataIt->Value();
508 H_Mean = (H_N1 + H_N2 + H_N3)/3.0;
512 deltaH[0] = (H_N1 - H_Mean)/H_Mean;
513 deltaH[1] = (H_N2 - H_Mean)/H_Mean;
514 deltaH[2] = (H_N3 - H_Mean)/H_Mean;
522 eps_opt[0] = (1.0/3.0) + m_Gamma * deltaH[0];
523 eps_opt[1] = (1.0/3.0) + m_Gamma * deltaH[1];
524 eps_opt[2] = (1.0/3.0) + m_Gamma * deltaH[2];
528 eps[0] = eps[0] + 0.5 * (eps_opt[0] - eps[0]);
529 eps[1] = eps[1] + 0.5 * (eps_opt[1] - eps[1]);
530 eps[2] = eps[2] + 0.5 * (eps_opt[2] - eps[2]);
534 nonConstInputMesh->SetPointData( dataIt->Index() , H );
535 dataIt.Value() = data;
542 template <
typename TInputMesh,
typename TOutputMesh>
548 double r2Minusd2 = r2-d2;
549 double tanPhi = vcl_tan(phi);
557 double tmpSqr = r2 + r2Minusd2 * tanPhi*tanPhi;
560 double denom = eps*(vcl_sqrt(tmpSqr) + r);
563 L = (r2Minusd2 * tanPhi) / denom;
567 L = (double) NumericTraits<unsigned long>::max();
573 L = (double) NumericTraits<unsigned long>::max();
579 template <
typename TInputMesh,
typename TOutputMesh>
604 #endif //__itkDeformableSimplexMesh3DFilter_TXX