#include <cpPlugins/DataObjects/Image.h>
#include <cpPlugins/DataObjects/Mesh.h>
#include <cpExtensions/Visualization/WindowLevelImageActor.h>
+#include <cpPlugins_BaseObjects.h>
#include <vtkImageData.h>
#include <vtkRenderer.h>
#include <vtkSplineWidget.h>
+#include <vtkParametricSpline.h>
// -------------------------------------------------------------------------
void cpPluginsWidgets::SplineWidget::
this->m_Contour->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) );
this->m_Contour->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) );
this->GetOutput( "Output" )->SetVTK( this->m_Contour );
+
+ this->m_Parameters.ConfigureAsBool( "Extend" );
+ this->m_Parameters.SetBool( "Extend", false );
}
// -------------------------------------------------------------------------
auto wdg = this->_CreateVTK< vtkSplineWidget >( );
if( this->m_Configured )
{
- wdg->GetPolyData( this->m_Contour.GetPointer( ) );
+ if( this->m_Parameters.GetBool( "Extend" ) )
+ {
+ wdg->GetPolyData( this->m_Contour.GetPointer( ) );
+
+ typedef itk::Vector< double, 3 > _TVector;
+ typedef std::vector< _TVector > _TVectors;
+
+ unsigned long nPoints = this->m_Contour->GetNumberOfPoints( );
+ unsigned long support = nPoints / 10;
+ _TVectors pp, qp;
+ for( unsigned long i = 0; i < support; ++i )
+ {
+ double p[ 3 ], q[ 3 ];
+ this->m_Contour->GetPoint( i, p );
+ this->m_Contour->GetPoint( nPoints - 1 - i, q );
+
+ _TVector pv, qv;
+ pv[ 0 ] = p[ 0 ];
+ pv[ 1 ] = p[ 1 ];
+ pv[ 2 ] = p[ 2 ];
+ qv[ 0 ] = q[ 0 ];
+ qv[ 1 ] = q[ 1 ];
+ qv[ 2 ] = q[ 2 ];
+ pp.push_back( pv );
+ qp.push_back( qv );
+
+ } // rof
+
+ _TVectors pt, qt;
+ pt.push_back( pp[ 1 ] - pp[ 0 ] );
+ qt.push_back( qp[ 1 ] - qp[ 0 ] );
+ for( unsigned long i = 1; i < support - 1; ++i )
+ {
+ pt.push_back( pp[ i + 1 ] - pp[ i - 1 ] );
+ qt.push_back( qp[ i + 1 ] - qp[ i - 1 ] );
+
+ } // rof
+ pt.push_back( pp[ support - 1 ] - pp[ support - 2 ] );
+ qt.push_back( qp[ support - 1 ] - qp[ support - 2 ] );
+
+ _TVector t0( double( 0 ) ), t1( double( 0 ) );
+ long real0 = 0, real1 = 0;
+ for( unsigned long i = 0; i < support; ++i )
+ {
+ double n0 = pt[ i ].GetNorm( );
+ if( n0 > double( 0 ) )
+ {
+ t0 += pt[ i ] / n0;
+ real0++;
+
+ } // fi
+
+ double n1 = qt[ i ].GetNorm( );
+ if( n1 > double( 0 ) )
+ {
+ t1 += qt[ i ] / n1;
+ real1++;
+
+ } // fi
+
+ } // rof
+
+ if( real0 > 0 )
+ t0 /= double( -real0 );
+ if( real1 > 0 )
+ t1 /= double( -real1 );
+
+ t0 *= ( pp[ 0 ] - qp[ 0 ] ).GetNorm( );
+ t1 *= ( pp[ 0 ] - qp[ 0 ] ).GetNorm( );
+
+ _TVector p0 = pp[ 0 ] + t0;
+ _TVector p1 = qp[ 0 ] + t1;
+
+ vtkSmartPointer< vtkPolyData > cnt = this->m_Contour;
+ this->m_Contour = vtkSmartPointer< vtkPolyData >::New( );
+ this->m_Contour->SetPoints( vtkSmartPointer< vtkPoints >::New( ) );
+ this->m_Contour->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) );
+ this->m_Contour->SetLines( vtkSmartPointer< vtkCellArray >::New( ) );
+ this->m_Contour->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) );
+ this->m_Contour->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) );
+ this->GetOutput( "Output" )->SetVTK( this->m_Contour );
+
+ this->m_Contour->GetPoints( )->
+ InsertNextPoint( p0[ 0 ], p0[ 1 ], p0[ 2 ] );
+ for( unsigned long i = 0; i < nPoints; ++i )
+ {
+ double p[ 3 ];
+ cnt->GetPoints( )->GetPoint( i, p );
+ this->m_Contour->GetPoints( )->InsertNextPoint( p );
+
+ } // rof
+ this->m_Contour->GetPoints( )->
+ InsertNextPoint( p1[ 0 ], p1[ 1 ], p1[ 2 ] );
+ this->m_Contour->Modified( );
+ }
+ else
+ wdg->GetPolyData( this->m_Contour.GetPointer( ) );
}
else
{