]> Creatis software - creaVtk.git/commitdiff
#3472 MeshDeformation
authorEduardo DAVILA <davila@creatis.insa-lyon.fr>
Mon, 6 Dec 2021 13:44:21 +0000 (14:44 +0100)
committerEduardo DAVILA <davila@creatis.insa-lyon.fr>
Mon, 6 Dec 2021 13:44:21 +0000 (14:44 +0100)
bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx
bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.h

index 3fac0f90d851f8ab9d628e89cea451159796c259..9223d520135f4ac9d37dee006a2617c2f8a69721 100644 (file)
@@ -27,17 +27,26 @@ void MeshDeformation::Process()
 //      (the one provided in the attribute 'type' of the tag 'input')
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
-  
-    
+
+    std::vector<double> lstCenter = bbGetInputCenter();
+
     double s = bbGetInputS();
-    bool ok=true;
-    if (bbGetInputDirection().size()==3)
+    bool ok=false;
+    if (bbGetInputTypeIn()==0) // direction
     {
-        ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) );
-    }
-    if ( (bbGetInputIn()!=NULL) && (ok==true) && (bbGetInputEdgeId()>=0))
+        if (bbGetInputDirection().size()==3)
+        {
+                ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) );
+        }
+    } // if TypeIn 0
+    
+    if (bbGetInputTypeIn()==1)  // center
     {
+        ok = ( lstCenter.size()==3 );
+    } // if TypeIn 1
 
+    if ( (bbGetInputIn()!=NULL) && (ok==true) && (bbGetInputEdgeId()>=0) && (bbGetInputActive()==true) )
+    {
         vtkPoints* points=bbGetInputIn()->GetPoints();
         long    i,size=points->GetNumberOfPoints();
         double  p[3];  // point
@@ -48,58 +57,74 @@ void MeshDeformation::Process()
         sy = sx;
         sz = sy;
 
-        points->GetPoint( bbGetInputEdgeId() , pb );
-
-        if (EdgeIdBack!=bbGetInputEdgeId() )
-        {
-            voiIdPoints.clear();
-            EdgeIdBack = bbGetInputEdgeId();
-            for ( i=0 ; i<size ; i++)
-            {
-                points->GetPoint(i,p);
-
-                if ( (p[0]>(pb[0]-sx)) && (p[0]<(pb[0]+sx)) &&
-                     (p[1]>(pb[1]-sy)) && (p[1]<(pb[1]+sy)) &&
-                     (p[2]>(pb[2]-sz)) && (p[2]<(pb[2]+sz)) )
-                {
-                    voiIdPoints.push_back( i );
-                } // if
-            } // for i
-        } // back
         double displcement_x = 0;
         double displcement_y = 0;
         double displcement_z = 0;
         
-        if (bbGetInputDirection().size()==3)
+        if (bbGetInputTypeIn()==0) // Direction
         {
             displcement_x = bbGetInputDirection()[0];
             displcement_y = bbGetInputDirection()[1];
             displcement_z = bbGetInputDirection()[2];
-        }
+        } // if TypeIn 0 Direction
         
-        size=voiIdPoints.size();
-        for (i=0;i<size;i++)
+        if (bbGetInputTypeIn()==1) // Center
         {
-            points->GetPoint( voiIdPoints[i] , p );
-            double x = p[0] - pb[0]; //distance between a point and seed point
-            double y = p[1] - pb[1];
-            double z = p[2] - pb[2];
-            double distance = std::sqrt(std::pow(x, 2) + std::pow(y, 2) + std::pow(z, 2));
+            if (EdgeIdBack==bbGetInputEdgeId() )
+            {
+                displcement_x   = (lstCenter[0]-backLstCenter[0])/1.0;
+                displcement_y   = (lstCenter[1]-backLstCenter[1])/1.0;
+                displcement_z   = (lstCenter[2]-backLstCenter[2])/1.0;
+            } // if EdgeIdBack!=bbGetInputEdgeId()
+            backLstCenter[0]= lstCenter[0];
+            backLstCenter[1]= lstCenter[1];
+            backLstCenter[2]= lstCenter[2];
+        } // if TypeIn 1 Center
 
