Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes

mitk::PolygonToRingFilter Class Reference
[Process Classes]

Create ring around polygons contained in a Mesh. More...

#include <mitkPolygonToRingFilter.h>

Inheritance diagram for mitk::PolygonToRingFilter:
Inheritance graph
[legend]
Collaboration diagram for mitk::PolygonToRingFilter:
Collaboration graph
[legend]

List of all members.

Public Types

typedef PolygonToRingFilter Self
typedef SurfaceSource Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual void GenerateOutputInformation ()
virtual void GenerateData ()
const mitk::MeshGetInput (void)
virtual void SetInput (const mitk::Mesh *image)
virtual float GetRingRadius ()
 Get ring radius.
virtual void SetRingRadius (float _arg)
virtual unsigned int GetRingResolution ()
 Get ring resolution of created Surface.
virtual void SetRingResolution (unsigned int _arg)
 Set ring resolution of created Surface.
virtual unsigned int GetSplineResolution ()
 Get spline resolution.
virtual void SetSplineResolution (unsigned int _arg)
 Set spline resolution.

Static Public Member Functions

static Pointer New ()

Protected Types

typedef std::vector< Vector3D > VectorListType
typedef std::vector< Point3D > PointListType

Protected Member Functions

 PolygonToRingFilter ()
virtual ~PolygonToRingFilter ()
void BuildVtkTube (vtkPoints *vPoints, vtkCellArray *polys, PointListType &ptList, VectorListType &vecList)
void BuildPointAndVectorList (mitk::Mesh::CellType &cell, PointListType &ptList, VectorListType &vecList, int timeStep=0)
void DrawCyl (vtkPoints *vPoints, vtkCellArray *polys, VectorListType &sl, VectorListType &sc, int idmax, Point3D &last_p, Point3D &cur_p)

Protected Attributes

float m_RingRadius
 Ring radius.
unsigned int m_RingResolution
 Ring resolution of created Surface.
unsigned int m_SplineResolution
 Spline resolution of created Surface.
vtkCardinalSpline * m_SplineX
vtkCardinalSpline * m_SplineY
vtkCardinalSpline * m_SplineZ
PointListType m_PointList
VectorListType m_VectorList

Detailed Description

Create ring around polygons contained in a Mesh.

Definition at line 39 of file mitkPolygonToRingFilter.h.


Member Typedef Documentation

typedef itk::SmartPointer<const Self> mitk::PolygonToRingFilter::ConstPointer

Definition at line 42 of file mitkPolygonToRingFilter.h.

typedef itk::SmartPointer<Self> mitk::PolygonToRingFilter::Pointer

Definition at line 42 of file mitkPolygonToRingFilter.h.

typedef std::vector<Point3D> mitk::PolygonToRingFilter::PointListType [protected]

Definition at line 73 of file mitkPolygonToRingFilter.h.

Definition at line 42 of file mitkPolygonToRingFilter.h.

Definition at line 42 of file mitkPolygonToRingFilter.h.

typedef std::vector<Vector3D> mitk::PolygonToRingFilter::VectorListType [protected]

Definition at line 69 of file mitkPolygonToRingFilter.h.


Constructor & Destructor Documentation

mitk::PolygonToRingFilter::PolygonToRingFilter (  ) [protected]
mitk::PolygonToRingFilter::~PolygonToRingFilter (  ) [protected, virtual]

Definition at line 43 of file mitkPolygonToRingFilter.cpp.

{
  m_SplineX->Delete();
  m_SplineY->Delete();
  m_SplineZ->Delete();
}

Member Function Documentation

void mitk::PolygonToRingFilter::BuildPointAndVectorList ( mitk::Mesh::CellType cell,
PointListType ptList,
VectorListType vecList,
int  timeStep = 0 
) [protected]

Definition at line 244 of file mitkPolygonToRingFilter.cpp.

References QuadProgPP::t().

