//Adding each control point
if( ifControlPoints )
+ {
AddControlPoints();
+ }
RefreshContour();
Refresh();
}
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
_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();
InitTextActor();
}
+void manualViewBaseContour::SetCellArray(bool type)
+{
+ if (type==true)
+ {
+ _pd->SetLines( _splineCell );
+ } else {
+ _pd->SetLines( _lineCell );
+ }// if type
+}
+
// ----------------------------------------------------------------------------
void manualViewBaseContour::InitTextActor()
{
// ----------------------------------------------------------------------------
void manualViewBaseContour::Refresh() // virtual
{
- if (_contourVtkActor!=NULL){
+ if (_contourVtkActor!=NULL)
+ {
RefreshContour();
}
int i,size=_lstViewPoints.size();
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();
void UpdateColorActor();
void SetRange(double range);
- double GetRange();
+ double GetRange();
void SetZ(int z);
int GetZ();
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();
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;
//-----------------------------------------------------------
//
//
// Spacing
//
- double _spc[3];
+ double _spc[3];
virtual void RefreshText();
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;
}
// ----------------------------------------------------------------------------
bool manualViewContour::ifTouchContour(int x,int y,int z)
{
bool result=false;
+
double xx=x;
double yy=y;
double zz=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;
}