]> Creatis software - bbtk.git/blobdiff - packages/std/src/bbstdVectorFilterDouble.cxx
#3492 SaveLstPoints
[bbtk.git] / packages / std / src / bbstdVectorFilterDouble.cxx
index 9a948a85367b3884d62c19964248e2a20502f9bb..95dae0ad3136fcea027f57d4af94e299783ffab1 100644 (file)
@@ -3,6 +3,8 @@
 //===== 
 #include "bbstdVectorFilterDouble.h"
 #include "bbstdPackage.h"
+#include "math.h"
+
 namespace bbstd
 {
 
@@ -75,36 +77,39 @@ void VectorFilterDouble::Process()
 
        if (bbGetInputType()==0)  // Erase duplicate lines
        {
-               bool okSizeVec=true;
-               int ipLstvec; 
-               for (ipLstvec=1;ipLstvec<pLstVec.size();ipLstvec++)
-               {
-                       if ( (*pLstVec[ipLstvec]).size()!=(*pLstVec[0]).size() )  { okSizeVec=false; }
-               }
-               if ( okSizeVec==false)
+               if (bbGetInputIn0().size()!=0)  // At least one element 
                {
-                       printf("EED VectorFilterDouble::Process WARNING! vectors are not of the same size.\n");
-               } else {
-                       int iLine;
-                       int ipLstvec2; 
-                       bool okLine;
-                       for (iLine=0 ; iLine < (*pLstVec[0]).size() ; iLine++ ) 
+                       bool okSizeVec=true;
+                       int ipLstvec; 
+                       for (ipLstvec=1;ipLstvec<pLstVec.size();ipLstvec++)
                        {
-                               okLine=false;
-                               for ( ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
-                               {
-                                       if ( (*pLstVec[ipLstvec2])[iLine]!=(*pLstVec[ipLstvec2])[iLine-1] )  { okLine=true; }
-                               } // for ipLstVec2
-                                               
-                               if ( (okLine==true) || (iLine==0) ) 
+                               if ( (*pLstVec[ipLstvec]).size()!=(*pLstVec[0]).size() )  { okSizeVec=false; }
+                       }
+                       if ( okSizeVec==false)
+                       {
+                               printf("EED VectorFilterDouble::Process WARNING! vectors are not of the same size.\n");
+                       } else {
+                               int iLine;
+                               int ipLstvec2; 
+                               bool okLine;
+                               for (iLine=0 ; iLine < (*pLstVec[0]).size() ; iLine++ ) 
                                {
-                                       for (ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
+                                       okLine=false;
+                                       for ( ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
                                        {
-                                               (*pLstVecOut[ipLstvec2]).push_back( (*pLstVec[ipLstvec2])[iLine] );
-                                       } // for
-                               } // if okLine
-                       } // for iLine
-               } // if okSizeVec
+                                               if ( (*pLstVec[ipLstvec2])[iLine]!=(*pLstVec[ipLstvec2])[iLine-1] )  { okLine=true; }
+                                       } // for ipLstVec2
+                                                       
+                                       if ( (okLine==true) || (iLine==0) ) 
+                                       {
+                                               for (ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
+                                               {
+                                                       (*pLstVecOut[ipLstvec2]).push_back( (*pLstVec[ipLstvec2])[iLine] );
+                                               } // for
+                                       } // if okLine
+                               } // for iLine
+                       } // if okSizeVec
+               } // bbGetInputIn0()  size
        } // Type==0
 
 
@@ -113,7 +118,7 @@ void VectorFilterDouble::Process()
                int             ipLstvec2;
                double  iLine;
                int     sizeLines       = (*pLstVec[0]).size();
-               double  step            = (double)sizeLines/(double)bbGetInputk1();
+               double  step            = (double)sizeLines/((double)bbGetInputk1()[0]-1);
                for (iLine=0 ; iLine<sizeLines ; iLine=iLine+step)
                {
                        for (ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
@@ -121,6 +126,13 @@ void VectorFilterDouble::Process()
                                (*pLstVecOut[ipLstvec2]).push_back( (*pLstVec[ipLstvec2])[(int)iLine] );
                        } // for                        
                } // for ipLstVec
+
+               // adding the lastone
+               for (ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
+               {
+                       (*pLstVecOut[ipLstvec2]).push_back( (*pLstVec[ipLstvec2])[(int)(sizeLines-1)] );
+               } // for                        
+
        } // Type==1
 
        if (bbGetInputType()==2) // Insert intermediate points
@@ -146,7 +158,7 @@ void VectorFilterDouble::Process()
        } // Type==2
 
 