-//        https://en.wikipedia.org/wiki/Generalized_normal_distribution
-// with Gama function
-            
-            double weight = exp(-distance * 1. / s);
-            if (weight > 0.0001)
+        
+            points->GetPoint( bbGetInputEdgeId() , pb );
+            if (EdgeIdBack!=bbGetInputEdgeId() )
             {
-                np[0] = p[0] + weight*displcement_x;
-                np[1] = p[1] + weight*displcement_y;
-                np[2] = p[2] + weight*displcement_z;
-                points->SetPoint( voiIdPoints[i] , np );
-            } // if
-        } // for
-        points->Modified();
-        bbGetInputIn()->Modified();
+                EdgeIdBack = bbGetInputEdgeId();
+                voiIdPoints.clear();
+                for ( i=0 ; i<size ; i++)
+                {
+                    points->GetPoint(i,p);
+                    if ( (p[0]>(pb[0]-sx)) && (p[0]<(pb[0]+sx)) &&
+                         (p[1]>(pb[1]-sy)) && (p[1]<(pb[1]+sy)) &&
+                         (p[2]>(pb[2]-sz)) && (p[2]<(pb[2]+sz)) )
+                    {
+                        voiIdPoints.push_back( i );
+                    } // if
+                } // for i
+            } // back
+
+        if ( !((displcement_x==0) &&(displcement_y==0) && (displcement_z==0)) )
+        {
+            size=voiIdPoints.size();
+            for (i=0;i<size;i++)
+            {
+                points->GetPoint( voiIdPoints[i] , p );
+                double x = p[0] - pb[0]; //distance between a point and seed point
+                double y = p[1] - pb[1];
+                double z = p[2] - pb[2];
+                double distance = std::sqrt(std::pow(x, 2) + std::pow(y, 2) + std::pow(z, 2));
+
+    //        https://en.wikipedia.org/wiki/Generalized_normal_distribution
+    // with Gama function
+                
+                double weight = exp(-distance * 1. / s);
+                if (weight > 0.0001)
+                {
+                    np[0] = p[0] + weight*displcement_x;
+                    np[1] = p[1] + weight*displcement_y;
+                    np[2] = p[2] + weight*displcement_z;
+                    points->SetPoint( voiIdPoints[i] , np );
+                } // if
+            } // for
+            points->Modified();
+            bbGetInputIn()->Modified();
+        } // if distance_x y z  != 0
     } // In != NULL
 }
 //===== 
@@ -110,7 +135,9 @@ void MeshDeformation::bbUserSetDefaultValues()
 
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
-   bbSetInputIn(NULL);
+    bbSetInputActive(true);
+    bbSetInputTypeIn(0);
+    bbSetInputIn(NULL);
     std::vector<double> direction;
     direction.push_back(1);
     direction.push_back(0);
@@ -119,6 +146,10 @@ void MeshDeformation::bbUserSetDefaultValues()
     EdgeIdBack=-1;
     bbSetInputEdgeId(EdgeIdBack);
     bbSetInputS(10);
+    
+    backLstCenter.push_back(0);
+    backLstCenter.push_back(0);
+    backLstCenter.push_back(0);
 }
 //===== 
 // 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)
index 22bb17cbdfd1b8e796b2643a3390ae441a1bfeed..c2ce1a83cb4a0b37e23a14145ef200728b340fef 100644 (file)
@@ -21,17 +21,20 @@ class bbcreaVtk_EXPORT MeshDeformation
 //===== 
 // 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)
 //=====
+  BBTK_DECLARE_INPUT(Active, bool);
+  BBTK_DECLARE_INPUT(TypeIn, int);
   BBTK_DECLARE_INPUT(In,vtkPolyData*);
   BBTK_DECLARE_INPUT(EdgeId, long);
   BBTK_DECLARE_INPUT(S, double);
+  BBTK_DECLARE_INPUT(Center, std::vector<double>);
   BBTK_DECLARE_INPUT(Direction, std::vector<double>);
 //  BBTK_DECLARE_OUTPUT(Out,double);
   BBTK_PROCESS(Process);
   void Process();
   
   long EdgeIdBack;
-    std::vector<int>  voiIdPoints;
-
+    std::vector<int>    voiIdPoints;
+    std::vector<double> backLstCenter;
 //===== 
 // 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)
 //===== 
@@ -42,9 +45,12 @@ BBTK_BEGIN_DESCRIBE_BLACK_BOX(MeshDeformation,bbtk::AtomicBlackBox);
   BBTK_AUTHOR("Info-Dev");
   BBTK_DESCRIPTION("No Description.");
   BBTK_CATEGORY("empty");
+  BBTK_INPUT(MeshDeformation,Active,"(default true) true/false",bool,"");
+  BBTK_INPUT(MeshDeformation,TypeIn,"(default 0) 0:Direction  1:Center",int,"");
   BBTK_INPUT(MeshDeformation,In,"vtk PolyData",vtkPolyData*,"");
   BBTK_INPUT(MeshDeformation,EdgeId,"Edge Id",long,"");
   BBTK_INPUT(MeshDeformation,S,"Deformation",double,"");
+  BBTK_INPUT(MeshDeformation,Center,"[X,Y,Z]",std::vector<double>,"");
   BBTK_INPUT(MeshDeformation,Direction,"(default [1,0,0])   [X,Y,Z]",std::vector<double>,"");
 //  BBTK_OUTPUT(MeshDeformation,Out,"First output",double,"");
 BBTK_END_DESCRIBE_BLACK_BOX(MeshDeformation);