From 7191481dd157b8e1c62b3382a29901ee878757d8 Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Mon, 17 Oct 2016 23:20:49 -0500 Subject: [PATCH] ... --- plugins/Widgets/SplineWidget.cxx | 103 ++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/plugins/Widgets/SplineWidget.cxx b/plugins/Widgets/SplineWidget.cxx index a1b1538..527138c 100644 --- a/plugins/Widgets/SplineWidget.cxx +++ b/plugins/Widgets/SplineWidget.cxx @@ -2,10 +2,12 @@ #include #include #include +#include #include #include #include +#include // ------------------------------------------------------------------------- void cpPluginsWidgets::SplineWidget:: @@ -58,6 +60,9 @@ 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 ); } // ------------------------------------------------------------------------- @@ -81,7 +86,103 @@ _GenerateData( ) 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 { -- 2.45.0