{
  // This method constructs a spline from the given point list and retrieves
  // a number of interpolated points from it to form a ring-like structure.
  //
  // To make the spline "closed", the end point is connected to the start
  // point. For ensuring smoothness at the start-end-point transition, the
  // (intrinsically non-circular) spline array is extended on both sides
  // by wrapping a number of points from the respective other side.
  //
  // The used VTK filters do principally support this kind of "closed" spline,
  // but it does not produce results as consistent as with the method used
  // here. Also, the spline class of VTK 4.4 has only poor support for
  // arbitrary parametric coordinates (t values in vtkSpline). VTK 5.0 has
  // better support, and also provides a new class vtkParametricSpline for
  // directly calculating 3D splines.


  // Remove points from previous call of this method
  m_SplineX->RemoveAllPoints();
  m_SplineY->RemoveAllPoints();
  m_SplineZ->RemoveAllPoints();

  int numberOfPoints = cell.GetNumberOfPoints();

  Mesh::PointType inputPoint;
  vtkFloatingPointType t, tStart(0), tEnd(0);

  // Add input points to the spline and assign each the parametric value t
  // derived from the point euclidean distances.
  int i;
  Mesh::PointIdIterator pit = cell.PointIdsEnd() - 3;
  for ( i = -3, t = 0.0; i < numberOfPoints + 3; ++i )
  {
    if ( i == 0 ) { tStart = t; }
    if ( i == numberOfPoints ) { tEnd = t; }

    inputPoint = this->GetInput()->GetPoint( *pit, timeStep );
    m_SplineX->AddPoint( t, inputPoint[0] );
    m_SplineY->AddPoint( t, inputPoint[1] );
    m_SplineZ->AddPoint( t, inputPoint[2] );

    ++pit;
    if ( pit == cell.PointIdsEnd() )
    {
      pit = cell.PointIdsBegin();
    }

    t += inputPoint.EuclideanDistanceTo( 
      this->GetInput()->GetPoint( *pit, timeStep ) );
  }

  // Evaluate the spline for the desired number of points
  // (number of input points) * (spline resolution)
  Point3D point, firstPoint, lastPoint;
  firstPoint.Fill(0);
  lastPoint.Fill(0);
  int numberOfSegments = numberOfPoints * m_SplineResolution;
  vtkFloatingPointType step = (tEnd - tStart) / numberOfSegments;
  for ( i = 0, t = tStart; i < numberOfSegments; ++i, t += step )
  {
    FillVector3D( point,
      m_SplineX->Evaluate(t), m_SplineY->Evaluate(t), m_SplineZ->Evaluate(t)
    );

    ptList.push_back( point );

    if ( i == 0 )
    {
      firstPoint = point;
    }
    else
    {
      vecList.push_back( point - lastPoint );
    }
    lastPoint = point;
  }
  vecList.push_back( firstPoint - lastPoint );
}
void mitk::PolygonToRingFilter::BuildVtkTube ( vtkPoints *  vPoints,
vtkCellArray *  polys,
PointListType ptList,
VectorListType vecList 
) [protected]

Definition at line 155 of file mitkPolygonToRingFilter.cpp.

References QuadProgPP::max().

