X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=bbtk_creaVtk_PKG%2Fsrc%2FbbcreaVtkMeshDeformation.cxx;h=cddffce77d323569eb3dca165ccfe964adc6124c;hb=464deff51f697881cd76b3cfb934859cd7c31df7;hp=b5b429492f2e29219dc5d60c6ed88299071c978c;hpb=2cdbf3aedf0078cd0111e6ed5c64d89ffef7c0cd;p=creaVtk.git diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx b/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx index b5b4294..cddffce 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx @@ -27,14 +27,25 @@ 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 + { + if (bbGetInputDirection().size()==3) + { + ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) ); + } + } // if TypeIn 0 + + if (bbGetInputTypeIn()==1) // center { - ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) ); - } - if ( (bbGetInputIn()!=NULL) && (ok==true)) + 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(); @@ -46,57 +57,75 @@ 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]; - } - 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 + + + points->GetPoint( bbGetInputEdgeId() , pb ); + if (EdgeIdBack!=bbGetInputEdgeId() ) + { + 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 -// https://en.wikipedia.org/wiki/Generalized_normal_distribution -// with Gama function - - double weight = exp(-distance * 1. / s); - if (weight > 0.0001) + if ( !((displcement_x==0) &&(displcement_y==0) && (displcement_z==0)) ) + { + size=voiIdPoints.size(); + for (i=0;iSetPoint( voiIdPoints[i] , np ); - } // if - } // for - points->Modified(); - bbGetInputIn()->Modified(); - } // In != NULL + 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 ok active } //===== // 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) @@ -106,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); @@ -115,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)