-       if (bbGetInputType()==3) // Addition  k1
+       if (bbGetInputType()==3) // Addition  k1[0]
        {
                int             ipLstvec;
                int     i;
@@ -157,13 +169,13 @@ void VectorFilterDouble::Process()
                        size=(*pLstVec[ipLstvec]).size();
                        for (i=0;i<size;i++)
                        {
-                               result= (*pLstVec[ipLstvec])[i] + bbGetInputk1() ;
+                               result= (*pLstVec[ipLstvec])[i] + bbGetInputk1()[0] ;
                                (*pLstVecOut[ipLstvec]).push_back( result );                            
                        }// for size
                } // for pLstVec                
        } // Type==3
 
-       if (bbGetInputType()==4) // Substraction  k1
+       if (bbGetInputType()==4) // Substraction  k1[0]
        {
                int             ipLstvec;
                int     i;
@@ -174,13 +186,13 @@ void VectorFilterDouble::Process()
                        size=(*pLstVec[ipLstvec]).size();
                        for (i=0;i<size;i++)
                        {
-                               result= (*pLstVec[ipLstvec])[i] - bbGetInputk1() ;
+                               result= (*pLstVec[ipLstvec])[i] - bbGetInputk1()[0] ;
                                (*pLstVecOut[ipLstvec]).push_back( result );                            
                        }// for size
                } // for pLstVec                
        } // Type==4
 
-       if (bbGetInputType()==5) // Multiplication  k1
+       if (bbGetInputType()==5) // Multiplication  k1[0]
        {
                int     ipLstvec;
                int     i;
@@ -191,7 +203,7 @@ void VectorFilterDouble::Process()
                        size=(*pLstVec[ipLstvec]).size();
                        for (i=0;i<size;i++)
                        {
-                               result= (*pLstVec[ipLstvec])[i] * bbGetInputk1() ;
+                               result= (*pLstVec[ipLstvec])[i] * bbGetInputk1()[0] ;
                                (*pLstVecOut[ipLstvec]).push_back( result );                            
                        }// for size
                } // for pLstVec                
@@ -208,9 +220,9 @@ void VectorFilterDouble::Process()
                        size=(*pLstVec[ipLstvec]).size();
                        for (i=0;i<size;i++)
                        {
-                               if (bbGetInputk1()!=0)
+                               if (bbGetInputk1()[0]!=0)
                                {
-                                       result= (*pLstVec[ipLstvec])[i] / bbGetInputk1() ;
+                                       result= (*pLstVec[ipLstvec])[i] / bbGetInputk1()[0] ;
                                        (*pLstVecOut[ipLstvec]).push_back( result );                            
                                } else {
                                        printf("EED VectorFilterDouble::Process  Warning!! Div by 0 in Type 6 \n");
@@ -220,6 +232,256 @@ void VectorFilterDouble::Process()
                } // for pLstVec                
        } // Type==6
 
