Added RestrictedVoronoiRelaxing mode to the voronoi framework
This commit is contained in:
parent
b452c7a305
commit
875a7d1aac
|
@ -1178,6 +1178,57 @@ static void FixVertexVector(MeshType &m, std::vector<VertexType *> &vertToFixVec
|
||||||
fixed[vertToFixVec[i]]=true;
|
fixed[vertToFixVec[i]]=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int RestrictedVoronoiRelaxing(MeshType &m, std::vector<VertexType *> &seedVec,
|
||||||
|
int relaxStep,
|
||||||
|
VoronoiProcessingParameter &vpp,
|
||||||
|
vcg::CallBackPos *cb=0)
|
||||||
|
{
|
||||||
|
PerVertexPointerHandle sources = tri::Allocator<MeshType>:: template GetPerVertexAttribute<VertexPointer> (m,"sources");
|
||||||
|
PerVertexBoolHandle fixed = tri::Allocator<MeshType>:: template GetPerVertexAttribute<bool> (m,"fixed");
|
||||||
|
|
||||||
|
std::vector<CoordType> seedPosVec;
|
||||||
|
for(size_t i=0;i<seedVec.size();++i)
|
||||||
|
seedPosVec.push_back(seedVec[i]->P());
|
||||||
|
|
||||||
|
bool changed=false;
|
||||||
|
assert(m.vn > seedPosVec.size()*20);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0;i<relaxStep;++i)
|
||||||
|
{
|
||||||
|
// Kdtree for the seeds must be rebuilt at each step;
|
||||||
|
VectorConstDataWrapper<std::vector<CoordType> > vdw(seedPosVec);
|
||||||
|
KdTree<ScalarType> seedTree(vdw);
|
||||||
|
|
||||||
|
std::vector<std::pair<int,CoordType> > sumVec(seedPosVec.size(),std::make_pair(0,CoordType(0,0,0)));
|
||||||
|
for(typename MeshType::VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
|
||||||
|
{
|
||||||
|
unsigned int seedInd;
|
||||||
|
ScalarType sqdist;
|
||||||
|
seedTree.doQueryClosest(vi->P(),seedInd,sqdist);
|
||||||
|
vi->Q()=sqrt(sqdist);
|
||||||
|
sources[vi]=seedVec[seedInd];
|
||||||
|
sumVec[seedInd].first++;
|
||||||
|
sumVec[seedInd].second+=vi->cP();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<CoordType> newseedVec;
|
||||||
|
|
||||||
|
for(int i=0;i<seedPosVec.size();++i)
|
||||||
|
{
|
||||||
|
if(sumVec[i].first != 0)
|
||||||
|
newseedVec.push_back(sumVec[i].second /ScalarType(sumVec[i].first));
|
||||||
|
}
|
||||||
|
std::swap(seedPosVec,newseedVec);
|
||||||
|
tri::UpdateColor<MeshType>::PerVertexQualityRamp(m);
|
||||||
|
|
||||||
|
qDebug("performed %i relax step on %i",i,relaxStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
SeedToVertexConversion(m,seedPosVec,seedVec);
|
||||||
|
}
|
||||||
|
|
||||||
/// \brief Perform a Lloyd relaxation cycle over a mesh
|
/// \brief Perform a Lloyd relaxation cycle over a mesh
|
||||||
/// It uses two conventions:
|
/// It uses two conventions:
|
||||||
/// 1) a few vertexes can remain fixed, you have to set a per vertex bool attribute named 'fixed'
|
/// 1) a few vertexes can remain fixed, you have to set a per vertex bool attribute named 'fixed'
|
||||||
|
@ -1204,10 +1255,8 @@ static int VoronoiRelaxing(MeshType &m, std::vector<VertexType *> &seedVec,
|
||||||
|
|
||||||
tri::UpdateFlags<MeshType>::FaceBorderFromVF(m);
|
tri::UpdateFlags<MeshType>::FaceBorderFromVF(m);
|
||||||
tri::UpdateFlags<MeshType>::VertexBorderFromFace(m);
|
tri::UpdateFlags<MeshType>::VertexBorderFromFace(m);
|
||||||
typename MeshType::template PerVertexAttributeHandle<VertexPointer> sources;
|
PerVertexPointerHandle sources = tri::Allocator<MeshType>:: template GetPerVertexAttribute<VertexPointer> (m,"sources");
|
||||||
sources = tri::Allocator<MeshType>:: template GetPerVertexAttribute<VertexPointer> (m,"sources");
|
PerVertexBoolHandle fixed = tri::Allocator<MeshType>:: template GetPerVertexAttribute<bool> (m,"fixed");
|
||||||
typename MeshType::template PerVertexAttributeHandle<bool> fixed;
|
|
||||||
fixed = tri::Allocator<MeshType>:: template GetPerVertexAttribute<bool> (m,"fixed");
|
|
||||||
int iter;
|
int iter;
|
||||||
for(iter=0;iter<relaxIter;++iter)
|
for(iter=0;iter<relaxIter;++iter)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue