From: Eduardo DAVILA Date: Thu, 19 Jan 2017 14:09:12 +0000 (+0100) Subject: #3058 creaMaracasVisu Feature New Normal - optimizing of manualContourView of a... X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=creaMaracasVisu.git;a=commitdiff_plain;h=c7ed224abb3d3ea251339303f03e8c170d562115 #3058 creaMaracasVisu Feature New Normal - optimizing of manualContourView of a spline of 2 control points --- diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualBaseModel.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualBaseModel.cpp index 1d55f5a..06d7f33 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualBaseModel.cpp +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualBaseModel.cpp @@ -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;iSetNumberOfPoints(nps); - for (i=0 ; iSetPoint(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 ; iInsertCellPoint(i % nps ); + // This is the structure for the spline + _splineCell = vtkCellArray::New(); + _splineCell->InsertNextCell( nps /* +1 */ ); + for ( i=0 ; iInsertCellPoint(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(); diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.h index d773a7e..1120152 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.h +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewBaseContour.h @@ -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(); diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp index 0006b13..6119fcd 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp @@ -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; }