From 1b277d14d9ea0ebab60b44bbab2e0e18ed89db6b Mon Sep 17 00:00:00 2001 From: Ricardo Corredor Date: Thu, 26 Nov 2009 01:26:57 +0000 Subject: [PATCH] RaC Changes that includes a Polygon contour in creaMaracasVisu. It includes changes in ContourExtractData class, which evaluates the points inside a contour. --- .../wxWindows/Contour/ContourExtractData.cxx | 461 ++++++++++-------- .../wxWindows/Contour/ContourExtractData.h | 16 +- .../manualContourBaseControler.cpp | 1 + .../manualContour/manualContourModel.h | 2 +- .../manualContourModelPolygon.cpp | 69 +++ .../manualContour/manualContourModelPolygon.h | 20 + 6 files changed, 352 insertions(+), 217 deletions(-) create mode 100644 lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.cpp create mode 100644 lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.h diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx index 10e0415..5c5f0d3 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx @@ -4,57 +4,62 @@ //---------------------------------------------------------------------- ContourExtractData::ContourExtractData( bool okImagesResults) - { - this->imagedata = NULL; +{ + this->imagedata = NULL; imagedataValueResult = NULL; imagedataMaskResult = NULL; this->okImagesResults = okImagesResults; _typeOperation = 0; - } +} - // ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ - ContourExtractData::~ContourExtractData() - { - } +ContourExtractData::~ContourExtractData() +{ +} //---------------------------------------------------------------------- void ContourExtractData::SetImage( vtkImageData* imagedata) - { +{ this->imagedata = imagedata; - + + // RaC 20-11-09 Changes in InitLstContoursLinesYPoints + int ext[6]; + this->imagedata->GetWholeExtent(ext); + _sizeImageY = ext[3]-ext[2]+1; + // init vtk image result : valuesImage maskImage if (this->okImagesResults==true){ InitVtkImagesResult(); } - } +} //---------------------------------------------------------------------- void ContourExtractData::SetZtoBeAnalys( int z ) - { +{ this->zImage = z; - } +} //------------------------------------------------------------------------ - void ContourExtractData::SetLstManualContourModel( std::vector lstManConMod) - { - this->lstManConMod = lstManConMod; - } +void ContourExtractData::SetLstManualContourModel( std::vector lstManConMod) +{ + this->lstManConMod = lstManConMod; +} //------------------------------------------------------------------------ void ContourExtractData::GetMinMaxPoint(int *minPoint, - int *maxPoint, - manualBaseModel *manualcontourmodel - ) + int *maxPoint, + manualBaseModel *manualcontourmodel + ) { int i; //int np = manualcontourmodel->GetSizeLstPoints( ); // number of control points // JPRx - -// JSTG 26-02-08 --------------------------------------------------------------------------------------- + + // JSTG 26-02-08 --------------------------------------------------------------------------------------- //int nps = manualviewbaseecontour->GetNumberOfPointsSpline(); // number of points in the spline int nps = manualcontourmodel->GetNumberOfPointsSpline(); // number of points in the spline -//------------------------------------------------------------------------------------------------------ - -// JSTG 26-02-08 --------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------ + + // JSTG 26-02-08 --------------------------------------------------------------------------------------- //double x,y,z,t; double x,y,z; //double delta=( double ) ( np ) / ( double ) ( nps ); @@ -73,13 +78,13 @@ void ContourExtractData::GetMinMaxPoint(int *minPoint, minPoint[1]--; maxPoint[0]++; maxPoint[1]++; -//------------------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------------------ } //------------------------------------------------------------------------ void ContourExtractData::GetMinMaxPoint_Of_LstManConMod( int *minPoint, - int *maxPoint - ) + int *maxPoint + ) { int i,size = lstManConMod.size(); @@ -98,8 +103,10 @@ int ContourExtractData::AnalisisContourInsideV2(int x, int y, int iContour ) int result = 0; int i; + //cout<<"RaC ContourExtractData::AnalisisContourInsideV2-iContour:"<=yy1)&&(yy<=yy2) ) { @@ -133,7 +140,7 @@ int ContourExtractData::AnalisisContourInsideV2(int x, int y, int iContour ) d = ( fabs(xx2-xx1)*(yy-yy1) ) / (yy2-yy1) ; if ( (xx1<=xx2)&&(x<(xx1+d)) ) { result++; } if ( (xx1>xx2)&&(x<(xx1-d)) ) { result++; } - + if ( (yy2-yy1)/difxx2xx1 >= 1.0) { if (xx1<=xx2) @@ -146,8 +153,8 @@ int ContourExtractData::AnalisisContourInsideV2(int x, int y, int iContour ) } } } // if point inside y - - + + // Finding border looking in vertical direction if ( ((xx1<=xx2)&&(xx>=xx1)&&(xxxx2)&&(xx>=xx2)&&(xx=x1) && (x<=x2)) { inBorder=true; } if ( ((int)y1==(int)y2) && ((int)y1==y) && (x2=x2) && (x<=x1)) { inBorder=true; } - + if (inBorder==true){ i=nps; } } // for i - + if (inBorder==true) { result=1; } - + return result; } //------------------------------------------------------------------------ +// typeOperation=0 AND +// typeOperation=1 OR +// typeOperation=2 XOR bool ContourExtractData::isInside(int x, int y, int typeOperation) { bool result = false; @@ -188,88 +198,90 @@ bool ContourExtractData::isInside(int x, int y, int typeOperation) int i,size = this->lstManConMod.size(); int numberInside = 0; + /* RaC 20-11-09 (C1) Changes to use the method without the image. int ext[6]; imagedata->GetExtent(ext); if ((x>=0) && (x<=ext[1]) && (y>=0) && (y<=ext[3])) { + */ - if (typeOperation==0) // AND Intersection + if (typeOperation==0) // AND Intersection + { + for (i=0;iGetTypeModel()==7) { - // To process the statistics of the Points contour the procedure is different - // RaC 19-09-09 - manualBaseModel *mbm = lstManConMod[i]; - if(mbm->GetTypeModel()==7) - { - if(mbm->IsPoint(x,y)==true) - { - numberLeft=1; - } - }//if - else + if(mbm->IsPoint(x,y)==true) { - numberLeft = AnalisisContourInsideV2(x,y, i ); - }//else + numberLeft=1; + } + }//if + else + { + numberLeft = AnalisisContourInsideV2(x,y, i ); + }//else - if ( (numberLeft % 2) ==1){ numberInside++; } - } - if ( numberInside == (size) ){ result=true; } - } // AND Intersection + if ( (numberLeft % 2) ==1){ numberInside++; } + } + if ( numberInside == (size) ){ result=true; } + } // AND Intersection - numberLeft=0; + numberLeft=0; - if (typeOperation==1) // OR All + if (typeOperation==1) // OR All + { + for (i=0;iGetTypeModel()==7) { - // To process the statistics of the Points contour the procedure is different - // RaC 19-09-09 - manualBaseModel *mbm = lstManConMod[i]; - if(mbm->GetTypeModel()==7) - { - if(mbm->IsPoint(x,y)==true) - { - numberLeft=1; - } - }//if - else + if(mbm->IsPoint(x,y)==true) { - numberLeft = AnalisisContourInsideV2(x,y, i ); - }//else - if ( (numberLeft % 2) ==1){ result=true; } - } - } // OR All + numberLeft=1; + } + }//if + else + { + numberLeft = AnalisisContourInsideV2(x,y, i ); + }//else + if ( (numberLeft % 2) ==1){ result=true; } + } + } // OR All - numberLeft=0; + numberLeft=0; - if (typeOperation==2) // XOR crown + if (typeOperation==2) // XOR crown + { + for (i=0;iGetTypeModel()==7) { - // To process the statistics of the Points contour the procedure is different - // RaC 19-09-09 - manualBaseModel *mbm = lstManConMod[i]; - if(mbm->GetTypeModel()==7) + if(mbm->IsPoint(x,y)==true) { - if(mbm->IsPoint(x,y)==true) - { - numberLeft=1; - } - }//if - else - { - numberLeft = numberLeft + AnalisisContourInsideV2(x,y, i ); - }//else - - } - if ( numberLeft % 2 ==1){ result = true; } - }// XOR crown + numberLeft=1; + } + }//if + else + { + numberLeft = numberLeft + AnalisisContourInsideV2(x,y, i ); + }//else + } + if ( numberLeft % 2 ==1){ result = true; } + }// XOR crown - } + + //RaC } return result; } @@ -278,10 +290,10 @@ bool ContourExtractData::isInside(int x, int y, int typeOperation) double ContourExtractData::GetDataValue(int x, int y, int z) { -// wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview; -// int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ(); + // wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview; + // int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ(); //JSTG 13-03-08----- -//EED OJO avec JS _zz = z; + //EED OJO avec JS _zz = z; //------------------ double result; void *p; @@ -367,7 +379,7 @@ void ContourExtractData::ResetImageResult(int z) unsigned short *pMask; pValue = (unsigned short *)imagedataValueResult->GetScalarPointer(0,0,z); pMask = (unsigned short *)imagedataMaskResult->GetScalarPointer(0,0,z); - + int ext[6]; imagedataValueResult->GetExtent(ext); @@ -397,16 +409,26 @@ void ContourExtractData::CalculateImageResult() GetMinMaxPoint_Of_LstManConMod(minPoint,maxPoint); InitLstContoursLinesYPoints(); - + for (j=minPoint[1]; j<=maxPoint[1]; j++) { for (i=minPoint[0]; i<=maxPoint[0]; i++) { - if (isInside(i,j,_typeOperation)==true) + + //RaC 20-11-09 Changes specified in isInside (C1) + int ext[6]; + imagedata->GetExtent(ext); + + if ((i>=0) && (i<=ext[1]) && (j>=0) && (j<=ext[3])) { - value = GetDataValue(i,j,zImage); - PutVtkImageDataResultValue(i,j,zImage, value ); - } // if + if (isInside(i,j,_typeOperation)==true) + { + value = GetDataValue(i,j,zImage); + PutVtkImageDataResultValue(i,j,zImage, value ); + } // if + + }//if + } // for i } // for j @@ -421,19 +443,19 @@ void ContourExtractData::CalculateImageResult() //------------------------------------------------------------------------ void ContourExtractData::GetValuesInsideCrown(std::vector *pLstValue, - std::vector *pLstValuePosX, - std::vector *pLstValuePosY, - std::vector *pLstValuePosZ) + std::vector *pLstValuePosX, + std::vector *pLstValuePosY, + std::vector *pLstValuePosZ) { pLstValue->clear(); pLstValuePosX->clear(); pLstValuePosY->clear(); pLstValuePosZ->clear(); -// if (okImagesResults==true) -// { -// ResetImageResult(zImage); -// } + // if (okImagesResults==true) + // { + // ResetImageResult(zImage); + // } int minPoint[2]; int maxPoint[2]; @@ -447,34 +469,44 @@ void ContourExtractData::GetValuesInsideCrown(std::vector *pLstValue, maxPoint[1] = -999999; GetMinMaxPoint_Of_LstManConMod(minPoint,maxPoint); - InitLstContoursLinesYPoints(); + InitLstContoursLinesYPoints(); for (j=minPoint[1]; j<=maxPoint[1]; j++) { for (i=minPoint[0]; i<=maxPoint[0]; i++) { - if (isInside(i,j,_typeOperation)==true) + //RaC 20-11-09 Changes specified in isInside (C1) + int ext[6]; + imagedata->GetExtent(ext); + + if ((i>=0) && (i<=ext[1]) && (j>=0) && (j<=ext[3])) { - value = GetDataValue(i,j,zImage); - -// Borrame -// if (okImagesResults==true){ -// PutVtkImageDataResultValue(i,j,zImage, value ); -// } - - pLstValue -> push_back( value ); - pLstValuePosX -> push_back( i ); - pLstValuePosY -> push_back( j ); - pLstValuePosZ -> push_back( -1 ); - } // if + + if (isInside(i,j,_typeOperation)==true) + { + value = GetDataValue(i,j,zImage); + + // Borrame + // if (okImagesResults==true){ + // PutVtkImageDataResultValue(i,j,zImage, value ); + // } + + pLstValue -> push_back( value ); + pLstValuePosX -> push_back( i ); + pLstValuePosY -> push_back( j ); + pLstValuePosZ -> push_back( -1 ); + } // if + + } //if + } // for } // for -// Borrame -// if (this->okImagesResults==true){ -// imagedataValueResult->Modified(); -// imagedataMaskResult->Modified(); -// } + // Borrame + // if (this->okImagesResults==true){ + // imagedataValueResult->Modified(); + // imagedataMaskResult->Modified(); + // } } @@ -493,39 +525,39 @@ vtkImageData *ContourExtractData::GetVtkImageMaskResult() // ------------------------------------------------------------------------ void ContourExtractData::InitVtkImagesResult() { - int ext[6]; - int newDim[3]; - double spc[3]; - int scalartype; - - imagedata->GetSpacing(spc); - imagedata->GetExtent(ext); - newDim[0]=ext[1]-ext[0]+1; - newDim[1]=ext[3]-ext[2]+1; - newDim[2]=ext[5]-ext[4]+1; - scalartype = imagedata->GetScalarType(); - - if (imagedataValueResult!=NULL) - { - imagedataValueResult->Delete(); - } - imagedataValueResult = vtkImageData::New(); -// imagedataValueResult->SetScalarType(scalartype); - imagedataValueResult->SetScalarTypeToUnsignedShort(); - imagedataValueResult->SetSpacing(spc); - imagedataValueResult->SetDimensions( newDim ); - imagedataValueResult->AllocateScalars(); - - if (imagedataMaskResult!=NULL) - { - imagedataMaskResult->Delete(); - } - imagedataMaskResult = vtkImageData::New(); -// imagedataMaskResult->SetScalarType(scalartype); - imagedataMaskResult->SetScalarTypeToUnsignedShort(); - imagedataMaskResult->SetSpacing(spc); - imagedataMaskResult->SetDimensions( newDim ); - imagedataMaskResult->AllocateScalars(); + int ext[6]; + int newDim[3]; + double spc[3]; + int scalartype; + + imagedata->GetSpacing(spc); + imagedata->GetExtent(ext); + newDim[0]=ext[1]-ext[0]+1; + newDim[1]=ext[3]-ext[2]+1; + newDim[2]=ext[5]-ext[4]+1; + scalartype = imagedata->GetScalarType(); + + if (imagedataValueResult!=NULL) + { + imagedataValueResult->Delete(); + } + imagedataValueResult = vtkImageData::New(); + // imagedataValueResult->SetScalarType(scalartype); + imagedataValueResult->SetScalarTypeToUnsignedShort(); + imagedataValueResult->SetSpacing(spc); + imagedataValueResult->SetDimensions( newDim ); + imagedataValueResult->AllocateScalars(); + + if (imagedataMaskResult!=NULL) + { + imagedataMaskResult->Delete(); + } + imagedataMaskResult = vtkImageData::New(); + // imagedataMaskResult->SetScalarType(scalartype); + imagedataMaskResult->SetScalarTypeToUnsignedShort(); + imagedataMaskResult->SetSpacing(spc); + imagedataMaskResult->SetDimensions( newDim ); + imagedataMaskResult->AllocateScalars(); } @@ -542,18 +574,18 @@ void ContourExtractData::InitVolumeStatistics() //------------------------------------------------------------------------ void ContourExtractData::SetVolumeStatistics(int rCountRange, - int rsize, - double minValue, - double maxValue, - double acum_average, - double acum_standardeviation) + int rsize, + double minValue, + double maxValue, + double acum_average, + double acum_standardeviation) { vol_rCountRange = vol_rCountRange + rCountRange; vol_rsize = vol_rsize + rsize; - + if (minValuevol_maxValue){ vol_maxValue = maxValue; } - + vol_acum_average = vol_acum_average + acum_average; vol_acum_standardeviation = vol_acum_standardeviation + acum_standardeviation; } @@ -585,25 +617,25 @@ void ContourExtractData::Statistics( std::vector *inputLstValue, double *rmax, double *raverage, double *rstandardeviation - ) + ) { - double min = 0; - double max = 0; - double average = 0; - double standardeviation = 0; - double acum_average = 0; - double acum_standardeviation = 0; - int size = 0; - int countRange = 0; - double ng; - - if (inputLstValue!=NULL) - { + double min = 0; + double max = 0; + double average = 0; + double standardeviation = 0; + double acum_average = 0; + double acum_standardeviation = 0; + int size = 0; + int countRange = 0; + double ng; + + if (inputLstValue!=NULL) + { size=inputLstValue->size(); if (size>0){ - max=(*inputLstValue)[0]; - min=(*inputLstValue)[0]; - // Average , countRange + max=(*inputLstValue)[0]; + min=(*inputLstValue)[0]; + // Average , countRange int i; for ( i=0; i *inputLstValue, } // for average average = acum_average / size; - // Standar Deviation + // Standar Deviation acum_standardeviation=0; double tmp; - for ( i=0; iGetNumberOfPointsSpline(); // number of points in the spline manualcontourmodel->UpdateSpline(); //------------------------------------------------------------------------------------------------------ - + for (y=0;yGetSpline_i_Point(0,&x1,&y1,&z1); @@ -680,22 +712,24 @@ void ContourExtractData::InitLstContoursLinesYPoints() { // init InInside Optimisation int i; - + _lstlstlstVecX1.clear(); _lstlstlstVecY1.clear(); _lstlstlstVecX2.clear(); _lstlstlstVecY2.clear(); - + + /* RaC 20-11-09 int ext[6]; this->imagedata->GetWholeExtent(ext); int sizeY = ext[3]-ext[2]+1; + */ std::vector vecDouble; std::vector< std::vector > vecVecDouble; - for ( i=0 ; i > > _lstlstlstVecX2; std::vector< std::vector< std::vector > > _lstlstlstVecY2; void Fill_lstlstlstVecXY(int iContour, int sizeY); - void InitLstContoursLinesYPoints(); + + }; diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourBaseControler.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourBaseControler.cpp index 0639b0c..7ed9097 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourBaseControler.cpp +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourBaseControler.cpp @@ -226,6 +226,7 @@ bool manualContourBaseControler::OnRightButtonDown() SetCompleteCreation( true ); SetKeyBoardMoving( false ); + cout<<"RaC manualContourBaseControler::OnRightButtonDown"<GetManualContourModel()->SetCloseContour(true); MouseClickRight(X,Y); } diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModel.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModel.h index a4cccb9..16514a4 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModel.h +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModel.h @@ -127,7 +127,7 @@ public: void OpenData(FILE *ff); //-------------------------------------------------------------------------------- -private: +//public: //int _sizePointsContour; //std::vector _lstPoints; bool _closeContour; diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.cpp new file mode 100644 index 0000000..6019ffb --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.cpp @@ -0,0 +1,69 @@ +#include "manualContourModelPolygon.h" + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +manualContourModelPolygon::manualContourModelPolygon() +: manualContourModel() +{ +} + +manualContourModelPolygon::~manualContourModelPolygon() +{ +} + + +// ---------------------------------------------------------------------------- +manualContourModelPolygon* manualContourModelPolygon :: Clone() // virtual +{ + manualContourModelPolygon * clone = new manualContourModelPolygon(); + CopyAttributesTo(clone); + return clone; +} + +// --------------------------------------------------------------------------- + +void manualContourModelPolygon::CopyAttributesTo( manualContourModelPolygon * cloneObject) +{ + manualContourModel::CopyAttributesTo(cloneObject); +} + +//---------------------------------------------------------------- +int manualContourModelPolygon::GetTypeModel() //virtual +{ + return 10; +} + + +//---------------------------------------------------------------- +void manualContourModelPolygon::GetSpline_i_Point(int i, double *x, double *y, double *z) // virtual +{ + //cout<<"RaC manualContourModelPolygon::GetSpline_i_Point lstPoints:"<<_lstPoints.size()<<" pointsSpline:"<=_lstPoints.size()) + { + i=0; + } + + if (_lstPoints.size()==0) + { + *x = 0; + *y = 0; + *z = 0; + } + else + { + manualPoint *mp; + mp = GetManualPoint(i); + *x = mp->GetX(); + *y = mp->GetY(); + *z = mp->GetZ(); + } + +} + + +void manualContourModelPolygon::UpdateSpline() // virtual +{ + //SetNumberOfPointsSpline(_lstPoints.size()+1); +} \ No newline at end of file diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.h new file mode 100644 index 0000000..5ac6ba1 --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualContourModelPolygon.h @@ -0,0 +1,20 @@ +#ifndef manualContourModelPolygon_h +#define manualContourModelPolygon_h + +#include "manualContourModel.h" + +//-------------------------------------------------------- + +class creaMaracasVisu_EXPORT manualContourModelPolygon : public manualContourModel +{ +public: + manualContourModelPolygon(); + virtual ~manualContourModelPolygon(); + virtual manualContourModelPolygon *Clone(); + void CopyAttributesTo( manualContourModelPolygon *cloneObject); + virtual void GetSpline_i_Point(int i, double *x, double *y, double *z); + virtual int GetTypeModel(); + virtual void UpdateSpline(); +}; + +#endif // manualContourModelPolygon_h -- 2.46.0