X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=bbtk_creaVtk_PKG%2Fsrc%2FbbcreaVtkMeshDeformation.cxx;h=9223d520135f4ac9d37dee006a2617c2f8a69721;hb=980386fede464fc81969cefaa099b2994d1d6ea0;hp=3fac0f90d851f8ab9d628e89cea451159796c259;hpb=970a183246a4df7f29e583846745086c5b9f7090;p=creaVtk.git diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx b/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx index 3fac0f9..9223d52 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx @@ -27,17 +27,26 @@ void MeshDeformation::Process() // (the one provided in the attribute 'type' of the tag 'input') // bbSetOutputOut( bbGetInputIn() ); // std::cout << "Output value = " < 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 ; iGetPoint(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;iGetPoint( 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 ; iGetPoint(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;iGetPoint( 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 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)