]> Creatis software - creaMaracasVisu.git/commitdiff
#3058 creaMaracasVisu Feature New Normal - optimizing of manualContourView of a...
authorEduardo DAVILA <davila@localhost.localdomain>
Thu, 19 Jan 2017 14:09:12 +0000 (15:09 +0100)
committerEduardo DAVILA <davila@localhost.localdomain>
Thu, 19 Jan 2017 14:09:12 +0000 (15:09 +0100)
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualBaseModel.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.h
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp

index 1d55f5a2672c7b0a4b2af45d5f5b49597603f998..06d7f330374a88f974fd0cad4e22e5c5a591e04f 100644 (file)
@@ -28,7 +28,7 @@
 // ----------------------------------------------------------------------------
 manualBaseModel::manualBaseModel()
 {
-
+//EED2017
        _sizePointsContour      = 100;                  //JSTG 25-02-08 The change in the inisialization of these variable is critical.
 
 }
@@ -37,7 +37,8 @@ manualBaseModel::manualBaseModel()
 manualBaseModel::~manualBaseModel()
 {
        int i,size=_lstPoints.size();
-       for (i=0;i<size; i++){
+       for (i=0;i<size; i++)
+       {
                delete _lstPoints[i];
        }
        _lstPoints.clear();
index 1e765740c51f3cc035f42b6b24d34d0fb312e66b..91f1c1bb14a24c7f80c6167217f5a82daa53a6a8 100644 (file)
@@ -113,7 +113,9 @@ void manualViewBaseContour :: AddCompleteContourActor(  bool ifControlPoints )
 
         //Adding each control point
         if( ifControlPoints )
+        {
                AddControlPoints();
+        }
         RefreshContour();
         Refresh();
 }
@@ -275,7 +277,8 @@ void manualViewBaseContour::ConstructVTKObjects()
        DeleteVtkObjects();
        _pts = vtkPoints::New();
        _pts->SetNumberOfPoints(nps);
-       for (i=0 ; i<nps ; i++){
+       for (i=0 ; i<nps ; i++)
+       {
                _pts->SetPoint(i,       0       , 0     , 0 );
        }
        // This is for the boundaring inicialisation
@@ -286,15 +289,25 @@ void manualViewBaseContour::ConstructVTKObjects()
        _pts->SetPoint(0,       -1000   , -1000 , -1000 );
        _pts->SetPoint(1,       1000    , 1000  , 1000  );
 
-       vtkCellArray *lines = vtkCellArray::New();
-       lines->InsertNextCell( nps /* +1 */ );
-       for ( i=0 ; i<nps+1 ; i++ ){
-               lines->InsertCellPoint(i % nps );
+       // This is the structure for the spline
+       _splineCell = vtkCellArray::New();
+       _splineCell->InsertNextCell( nps /* +1 */ );
+       for ( i=0 ; i<nps+1 ; i++ )
+       {
+               _splineCell->InsertCellPoint(i % nps );
        }
+
+       // This is the structure for the spline justo to points (line)
+       // This will be use in the refresh part, in case the spline have only 2 points
+       _lineCell = vtkCellArray::New();
+       _lineCell->InsertNextCell(2);
+       _lineCell->InsertCellPoint(0);
+       _lineCell->InsertCellPoint(1);
+
        _pd = vtkPolyData::New();
        _pd->SetPoints( _pts );
-       _pd->SetLines( lines );
-       lines->Delete();  //do not delete lines ??
+       _pd->SetLines( _splineCell );
+       // lines->Delete();  //do not delete lines ??
 
        _contourVtkActor        =       vtkActor::New();
     _bboxMapper                        =       vtkPolyDataMapper::New();
@@ -312,6 +325,16 @@ void manualViewBaseContour::ConstructVTKObjects()
        InitTextActor();
 }
 
+void manualViewBaseContour::SetCellArray(bool type)
+{
+       if (type==true)
+       {
+               _pd->SetLines( _splineCell );
+       } else {
+               _pd->SetLines( _lineCell );
+       }// if type
+}
+
 // ----------------------------------------------------------------------------
 void manualViewBaseContour::InitTextActor()
 {
@@ -653,7 +676,8 @@ double* manualViewBaseContour::GetVectorPointsZManualContour()
 // ----------------------------------------------------------------------------
 void manualViewBaseContour::Refresh() // virtual
 {
-       if (_contourVtkActor!=NULL){
+       if (_contourVtkActor!=NULL)
+       {
                RefreshContour();
        }
        int i,size=_lstViewPoints.size();
index d773a7e3b9e4c63acf57ea4613dad1fa50c05c42..1120152be15da3656d7f4ad19ecc2c2d666279c8 100644 (file)
@@ -130,7 +130,7 @@ public:
 
        virtual void    Refresh();
        int             GetNumberOfPoints();                                            // ??? 
-       //int           GetNumberOfPointsSpline();                              //JSTG 25-02-08 In ContourModel is the same method 
+       //int   GetNumberOfPointsSpline();                                      //JSTG 25-02-08 In ContourModel is the same method 
        //void  SetNumberOfPointsSpline(int size);                      //JSTG 25-02-08 In ContourModel is the same method 
 
        void    CreateNewContour();
@@ -142,7 +142,7 @@ public:
        void    UpdateColorActor();
 
        void    SetRange(double range);
-       double          GetRange();
+       double  GetRange();
        void    SetZ(int z);
        int             GetZ();
 
@@ -189,15 +189,18 @@ public:
 
        virtual void                    ConstructVTKObjects();
 
+       void SetCellArray(bool type);
 //---------------------------------------------------
 // PRIVATE METHODS & ATTS
 //---------------------------------------------------
 
 private:
 
-       vtkPolyData                                             *_pd;
-       vtkActor                                                *_contourVtkActor;
-       vtkPolyDataMapper                               *_bboxMapper;
+       vtkPolyData                                                     *_pd;
+       vtkCellArray                                            *_splineCell;
+       vtkCellArray                                            *_lineCell;
+       vtkActor                                                        *_contourVtkActor;
+       vtkPolyDataMapper                                       *_bboxMapper;
 
        void                    DeleteVtkObjects();
        
@@ -208,46 +211,46 @@ private:
 
 protected:
 
-       double                                  _range;
+       double                                                          _range;
 
-       double                                  _coulorEdit_r;
-       double                                  _coulorEdit_g;
-       double                                  _coulorEdit_b;
-       double                                  _coulorNormal_r;
-       double                                  _coulorNormal_g;
-       double                                  _coulorNormal_b;
-       double                                  _coulorSelection_r;
-       double                                  _coulorSelection_g;
-       double                                  _coulorSelection_b;
-       double                                  _widthline;
+       double                                                          _coulorEdit_r;
+       double                                                          _coulorEdit_g;
+       double                                                          _coulorEdit_b;
+       double                                                          _coulorNormal_r;
+       double                                                          _coulorNormal_g;
+       double                                                          _coulorNormal_b;
+       double                                                          _coulorSelection_r;
+       double                                                          _coulorSelection_g;
+       double                                                          _coulorSelection_b;
+       double                                                          _widthline;
 
        //
        // Reference to VTKBaseView
        //
-       wxVtkBaseView                           *_wxvtkbaseview;
+       wxVtkBaseView                                           *_wxvtkbaseview;
 
        //
        // Is the contour selected
        //
-       bool                                    _selected;
-       bool                                    *_editable;
-       bool                                    _posibleSelected;
-       bool                                    _viewControlPoints;
+       bool                                                            _selected;
+       bool                                                            *_editable;
+       bool                                                            _posibleSelected;
+       bool                                                            _viewControlPoints;
 
        // text
-       bool                                    _show_text;
-       int                                     _id_viewPoint_for_text;
-       vtkTextActor                            *_textActor;
-       vtkTextActor                            *_textActor2;
+       bool                                                            _show_text;
+       int                                                                     _id_viewPoint_for_text;
+       vtkTextActor                                            *_textActor;
+       vtkTextActor                                            *_textActor2;
 
        //
        // Contour model
        //
-       manualBaseModel                         *_manContModel;
+       manualBaseModel                                         *_manContModel;
 
-       vtkPoints                               *_pts;
+       vtkPoints                                                       *_pts;
 // JSTG 25-02-08 --------------------------------------------
-       int                                     _sizePointsContour;
+       int                                                                     _sizePointsContour;
 //-----------------------------------------------------------
 
        //
@@ -258,7 +261,7 @@ protected:
        //
        // Spacing
        //
-       double                                  _spc[3];
+       double                                                          _spc[3];
 
        virtual void    RefreshText();
 
index 0006b13e0265b3cec358d16ff652f0a7580777a1..6119fcd00be7850ceee4692522f8a952f19229e6 100644 (file)
@@ -97,52 +97,82 @@ void manualViewContour::RefreshContour() // virtual
        double xx,yy,zz;
 //----------------------------------
 
-       _manContModel->UpdateSpline();
     np = GetNumberOfPoints( );
-       //nps = GetNumberOfPointsSpline();
-    nps = _manContModel->GetNumberOfPointsSpline();
-       //delta=( double ) ( np  ) / ( double ) ( nps-1  );             //JSTG 25-02-08
-
-       //EED 27 Juin 2012
-    //Boundaring box   
-       _minX=99999;
-       _minY=99999;
-       _maxX=-99999;
-       _maxY=-99999;
-       
-       if ( _pts!=NULL )
+
+       if (np==2) 
        {
-               if (np>=2  )
+               SetCellArray(false);
+               manualPoint *mpA = _manContModel->GetManualPoint(0);
+               manualPoint *mpB = _manContModel->GetManualPoint(1);            
+               if ( _pts!=NULL )
+               {
+                       xx=mpA->GetX() * _spc[0];
+                       yy=mpA->GetY() * _spc[1];
+                       zz=mpA->GetZ() * _spc[2];
+                       _minX=xx;
+                       _minY=yy;
+                       _maxX=xx;
+                       _maxY=yy;
+                       _pts->SetPoint(0 , xx , yy , zz  );
+                       xx=mpB->GetX() * _spc[0];
+                       yy=mpB->GetY() * _spc[1];
+                       zz=mpB->GetZ() * _spc[2];
+                       if (xx<_minX) _minX=xx;
+                       if (yy<_minY) _minY=yy;
+                       if (xx>_maxX) _maxX=xx;
+                       if (yy>_maxY) _maxY=yy;
+                       _pts->SetPoint(1 , xx , yy , zz  );
+               } // if _pts!=NULL
+       } else {
+               SetCellArray(true);
+               _manContModel->UpdateSpline();
+               //nps = GetNumberOfPointsSpline();
+               nps = _manContModel->GetNumberOfPointsSpline();
+               //delta=( double ) ( np  ) / ( double ) ( nps-1  );             //JSTG 25-02-08
+
+               //EED 27 Juin 2012
+               //Boundaring box        
+               _minX=99999;
+               _minY=99999;
+               _maxX=-99999;
+               _maxY=-99999;
+               if ( _pts!=NULL )
                {
-                       for( i = 0; i < nps; i++ )
+                       if (np>=2  )
                        {
-//JSTG 25-02-08 ------------------------------------------------
-                               //t = delta * (double)i;
-                               //_manContModel->GetSplinePoint(t,x,y,z);
-                               _manContModel->GetSpline_i_Point(i,&x,&y,&z);
-//--------------------------------------------------------------
-       // EED 27 sep 2006
-       //                      _pts->SetPoint(i, x,y,z );
-                               xx=x*_spc[0];
-                               yy=y*_spc[1];
-                               zz=z*_spc[2];
-                               _pts->SetPoint(i,xx,yy,zz );
-
-                //EED 27 Juin 2012
-                               //Boundaring box
-                               if (xx < _minX) { _minX = xx; }
-                               if (yy < _minY) { _minY = yy; }
-                               if (xx > _maxX) { _maxX = xx; }
-                               if (yy > _maxY) { _maxY = yy; }
+                               for( i = 0; i < nps; i++ )
+                               {
+       //JSTG 25-02-08 ------------------------------------------------
+                                       //t = delta * (double)i;
+                                       //_manContModel->GetSplinePoint(t,x,y,z);
+                                       _manContModel->GetSpline_i_Point(i,&x,&y,&z);
+       //--------------------------------------------------------------
+               // EED 27 sep 2006
+               //                      _pts->SetPoint(i, x,y,z );
+                                       xx=x*_spc[0];
+                                       yy=y*_spc[1];
+                                       zz=z*_spc[2];
+                                       _pts->SetPoint(i,xx,yy,zz );
+
+                           //EED 27 Juin 2012
+                                       //Boundaring box
+                                       if (xx < _minX) { _minX = xx; }
+                                       if (yy < _minY) { _minY = yy; }
+                                       if (xx > _maxX) { _maxX = xx; }
+                                       if (yy > _maxY) { _maxY = yy; }
                                
-                       }// for
-               }
-               else
-               {
-                               _pts->SetPoint(0, 0 , 0 , 0);
-                               _pts->SetPoint(1, 0 , 0 , 0);
-               } // if
-       }
+                               }// for
+                       }else{
+                                       _pts->SetPoint(0, 0 , 0 , 0);
+                                       _pts->SetPoint(1, 0 , 0 , 0);
+                       } // if
+               } // _pts!=NULL
+       } //np==2
+
+       _minX=_minX-1.0;
+       _minY=_minY-1.0;
+       _maxX=_maxX+1.0;
+       _maxY=_maxY+1.0;
 }
 
 // ----------------------------------------------------------------------------
@@ -257,6 +287,7 @@ void manualViewContour::RefreshText()  // virtual
 bool manualViewContour::ifTouchContour(int x,int y,int z)
 {
        bool result=false;
+
        double xx=x;
        double yy=y;
        double zz=z;
@@ -272,33 +303,70 @@ bool manualViewContour::ifTouchContour(int x,int y,int z)
 
        if ( (xx>=_minX) &&  (yy>=_minY) && (xx<=_maxX) && (yy<=_maxY)) {  // inside the boundaring box
        
-               unsigned int i, nps,nps_t;
-               nps       = _sizePointsContour;
-       
-               if (this->_manContModel->IfCloseContour()==true)
-               {
-                       nps_t = nps;
-               } else {
-               nps_t = nps-1;
-               } // if close
-
-printf("EED  Warning manualViewContour::ifTouchContour \n");
 
-               for( i = 0; i < nps_t; i++ ) 
+               if (_manContModel->GetSizeLstPoints()==2)
                {
-                       _pts->GetPoint(i%nps, ppA);
-                       _pts->GetPoint((i+1)%nps, ppB);
-                       d1 = sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
-                       d2 = sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
-                       d3 = sqrt( (ppB[0]-ppA[0])*(ppB[0]-ppA[0]) + (ppB[1]-ppA[1])*(ppB[1]-ppA[1]) + (ppB[2]-ppA[2])*(ppB[2]-ppA[2]));
-
-                       if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) 
+                       manualPoint *mpA = _manContModel->GetManualPoint(0);
+                       manualPoint *mpB = _manContModel->GetManualPoint(1);
+                       _pts->GetPoint(0, ppA);
+                       double dirVec[3];
+
+                       // direction of the segment
+            dirVec[0] = mpB->GetX() - mpA->GetX();                     
+            dirVec[1] = mpB->GetY() - mpA->GetY();                     
+            dirVec[2] = mpB->GetZ() - mpA->GetZ();                     
+
+
+                       // proj = mpA + k*dirVec
+                       double num;
+                       double den = 0.0 ;
+                       num     =       dirVec[0]*( xx-mpA->GetX() );
+                       num     =       num + dirVec[1]*( yy-mpA->GetY() );
+                       num     =       num + dirVec[2]*( zz-mpA->GetZ() );
+                       den=dirVec[0]*dirVec[0] + dirVec[1]*dirVec[1] + dirVec[2]*dirVec[2];
+                       double k;
+                       if (den!=0) 
                        {
+                               k=num/den;
+                       } else {
+                               k=99999999;
+                       }
+                       // projection of th point xx,yy,zz  in segment mpA,mpB
+                       double projX = mpA->GetX() + k*dirVec[0];
+                       double projY = mpA->GetY() + k*dirVec[1];
+                       double projZ = mpA->GetZ() + k*dirVec[2];
+
+                       // distance [projX,projY,projZ]   and   (xx,yy,zz]
+                       double d1= sqrt(  (projX-xx)*(projX-xx) + (projY-yy)*(projY-yy) +(projZ-zz)*(projZ-zz) );
+                       if (d1<=1)
+                       { 
                                result=true;
-                               i=nps;
-                       } // if
-               } // for i
+                       } // if d1
+               } else{
+                       unsigned int i, nps,nps_t;
+                       nps       = _sizePointsContour;
+                       if (this->_manContModel->IfCloseContour()==true)
+                       {
+                               nps_t = nps;
+                       } else {
+                       nps_t = nps-1;
+                       } // if close
+                       for( i = 0; i < nps_t; i++ ) 
+                       {
+                               _pts->GetPoint(i%nps, ppA);
+                               _pts->GetPoint((i+1)%nps, ppB);
+                               d1 = sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
+                               d2 = sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
+                               d3 = sqrt( (ppB[0]-ppA[0])*(ppB[0]-ppA[0]) + (ppB[1]-ppA[1])*(ppB[1]-ppA[1]) + (ppB[2]-ppA[2])*(ppB[2]-ppA[2]));
+                               if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) 
+                               {
+                                       result=true;
+                                       i=nps;
+                               } // if
+                       } // for i
+               } // if GetSizeLstPoints()==2
        } // if min max
+
        return result;
 }