{
  PointListType::iterator pit  = ptList.begin(), pend = ptList.end();
  VectorListType::iterator vit = vecList.begin();

  Vector3D axis, last_v, next_v, s;
  Point3D cur_p,last_p;

  //Listen für den Stern
  VectorListType *sl, *sc, *swp, sfirst, buf1, buf2;
  sl=&buf1; sc=&buf2;

  Vector3D a,b;
  Matrix3D m;
  //Initialisierung für ersten Punkt
  //alternative1:
  //  last_v=*(vl.getLast()); next_v=*vit.current(); axis=last_v+next_v; s.cross(last_v,next_v); s.normalize();
  //alternative2:
  //  last_v=*(vl.getLast()); next_v=*vit.current(); s.cross(last_v,next_v); s.normalize();
  //  axis=next_v-last_v; axis.normalize(); aa.set(s, M_PI/2.0); m.set(aa); m.transform(&axis);
  //alternative3:
  last_v=vecList.back(); next_v=*vit; s.Set_vnl_vector( vnl_cross_3d(last_v.Get_vnl_vector(),next_v.Get_vnl_vector()) ); s.Normalize();
  a=last_v; b=next_v; a.Normalize(); b.Normalize(); axis=a+b; axis.Normalize();

  //Stern am ersten Punkt aufbauen
  m = vnl_quaternion<mitk::ScalarType>(axis.Get_vnl_vector(),2*vnl_math::pi/(double)m_RingResolution).rotation_matrix_transpose();
  unsigned int i;
  for(i=0;i<m_RingResolution;++i)
  {
    sfirst.push_back(s);
    s=m*s;
  }
  *sl=sfirst;
  last_p=*pit;
  ++pit; ++vit;

  //nun die Hauptschleife über alle Punkte
  for ( ; pit != pend; ++pit, ++vit )
  {
    //    cur_p=*pit.current(); last_v=next_v; next_v=*vit.current(); axis=last_v+next_v; s.cross(last_v,next_v); s.normalize();
    cur_p=*pit; last_v=next_v; next_v=*vit; s.Set_vnl_vector( vnl_cross_3d(last_v.Get_vnl_vector(),next_v.Get_vnl_vector()) ); s.Normalize();
    //    axis=next_v-last_v; axis.normalize(); aa.set(s, M_PI/2.0); m.set(aa); m.transform(&axis);
    a=last_v; b=next_v; a.Normalize(); b.Normalize(); axis=a+b; axis.Normalize();

    //neuen Stern sc (SternCurrent) bauen und dabei Start für neuen Stern suchen
    double max=0; int idmax=0; Vector3D sl0=*(sl->begin()); 
    m = vnl_quaternion<mitk::ScalarType>(axis.Get_vnl_vector(),2*vnl_math::pi/(double)m_RingResolution).rotation_matrix_transpose();
    for(i=0;i<m_RingResolution;++i)
    {
      sc->push_back(s);
      double tmp=s*sl0;
      if(tmp>max)
      {
        max=tmp;
        idmax=i;
      }
      s=m*s;
    }

    //sl: Stern Letzter
    //sc: Stern Current=aktueller Stern
    //idmax: Id des Strahls des aktuellen Sterns (sc), der am besten zum ersten Strahl vom letzten Stern (sl) passt.
    //last_p: Mittelpunkt des letzten Sterns
    //cur_p: Mittelpunkt des aktuellen Sterns
    DrawCyl(vPoints, polys, *sl, *sc, idmax, last_p, cur_p);

    //Übergang zum nächsten
    last_p=cur_p;
    swp=sl; sl=sc; sc=swp; sc->clear();
  }

  //idmax für Verbindung ersten mit letztem ausrechnen:
  double max=0; int idmax=0; Vector3D sl0=*(sl->begin());
  for(i=0;i<m_RingResolution;++i)
  {
    s=sfirst[i];
    double tmp=s*sl0;
    if(tmp>max)
    {
      max=tmp;
      idmax=i;
    }
  }
  cur_p=*ptList.begin();
  DrawCyl(vPoints, polys, *sl, sfirst, idmax, last_p, cur_p);
}
void mitk::PolygonToRingFilter::DrawCyl ( vtkPoints *  vPoints,
vtkCellArray *  polys,
VectorListType sl,
VectorListType sc,
int  idmax,
Point3D &  last_p,
Point3D &  cur_p 
) [protected]

Definition at line 112 of file mitkPolygonToRingFilter.cpp.

{
  unsigned int i;
  //jetzt haben wir alles: sl0 wird mit sc->at(idmax) verbunden usw.
  VectorListType::iterator slit=sl.begin(), scit=sc.begin(), scend=sc.end();
  scit+=idmax;
  Point3D a,b;
  Point3D a_first,b_first;
  int a_firstID = 0, b_firstID = 0;

  vtkIdType front[4];
  for(i=0;i<m_RingResolution;++i)
  {
    VnlVector v0,v1,v2,v3,normal;
    v0=a.Get_vnl_vector(); v1=b.Get_vnl_vector();
    a=last_p+*slit*m_RingRadius; b=cur_p+*scit*m_RingRadius;
    v2=b.Get_vnl_vector(); v3=a.Get_vnl_vector();
    normal=vnl_cross_3d(v1-v0,v3-v0);

    if(i!=0)
    {
      front[3]=vPoints->InsertNextPoint(v0[0],v0[1],v0[2]);
      front[2]=vPoints->InsertNextPoint(v1[0],v1[1],v1[2]);
      front[1]=vPoints->InsertNextPoint(v2[0],v2[1],v2[2]);
      front[0]=vPoints->InsertNextPoint(v3[0],v3[1],v3[2]);
      polys->InsertNextCell( (vtkIdType) 4, front );
      if(i==1)
      {
        a_firstID=front[3]; b_firstID=front[2]; //continue;
      }
    }

    ++slit; ++scit; if(scit==scend) scit=sc.begin();
  }
  front[3]=front[0];
  front[2]=front[1];
  front[1]=b_firstID;
  front[0]=a_firstID;
  polys->InsertNextCell( 4, front );
}
void mitk::PolygonToRingFilter::GenerateData (  ) [virtual]

Definition at line 64 of file mitkPolygonToRingFilter.cpp.

References QuadProgPP::t().

