00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkPlaneGeometry.h"
00020 #include "mitkPlaneOperation.h"
00021 #include "mitkInteractionConst.h"
00022 #include "mitkLine.h"
00023
00024 #include <vtkTransform.h>
00025
00026 #include <vnl/vnl_cross.h>
00027
00028
00029 namespace mitk
00030 {
00031
00032 mitk::PlaneGeometry::PlaneGeometry()
00033 {
00034 Initialize();
00035 }
00036
00037
00038 mitk::PlaneGeometry::~PlaneGeometry()
00039 {
00040 }
00041
00042
00043 void
00044 PlaneGeometry::Initialize()
00045 {
00046 Superclass::Initialize();
00047 }
00048
00049
00050 void
00051 PlaneGeometry::EnsurePerpendicularNormal(mitk::AffineTransform3D *transform)
00052 {
00053
00054 VnlVector normal = vnl_cross_3d(
00055 transform->GetMatrix().GetVnlMatrix().get_column(0),
00056 transform->GetMatrix().GetVnlMatrix().get_column(1) );
00057
00058 normal.normalize();
00059 ScalarType len = transform->GetMatrix()
00060 .GetVnlMatrix().get_column(2).two_norm();
00061
00062 if (len==0) len = 1;
00063 normal*=len;
00064 Matrix3D matrix = transform->GetMatrix();
00065 matrix.GetVnlMatrix().set_column(2, normal);
00066 transform->SetMatrix(matrix);
00067 }
00068
00069
00070 void
00071 PlaneGeometry::SetIndexToWorldTransform(mitk::AffineTransform3D *transform)
00072 {
00073 EnsurePerpendicularNormal(transform);
00074
00075 Superclass::SetIndexToWorldTransform(transform);
00076 }
00077
00078
00079 void
00080 PlaneGeometry::SetBounds(const BoundingBox::BoundsArrayType &bounds)
00081 {
00082
00083 assert(bounds[0]==0);
00084 assert(bounds[2]==0);
00085
00086 assert(bounds[1]>0);
00087 assert(bounds[3]>0);
00088
00089 Superclass::SetBounds(bounds);
00090 }
00091
00092
00093 void
00094 PlaneGeometry::IndexToWorld( const Point2D &pt_units, Point2D &pt_mm ) const
00095 {
00096 pt_mm[0]=m_ScaleFactorMMPerUnitX*pt_units[0];
00097 pt_mm[1]=m_ScaleFactorMMPerUnitY*pt_units[1];
00098 }
00099
00100
00101 void PlaneGeometry::WorldToIndex( const Point2D &pt_mm, Point2D &pt_units ) const
00102 {
00103 pt_units[0]=pt_mm[0]*(1.0/m_ScaleFactorMMPerUnitX);
00104 pt_units[1]=pt_mm[1]*(1.0/m_ScaleFactorMMPerUnitY);
00105 }
00106
00107
00108 void PlaneGeometry::IndexToWorld( const Point2D &,
00109 const Vector2D &vec_units, Vector2D &vec_mm) const
00110 {
00111 vec_mm[0] = m_ScaleFactorMMPerUnitX * vec_units[0];
00112 vec_mm[1] = m_ScaleFactorMMPerUnitY * vec_units[1];
00113 }
00114
00115
00116 void
00117 PlaneGeometry::WorldToIndex( const Point2D &,
00118 const Vector2D &vec_mm, Vector2D &vec_units) const
00119 {
00120 vec_units[0] = vec_mm[0] * ( 1.0 / m_ScaleFactorMMPerUnitX );
00121 vec_units[1] = vec_mm[1] * ( 1.0 / m_ScaleFactorMMPerUnitY );
00122 }
00123
00124
00125 void
00126 PlaneGeometry::InitializeStandardPlane( mitk::ScalarType width,
00127 ScalarType height, const Vector3D & spacing,
00128 PlaneGeometry::PlaneOrientation planeorientation,
00129 ScalarType zPosition, bool frontside, bool rotated )
00130 {
00131 AffineTransform3D::Pointer transform;
00132
00133 transform = AffineTransform3D::New();
00134 AffineTransform3D::MatrixType matrix;
00135 AffineTransform3D::MatrixType::InternalMatrixType &vnlmatrix =
00136 matrix.GetVnlMatrix();
00137
00138 vnlmatrix.set_identity();
00139 vnlmatrix(0,0) = spacing[0];
00140 vnlmatrix(1,1) = spacing[1];
00141 vnlmatrix(2,2) = spacing[2];
00142 transform->SetIdentity();
00143 transform->SetMatrix(matrix);
00144
00145 InitializeStandardPlane(width, height, transform.GetPointer(),
00146 planeorientation, zPosition, frontside, rotated);
00147 }
00148
00149
00150 void
00151 PlaneGeometry::InitializeStandardPlane( mitk::ScalarType width,
00152 ScalarType height, const AffineTransform3D* transform,
00153 PlaneGeometry::PlaneOrientation planeorientation, ScalarType zPosition,
00154 bool frontside, bool rotated )
00155 {
00156 Superclass::Initialize();
00157
00158
00159 Point3D origin;
00160 VnlVector rightDV(3), bottomDV(3);
00161 origin.Fill(0);
00162 int normalDirection;
00163 switch(planeorientation)
00164 {
00165 case Transversal:
00166 if(frontside)
00167 {
00168 if(rotated==false)
00169 {
00170 FillVector3D(origin, 0, 0, zPosition);
00171 FillVector3D(rightDV, 1, 0, 0);
00172 FillVector3D(bottomDV, 0, 1, 0);
00173 }
00174 else
00175 {
00176 FillVector3D(origin, width, height, zPosition);
00177 FillVector3D(rightDV, -1, 0, 0);
00178 FillVector3D(bottomDV, 0, -1, 0);
00179 }
00180 }
00181 else
00182 {
00183 if(rotated==false)
00184 {
00185 FillVector3D(origin, width, 0, zPosition);
00186 FillVector3D(rightDV, -1, 0, 0);
00187 FillVector3D(bottomDV, 0, 1, 0);
00188 }
00189 else
00190 {
00191 FillVector3D(origin, 0, height, zPosition);
00192 FillVector3D(rightDV, 1, 0, 0);
00193 FillVector3D(bottomDV, 0, -1, 0);
00194 }
00195 }
00196 normalDirection = 2;
00197 break;
00198 case Frontal:
00199 if(frontside)
00200 {
00201 if(rotated==false)
00202 {
00203 FillVector3D(origin, 0, zPosition, 0);
00204 FillVector3D(rightDV, 1, 0, 0);
00205 FillVector3D(bottomDV, 0, 0, 1);
00206 }
00207 else
00208 {
00209 FillVector3D(origin, width, zPosition, height);
00210 FillVector3D(rightDV, -1, 0, 0);
00211 FillVector3D(bottomDV, 0, 0, -1);
00212 }
00213 }
00214 else
00215 {
00216 if(rotated==false)
00217 {
00218 FillVector3D(origin, width, zPosition, 0);
00219 FillVector3D(rightDV, -1, 0, 0);
00220 FillVector3D(bottomDV, 0, 0, 1);
00221 }
00222 else
00223 {
00224 FillVector3D(origin, 0, zPosition, height);
00225 FillVector3D(rightDV, 1, 0, 0);
00226 FillVector3D(bottomDV, 0, 0, -1);
00227 }
00228 }
00229 normalDirection = 1;
00230 break;
00231 case Sagittal:
00232 if(frontside)
00233 {
00234 if(rotated==false)
00235 {
00236 FillVector3D(origin, zPosition, 0, 0);
00237 FillVector3D(rightDV, 0, 1, 0);
00238 FillVector3D(bottomDV, 0, 0, 1);
00239 }
00240 else
00241 {
00242 FillVector3D(origin, zPosition, width, height);
00243 FillVector3D(rightDV, 0, -1, 0);
00244 FillVector3D(bottomDV, 0, 0, -1);
00245 }
00246 }
00247 else
00248 {
00249 if(rotated==false)
00250 {
00251 FillVector3D(origin, zPosition, width, 0);
00252 FillVector3D(rightDV, 0, -1, 0);
00253 FillVector3D(bottomDV, 0, 0, 1);
00254 }
00255 else
00256 {
00257 FillVector3D(origin, zPosition, 0, height);
00258 FillVector3D(rightDV, 0, 1, 0);
00259 FillVector3D(bottomDV, 0, 0, -1);
00260 }
00261 }
00262 normalDirection = 0;
00263 break;
00264 default:
00265 itkExceptionMacro("unknown PlaneOrientation");
00266 }
00267 if ( transform != NULL )
00268 {
00269 origin = transform->TransformPoint( origin );
00270 rightDV = transform->TransformVector( rightDV );
00271 bottomDV = transform->TransformVector( bottomDV );
00272 }
00273
00274 ScalarType bounds[6]= { 0, width, 0, height, 0, 1 };
00275 this->SetBounds( bounds );
00276
00277 if ( transform == NULL )
00278 {
00279 this->SetMatrixByVectors( rightDV, bottomDV );
00280 }
00281 else
00282 {
00283 this->SetMatrixByVectors(
00284 rightDV, bottomDV,
00285 transform->GetMatrix().GetVnlMatrix()
00286 .get_column(normalDirection).magnitude()
00287 );
00288 }
00289
00290 this->SetOrigin(origin);
00291 }
00292
00293
00294 void
00295 PlaneGeometry::InitializeStandardPlane( const Geometry3D *geometry3D,
00296 PlaneOrientation planeorientation, ScalarType zPosition,
00297 bool frontside, bool rotated )
00298 {
00299 this->SetReferenceGeometry( const_cast< Geometry3D * >( geometry3D ) );
00300
00301 ScalarType width, height;
00302
00303 const BoundingBox::BoundsArrayType& boundsarray =
00304 geometry3D->GetBoundingBox()->GetBounds();
00305
00306 Vector3D originVector;
00307 FillVector3D(originVector, boundsarray[0], boundsarray[2], boundsarray[4]);
00308 if(geometry3D->GetImageGeometry())
00309 {
00310 FillVector3D( originVector,
00311 originVector[0] - 0.5,
00312 originVector[1] - 0.5,
00313 originVector[2] - 0.5 );
00314 }
00315 switch(planeorientation)
00316 {
00317 case Transversal:
00318 width = geometry3D->GetExtent(0);
00319 height = geometry3D->GetExtent(1);
00320 break;
00321 case Frontal:
00322 width = geometry3D->GetExtent(0);
00323 height = geometry3D->GetExtent(2);
00324 break;
00325 case Sagittal:
00326 width = geometry3D->GetExtent(1);
00327 height = geometry3D->GetExtent(2);
00328 break;
00329 default:
00330 itkExceptionMacro("unknown PlaneOrientation");
00331 }
00332
00333 InitializeStandardPlane( width, height,
00334 geometry3D->GetIndexToWorldTransform(),
00335 planeorientation, zPosition, frontside, rotated );
00336
00337 ScalarType bounds[6]= { 0, width, 0, height, 0, 1 };
00338 this->SetBounds( bounds );
00339
00340 Point3D origin;
00341 originVector = geometry3D->GetIndexToWorldTransform()
00342 ->TransformVector( originVector );
00343
00344 origin = GetOrigin() + originVector;
00345 SetOrigin(origin);
00346 }
00347
00348
00349 void
00350 PlaneGeometry::InitializeStandardPlane( const Geometry3D *geometry3D,
00351 bool top, PlaneOrientation planeorientation, bool frontside, bool rotated )
00352 {
00353 ScalarType zPosition;
00354
00355 switch(planeorientation)
00356 {
00357 case Transversal:
00358 zPosition = (top ? 0.5 : geometry3D->GetExtent(2)-1+0.5);
00359 break;
00360 case Frontal:
00361 zPosition = (top ? 0.5 : geometry3D->GetExtent(1)-1+0.5);
00362 break;
00363 case Sagittal:
00364 zPosition = (top ? 0.5 : geometry3D->GetExtent(0)-1+0.5);
00365 break;
00366 default:
00367 itkExceptionMacro("unknown PlaneOrientation");
00368 }
00369
00370 InitializeStandardPlane( geometry3D, planeorientation,
00371 zPosition, frontside, rotated );
00372 }
00373
00374
00375 void
00376 PlaneGeometry::InitializeStandardPlane( const Vector3D &rightVector,
00377 const Vector3D &downVector, const Vector3D *spacing )
00378 {
00379 InitializeStandardPlane( rightVector.Get_vnl_vector(),
00380 downVector.Get_vnl_vector(), spacing );
00381 }
00382
00383
00384 void
00385 PlaneGeometry::InitializeStandardPlane( const VnlVector& rightVector,
00386 const VnlVector &downVector, const Vector3D *spacing )
00387 {
00388 ScalarType width = rightVector.magnitude();
00389 ScalarType height = downVector.magnitude();
00390
00391 InitializeStandardPlane( width, height, rightVector, downVector, spacing );
00392 }
00393
00394
00395 void
00396 PlaneGeometry::InitializeStandardPlane( mitk::ScalarType width,
00397 ScalarType height, const Vector3D &rightVector, const Vector3D &downVector,
00398 const Vector3D *spacing )
00399 {
00400 InitializeStandardPlane(
00401 width, height,
00402 rightVector.Get_vnl_vector(), downVector.Get_vnl_vector(),
00403 spacing );
00404 }
00405
00406
00407 void
00408 PlaneGeometry::InitializeStandardPlane(
00409 mitk::ScalarType width, ScalarType height,
00410 const VnlVector &rightVector, const VnlVector &downVector,
00411 const Vector3D *spacing )
00412 {
00413 assert(width > 0);
00414 assert(height > 0);
00415
00416 VnlVector rightDV = rightVector; rightDV.normalize();
00417 VnlVector downDV = downVector; downDV.normalize();
00418 VnlVector normal = vnl_cross_3d(rightVector, downVector);
00419 normal.normalize();
00420
00421 if(spacing!=NULL)
00422 {
00423 rightDV *= (*spacing)[0];
00424 downDV *= (*spacing)[1];
00425 normal *= (*spacing)[2];
00426 }
00427
00428 AffineTransform3D::Pointer transform = AffineTransform3D::New();
00429 Matrix3D matrix;
00430 matrix.GetVnlMatrix().set_column(0, rightDV);
00431 matrix.GetVnlMatrix().set_column(1, downDV);
00432 matrix.GetVnlMatrix().set_column(2, normal);
00433 transform->SetMatrix(matrix);
00434 transform->SetOffset(m_IndexToWorldTransform->GetOffset());
00435
00436 ScalarType bounds[6] = { 0, width, 0, height, 0, 1 };
00437 this->SetBounds( bounds );
00438
00439 this->SetIndexToWorldTransform( transform );
00440 }
00441
00442
00443 void
00444 PlaneGeometry::InitializePlane( const Point3D &origin,
00445 const Vector3D &normal )
00446 {
00447 VnlVector rightVectorVnl(3), downVectorVnl;
00448
00449 if( Equal( normal[1], 0.0f ) == false )
00450 {
00451 FillVector3D( rightVectorVnl, 1.0f, -normal[0]/normal[1], 0.0f );
00452 rightVectorVnl.normalize();
00453 }
00454 else
00455 {
00456 FillVector3D( rightVectorVnl, 0.0f, 1.0f, 0.0f );
00457 }
00458 downVectorVnl = vnl_cross_3d( normal.Get_vnl_vector(), rightVectorVnl );
00459 downVectorVnl.normalize();
00460
00461 InitializeStandardPlane( rightVectorVnl, downVectorVnl );
00462
00463 SetOrigin(origin);
00464 }
00465
00466
00467 void
00468 PlaneGeometry::SetMatrixByVectors( const VnlVector &rightVector,
00469 const VnlVector &downVector, ScalarType thickness )
00470 {
00471 VnlVector normal = vnl_cross_3d(rightVector, downVector);
00472 normal.normalize();
00473 normal *= thickness;
00474
00475 AffineTransform3D::Pointer transform = AffineTransform3D::New();
00476 Matrix3D matrix;
00477 matrix.GetVnlMatrix().set_column(0, rightVector);
00478 matrix.GetVnlMatrix().set_column(1, downVector);
00479 matrix.GetVnlMatrix().set_column(2, normal);
00480 transform->SetMatrix(matrix);
00481 transform->SetOffset(m_IndexToWorldTransform->GetOffset());
00482 SetIndexToWorldTransform(transform);
00483 }
00484
00485
00486 Vector3D
00487 PlaneGeometry::GetNormal() const
00488 {
00489 Vector3D frontToBack;
00490 frontToBack.Set_vnl_vector( m_IndexToWorldTransform
00491 ->GetMatrix().GetVnlMatrix().get_column(2) );
00492
00493 return frontToBack;
00494 }
00495
00496
00497 VnlVector
00498 PlaneGeometry::GetNormalVnl() const
00499 {
00500 return m_IndexToWorldTransform
00501 ->GetMatrix().GetVnlMatrix().get_column(2);
00502 }
00503
00504
00505 ScalarType
00506 PlaneGeometry::DistanceFromPlane( const Point3D &pt3d_mm ) const
00507 {
00508 return fabs(SignedDistance( pt3d_mm ));
00509 }
00510
00511
00512 ScalarType
00513 PlaneGeometry::SignedDistance( const Point3D &pt3d_mm ) const
00514 {
00515 return SignedDistanceFromPlane(pt3d_mm);
00516 }
00517
00518
00519 bool
00520 PlaneGeometry::IsAbove( const Point3D &pt3d_mm ) const
00521 {
00522 return SignedDistanceFromPlane(pt3d_mm) > 0;
00523 }
00524
00525
00526 bool
00527 PlaneGeometry::IntersectionLine(
00528 const PlaneGeometry* plane, Line3D& crossline ) const
00529 {
00530 Vector3D normal = this->GetNormal();
00531 normal.Normalize();
00532
00533 Vector3D planeNormal = plane->GetNormal();
00534 planeNormal.Normalize();
00535
00536 Vector3D direction = itk::CrossProduct( normal, planeNormal );
00537
00538 if ( direction.GetSquaredNorm() < eps )
00539 return false;
00540
00541 crossline.SetDirection( direction );
00542
00543 double N1dN2 = normal * planeNormal;
00544 double determinant = 1.0 - N1dN2 * N1dN2;
00545
00546 Vector3D origin = this->GetOrigin().GetVectorFromOrigin();
00547 Vector3D planeOrigin = plane->GetOrigin().GetVectorFromOrigin();
00548
00549 double d1 = normal * origin;
00550 double d2 = planeNormal * planeOrigin;
00551
00552 double c1 = ( d1 - d2 * N1dN2 ) / determinant;
00553 double c2 = ( d2 - d1 * N1dN2 ) / determinant;
00554
00555 Vector3D p = normal * c1 + planeNormal * c2;
00556 crossline.GetPoint().Get_vnl_vector() = p.Get_vnl_vector();
00557
00558 return true;
00559 }
00560
00561
00562 unsigned int
00563 PlaneGeometry::IntersectWithPlane2D(
00564 const PlaneGeometry* plane, Point2D& lineFrom, Point2D &lineTo ) const
00565 {
00566 Line3D crossline;
00567 if ( this->IntersectionLine( plane, crossline ) == false )
00568 return 0;
00569
00570 Point2D point2;
00571 Vector2D direction2;
00572
00573 this->Map( crossline.GetPoint(), point2 );
00574 this->Map( crossline.GetPoint(), crossline.GetDirection(), direction2 );
00575
00576 return
00577 Line3D::RectangleLineIntersection(
00578 0, 0, GetExtentInMM(0), GetExtentInMM(1),
00579 point2, direction2, lineFrom, lineTo );
00580 }
00581
00582
00583 double PlaneGeometry::Angle( const PlaneGeometry *plane ) const
00584 {
00585 return angle(plane->GetMatrixColumn(2), GetMatrixColumn(2));
00586 }
00587
00588
00589 double PlaneGeometry::Angle( const Line3D &line ) const
00590 {
00591 return vnl_math::pi_over_2
00592 - angle( line.GetDirection().Get_vnl_vector(), GetMatrixColumn(2) );
00593 }
00594
00595
00596 bool PlaneGeometry::IntersectionPoint(
00597 const Line3D &line, Point3D &intersectionPoint ) const
00598 {
00599 Vector3D planeNormal = this->GetNormal();
00600 planeNormal.Normalize();
00601
00602 Vector3D lineDirection = line.GetDirection();
00603 lineDirection.Normalize();
00604
00605 double t = planeNormal * lineDirection;
00606 if ( fabs( t ) < eps )
00607 {
00608 return false;
00609 }
00610
00611 Vector3D diff;
00612 diff = this->GetOrigin() - line.GetPoint();
00613 t = ( planeNormal * diff ) / t;
00614
00615 intersectionPoint = line.GetPoint() + line.GetDirection() * t;
00616 return true;
00617 }
00618
00619
00620 bool
00621 PlaneGeometry::IntersectionPointParam( const Line3D &line, double &t ) const
00622 {
00623 Vector3D planeNormal = this->GetNormal();
00624 planeNormal.Normalize();
00625
00626 Vector3D lineDirection = line.GetDirection();
00627 lineDirection.Normalize();
00628
00629 t = planeNormal * lineDirection;
00630
00631 if ( fabs( t ) < eps )
00632 {
00633 return false;
00634 }
00635
00636 Vector3D diff;
00637 diff = this->GetOrigin() - line.GetPoint();
00638 t = ( planeNormal * diff ) / t;
00639 return true;
00640 }
00641
00642
00643 bool
00644 PlaneGeometry::IsParallel( const PlaneGeometry *plane ) const
00645 {
00646 return ( (Angle(plane) < 10.0 * mitk::sqrteps ) || ( Angle(plane) > ( vnl_math::pi - 10.0 * sqrteps ) ) ) ;
00647 }
00648
00649
00650 bool
00651 PlaneGeometry::IsOnPlane( const Point3D &point ) const
00652 {
00653 return Distance(point) < eps;
00654 }
00655
00656
00657 bool
00658 PlaneGeometry::IsOnPlane( const Line3D &line ) const
00659 {
00660 return ( (Distance( line.GetPoint() ) < eps)
00661 && (Distance( line.GetPoint2() ) < eps) );
00662 }
00663
00664
00665 bool
00666 PlaneGeometry::IsOnPlane( const PlaneGeometry *plane ) const
00667 {
00668 return ( IsParallel( plane ) && (Distance( plane->GetOrigin() ) < eps) );
00669 }
00670
00671
00672 Point3D
00673 PlaneGeometry::ProjectPointOntoPlane( const Point3D& pt ) const
00674 {
00675 ScalarType len = this->GetNormalVnl().two_norm();
00676 return pt - this->GetNormal() * this->SignedDistanceFromPlane( pt ) / len;
00677 }
00678
00679
00680 AffineGeometryFrame3D::Pointer
00681 PlaneGeometry::Clone() const
00682 {
00683 Self::Pointer newGeometry = Self::New();
00684 newGeometry->Initialize();
00685 InitializeGeometry(newGeometry);
00686 return newGeometry.GetPointer();
00687 }
00688
00689
00690 void
00691 PlaneGeometry::ExecuteOperation( Operation *operation )
00692 {
00693 vtkTransform *transform = vtkTransform::New();
00694 transform->SetMatrix( m_VtkMatrix );
00695
00696 switch ( operation->GetOperationType() )
00697 {
00698 case OpORIENT:
00699 {
00700 mitk::PlaneOperation *planeOp = dynamic_cast< mitk::PlaneOperation * >( operation );
00701 if ( planeOp == NULL )
00702 {
00703 return;
00704 }
00705
00706 Point3D center = planeOp->GetPoint();
00707
00708 Vector3D orientationVector = planeOp->GetNormal();
00709 Vector3D defaultVector;
00710 FillVector3D( defaultVector, 0.0, 0.0, 1.0 );
00711
00712 Vector3D rotationAxis = itk::CrossProduct( orientationVector, defaultVector );
00713
00714
00715 vtkFloatingPointType rotationAngle = atan2( (double) rotationAxis.GetNorm(), (double) (orientationVector * defaultVector) );
00716 rotationAngle *= 180.0 / vnl_math::pi;
00717
00718 transform->PostMultiply();
00719 transform->Identity();
00720 transform->Translate( center[0], center[1], center[2] );
00721 transform->RotateWXYZ( rotationAngle, rotationAxis[0], rotationAxis[1], rotationAxis[2] );
00722 transform->Translate( -center[0], -center[1], -center[2] );
00723 break;
00724 }
00725
00726
00727 default:
00728 Superclass::ExecuteOperation( operation );
00729 transform->Delete();
00730 return;
00731 }
00732
00733 m_VtkMatrix->DeepCopy(transform->GetMatrix());
00734 this->TransferVtkToItkTransform();
00735 this->Modified();
00736 transform->Delete();
00737 }
00738
00739
00740 void PlaneGeometry::InitializeGeometry( Self *newGeometry ) const
00741 {
00742 Superclass::InitializeGeometry(newGeometry);
00743 }
00744
00745
00746 void PlaneGeometry::PrintSelf( std::ostream& os, itk::Indent indent ) const
00747 {
00748 Superclass::PrintSelf(os,indent);
00749 os << indent << " Normal: " << GetNormal() << std::endl;
00750 }
00751
00752
00753 }