+
+
+       if (bbGetInputType()==7) 
+       {
+               int i,j;
+               for (j=0;j<In4.size(); j++)
+               {
+                       Out0.push_back( In4[j] );
+                       Out1.push_back( In5[j] );
+                       Out2.push_back( In6[j] );
+               } //
+
+
+               int iGeneral=0,sizeI,sizeLst1Indexes=In3.size();
+               for (i=0; i<sizeLst1Indexes-1;i++) { iGeneral=iGeneral+In3[i]; }
+               sizeI=iGeneral+In3[ sizeLst1Indexes-1 ];
+
+               int jGeneral = 0;
+               int sizeJ        = In7[ 0 ];
+
+               double dist2,dist2Min,dx,dy,dz;
+               int iBack;
+
+               for (j=jGeneral;j<sizeJ;j++) 
+               {
+                       dist2Min=1000000;
+                       for (i=iGeneral;i<sizeI;i++) 
+                       {       
+                               dx              = In0[i]-In4[j];
+                               dy              = In1[i]-In5[j];
+                               dz              = In2[i]-In6[j];
+                               dist2           = dx*dx + dy*dy + dz*dz;
+                               if (dist2<dist2Min) 
+                               {
+                                               dist2Min=dist2;
+                                               iBack=i;
+                               } // if
+                       } // for j
+                       Out0[j]=In0[iBack]; 
+                       Out1[j]=In1[iBack]; 
+                       Out2[j]=In2[iBack]; 
+               } // for i
+
+
+       }       // Type 7
+
+
+
+       if (bbGetInputType()==8)   // order all vectors using as base the vector In0
+       {
+               double tmp;
+               int i,j,ii,sizeII;
+               sizeII=pLstVec.size();
+
+
+               int size=In0.size();
+               for (i=0;i<size; i++)
+               {
+                       for (ii=0;ii<sizeII;ii++)
+                       {
+                                (*pLstVecOut[ii]).push_back( (*pLstVec[ii])[i] ); 
+                       } // for ii
+               } // i
+               for (i=0;i<size;i++)
+               {
+                       for (j=i;j<size;j++)
+                       {
+                               if ((*pLstVecOut[0])[j] <= (*pLstVecOut[0])[i] ) 
+                               {       
+                                       
+                                       for (ii=0;ii<sizeII;ii++)
+                                       {
+                                               tmp = (*pLstVecOut[ii])[i]; 
+                                               (*pLstVecOut[ii])[i] = (*pLstVecOut[ii])[j]; 
+                                               (*pLstVecOut[ii])[j] = tmp; 
+                                       } // for ii
+                               } // if <
+                       } // for j
+               } // for i
+       } // Type 8
+
+
+       if (bbGetInputType()==9)   // Invert vectors
+       {
+               double tmp;
+               int i,j,ii,sizeII;
+               sizeII=pLstVec.size();
+
+               int size=In0.size();
+               int size2=size/2;
+               for (i=0;i<size; i++)
+               {
+                       for (ii=0;ii<sizeII;ii++)
+                       {
+                                (*pLstVecOut[ii]).push_back( (*pLstVec[ii])[i] ); 
+                       } // for ii
+               } // i
+
+               for (i=0;i<size2;i++)
+               {
+                       for (ii=0;ii<sizeII;ii++)
+                       {
+                               j=size-1-i;     
+                               tmp = (*pLstVecOut[ii])[i]; 
+                               (*pLstVecOut[ii])[i] = (*pLstVecOut[ii])[ j ]; 
+                               (*pLstVecOut[ii])[j] = tmp; 
+                       } // for ii
+               } // for i
+       } // Type 9
+
+
+       if (bbGetInputType()==10)   // Nearest point in vector
+       {
+               int     sizeLstX        =       In0.size();   // lstX
+               int     sizeLstY        =       In1.size();   // lstY
+               int     sizeLstZ        =       In2.size();   // lstZ
+               if ( (sizeLstX==sizeLstY) && (sizeLstY==sizeLstZ) && (sizeLstX>0) && (In3.size()==3) )
+               {
+                       int i;
+                       double x1               =       In3[0];  // pointX of pointXYZ
+                       double y1               =       In3[1];  // pointY of pointXYZ
+                       double z1               =       In3[2];  // pointZ of pointXYZ
+                       double distMin  =       100000;
+                       double dist;
+                       double x2;
+                       double y2;
+                       double z2;
+                       Out0.push_back( -1 ); 
+                       Out1.push_back( -999 ); 
+                       Out1.push_back( -999 ); 
+                       Out1.push_back( -999 ); 
+                       for (i=0;i<sizeLstX; i++)
+                       {
+                               x2 = In0[i];    // lstX
+                               y2 = In1[i];    // lstY
+                               z2 = In2[i];    // lstZ
+                               dist = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) );
+                               if (dist<distMin) 
+                               {
+                                       distMin = dist;
+                                       Out0[0] = i;
+                                       Out1[0] = x2;
+                                       Out1[1] = y2;
+                                       Out1[2] = z2;
+                               }
+                       } // for i
+               } else {
+                       printf("EED Warnning VectorFilterDouble::Process()   For Type 10 the size of the vectors are not coherent.\n");
+               }// if size
+       } // Type 10
+
+
+    if (bbGetInputType()==11)   // Nearest point in vector
+    {
+        int i;
+        int    sizeLstX    =    In0.size();   // lstX
+        int    sizeLstY    =    In1.size();   // lstY
+        int    sizeLstZ    =    In2.size();   // lstZ
+        std::vector<double> spc = bbGetInputk1();
+        if (spc.size()>=1)
+        {
+            for (i=0;i<sizeLstX; i++)
+            {
+                Out0.push_back( In0[i]*spc[0] );
+            } // for i
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 11 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+
+        if (spc.size()>=2)
+        {
+            for (i=0;i<sizeLstY; i++)
+            {
+                Out1.push_back( In1[i]*spc[1] );
+            } // for i
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 11 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+
+        if (spc.size()>=3)
+        {
+            for (i=0;i<sizeLstZ; i++)
+            {
+                Out2.push_back( In2[i]*spc[2] );
+            } // for i
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 11 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+
+     } // Type 11
+
+
+    if (bbGetInputType()==12)   // Nearest point in vector
+    {
+        int i;
+        int    sizeLstX    =    In0.size();   // lstX
+        int    sizeLstY    =    In1.size();   // lstY
+        int    sizeLstZ    =    In2.size();   // lstZ
+        std::vector<double> spc = bbGetInputk1();
+        if (spc.size()>=1)
+        {
+            if (spc[0]!=0)
+            {
+                for (i=0;i<sizeLstX; i++)
+                {
+                    Out0.push_back( In0[i]/spc[0] );
+                } // for i
+            } // if spc !=0
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 12 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+
+        if (spc.size()>=2)
+        {
+            if (spc[0]!=0)
+            {
+                for (i=0;i<sizeLstY; i++)
+                {
+                    Out1.push_back( In1[i]/spc[1] );
+                } // for i
+            } // if spc !=0
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 12 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+
+        if (spc.size()>=3)
+        {
+            if (spc[0]!=0)
+            {
+                for (i=0;i<sizeLstZ; i++)
+                {
+                    Out2.push_back( In2[i]/spc[2] );
+                } // for i
+            } // if spc !=0
+        } else {
+            printf("EED Warnning VectorFilterDouble::Process()   For Type 12 the K1 vector (spacing) is not coherent.\n");
+        }// if size
+     } // Type 12
+
+    if (bbGetInputType()==13)   // Distance point 3D between In0 and In1
+    {
+        if ( In0.size()==3 and In1.size()==3)
+        {
+            double x = In0[0] - In1[0];
+            double y = In0[1] - In1[1];
+            double z = In0[2] - In1[2];
+            Out0.push_back( sqrt( x*x +y*y +z*z ) );
+        }
+     } // Type 13
+
        bbSetOutputOut0( Out0 );
        bbSetOutputOut1( Out1 );
        bbSetOutputOut2( Out2 );
@@ -231,44 +493,42 @@ void VectorFilterDouble::Process()
        bbSetOutputOut8( Out8 );
        bbSetOutputOut9( Out9 );
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void VectorFilterDouble::bbUserSetDefaultValues()
 {
-
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
-   bbSetInputType(0);
-   bbSetInputk1(0);
-  
+    bbSetInputType(0);
+    std::vector<double> k1;
+    k1.push_back(0);
+    bbSetInputk1(k1);
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void VectorFilterDouble::bbUserInitializeProcessing()
 {
-
 //  THE INITIALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should allocate the internal/output pointers 
-//    if any 
-
-  
+//    if any
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void VectorFilterDouble::bbUserFinalizeProcessing()
 {
-
 //  THE FINALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should desallocate the internal/output pointers 
 //    if any
-  
 }
-}
-// EO namespace bbstd
+
+}// EO namespace bbstd