{
  mitk::Mesh::ConstPointer input  = this->GetInput();
  mitk::Surface::Pointer output = this->GetOutput();

  unsigned int t;
  for ( t = 0; t < input->GetPointSetSeriesSize(); ++t )
  {

    vtkPolyData *polyData = vtkPolyData::New();
    vtkPoints *vPoints = vtkPoints::New();
    vtkCellArray *polys = vtkCellArray::New();

    mitk::Mesh::PointType thisPoint;

    // iterate through all cells and build tubes
    Mesh::ConstCellIterator cellIt, cellEnd;
    cellEnd = input->GetMesh( t )->GetCells()->End();
    for ( cellIt = input->GetMesh( t )->GetCells()->Begin();
          cellIt != cellEnd; 
          ++cellIt )
    {
      m_PointList.clear();
      m_VectorList.clear();

      this->BuildPointAndVectorList(
        *cellIt->Value(), m_PointList, m_VectorList, t );
      this->BuildVtkTube( vPoints, polys, m_PointList, m_VectorList );
    }

    polyData->SetPoints( vPoints );
    vPoints->Delete();
    polyData->SetPolys( polys );
    polys->Delete();

    output->SetVtkPolyData( polyData, t );
    polyData->Delete();
  
  }

}
void mitk::PolygonToRingFilter::GenerateOutputInformation ( void   ) [virtual]

Definition at line 50 of file mitkPolygonToRingFilter.cpp.

{
  mitk::Mesh::ConstPointer input  = this->GetInput();
  mitk::Surface::Pointer output = this->GetOutput();

  itkDebugMacro(<<"GenerateOutputInformation()");

  if(input.IsNull()) return;

  output->SetGeometry(static_cast<Geometry3D*>(input->GetGeometry()->Clone().GetPointer()));

  output->Expand( input->GetPointSetSeriesSize() );
}
virtual const char* mitk::PolygonToRingFilter::GetClassName (  ) const [virtual]
const mitk::Mesh * mitk::PolygonToRingFilter::GetInput ( void   )

Definition at line 326 of file mitkPolygonToRingFilter.cpp.

{
  if (this->GetNumberOfInputs() < 1)
  {
    return 0;
  }

  return static_cast<const mitk::Mesh * >
    (this->ProcessObject::GetInput(0) );
}
virtual float mitk::PolygonToRingFilter::GetRingRadius (  ) [virtual]

Get ring radius.

virtual unsigned int mitk::PolygonToRingFilter::GetRingResolution (  ) [virtual]

Get ring resolution of created Surface.

virtual unsigned int mitk::PolygonToRingFilter::GetSplineResolution (  ) [virtual]

Get spline resolution.

static Pointer mitk::PolygonToRingFilter::New (  ) [static]

Reimplemented from mitk::SurfaceSource.

Referenced by PolygonToRingFilter().

void mitk::PolygonToRingFilter::SetInput ( const mitk::Mesh image ) [virtual]

Definition at line 337 of file mitkPolygonToRingFilter.cpp.

{
  // Process object is not const-correct so the const_cast is required here
  this->ProcessObject::SetNthInput(0, 
    const_cast< mitk::Mesh * >( input ) );
}
virtual void mitk::PolygonToRingFilter::SetRingRadius ( float  _arg ) [virtual]
virtual void mitk::PolygonToRingFilter::SetRingResolution ( unsigned int  _arg ) [virtual]

Set ring resolution of created Surface.

virtual void mitk::PolygonToRingFilter::SetSplineResolution ( unsigned int  _arg ) [virtual]

Set spline resolution.


Member Data Documentation

Definition at line 98 of file mitkPolygonToRingFilter.h.

Ring radius.

Definition at line 88 of file mitkPolygonToRingFilter.h.

Ring resolution of created Surface.

Definition at line 91 of file mitkPolygonToRingFilter.h.

Spline resolution of created Surface.

Definition at line 94 of file mitkPolygonToRingFilter.h.

vtkCardinalSpline* mitk::PolygonToRingFilter::m_SplineX [protected]

Definition at line 96 of file mitkPolygonToRingFilter.h.

Referenced by PolygonToRingFilter().

vtkCardinalSpline * mitk::PolygonToRingFilter::m_SplineY [protected]

Definition at line 96 of file mitkPolygonToRingFilter.h.

Referenced by PolygonToRingFilter().

vtkCardinalSpline * mitk::PolygonToRingFilter::m_SplineZ [protected]

Definition at line 96 of file mitkPolygonToRingFilter.h.

Referenced by PolygonToRingFilter().

Definition at line 99 of file mitkPolygonToRingFilter.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines