Updates pointcloud normal and smooth to the thread safe changes to the kdtree.

This commit is contained in:
Paolo Cignoni 2014-07-12 05:50:32 +00:00
parent c2f98a8595
commit 280a9e606b
2 changed files with 25 additions and 19 deletions

View File

@ -35,24 +35,27 @@ public:
bool operator< (const WArc &a) const {return w<a.w;}
};
static void ComputeUndirectedNormal(MeshType &m, int nn, float maxDist, KdTree<ScalarType> &tree,vcg::CallBackPos * cb=0)
static void ComputeUndirectedNormal(MeshType &m, int nn, ScalarType maxDist, KdTree<ScalarType> &tree,vcg::CallBackPos * cb=0)
{
tree.setMaxNofNeighbors(nn);
// tree.setMaxNofNeighbors(nn);
const ScalarType maxDistSquared = maxDist*maxDist;
int cnt=0;
int step=m.vn/100;
typename KdTree<ScalarType>::PriorityQueue nq;
for (VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
{
tree.doQueryK(vi->cP());
tree.doQueryK(vi->cP(),nn,nq);
if(cb && (++cnt%step)==0) cb(cnt/step,"Fitting planes");
int neighbours = tree.getNofFoundNeighbors();
// int neighbours = tree.getNofFoundNeighbors();
int neighbours = nq.getNofElements();
std::vector<CoordType> ptVec;
for (int i = 0; i < neighbours; i++)
{
int neightId = tree.getNeighborId(i);
if(Distance(vi->cP(),m.vert[neightId].cP())<maxDist)
ptVec.push_back(m.vert[neightId].cP());
// int neightId = tree.getNeighborId(i);
int neightId = nq.getIndex(i);
if(nq.getWeight(i) <maxDistSquared)
ptVec.push_back(m.vert[neightId].cP());
}
Plane3<ScalarType> plane;
FitPlaneToPointSet(ptVec,plane);
@ -60,14 +63,16 @@ public:
}
}
static void AddNeighboursToHeap( MeshType &m, VertexPointer vp, KdTree<ScalarType> &tree, std::vector<WArc> &heap)
static void AddNeighboursToHeap( MeshType &m, VertexPointer vp, int nn, KdTree<ScalarType> &tree, std::vector<WArc> &heap)
{
tree.doQueryK(vp->cP());
typename KdTree<ScalarType>::PriorityQueue nq;
tree.doQueryK(vp->cP(),nn,nq);
int neighbours = tree.getNofFoundNeighbors();
int neighbours = nq.getNofElements();
for (int i = 0; i < neighbours; i++)
{
int neightId = tree.getNeighborId(i);
// int neightId = tree.getNeighborId(i);
int neightId = nq.getIndex(i);
if (neightId < m.vn && (&m.vert[neightId] != vp))
{
if(!m.vert[neightId].IsV())
@ -114,7 +119,7 @@ public:
tri::Smooth<MeshType>::VertexNormalPointCloud(m,p.fittingAdjNum,p.smoothingIterNum,&tree);
if(p.coherentAdjNum==0) return;
tree.setMaxNofNeighbors(p.coherentAdjNum+1);
// tree.setMaxNofNeighbors(p.coherentAdjNum+1);
tri::UpdateFlags<MeshType>::VertexClearV(m);
std::vector<WArc> heap;
@ -133,7 +138,7 @@ public:
vi->N()=-(*vi).N();
vi->SetV();
AddNeighboursToHeap(m,&*vi,tree,heap);
AddNeighboursToHeap(m,&*vi,p.coherentAdjNum,tree,heap);
while(!heap.empty())
{
@ -146,7 +151,7 @@ public:
if(a.src->cN()*a.trg->cN()<0.0f)
if(!p.useViewPoint || ( a.trg->N().dot(p.viewPoint- a.trg->P())<0.0f)) // test to prevent flipping according to viewpos
a.trg->N()=-a.trg->N();
AddNeighboursToHeap(m,a.trg,tree,heap);
AddNeighboursToHeap(m,a.trg,p.coherentAdjNum,tree,heap);
}
}
}

View File

@ -1194,17 +1194,18 @@ static void VertexNormalPointCloud(MeshType &m, int neighborNum, int iterNum, Kd
KdTree<ScalarType> *tree=0;
if(tp==0) tree = new KdTree<ScalarType>(ww);
else tree=tp;
typename KdTree<ScalarType>::PriorityQueue nq;
tree->setMaxNofNeighbors(neighborNum);
// tree->setMaxNofNeighbors(neighborNum);
for(int ii=0;ii<iterNum;++ii)
{
for (VertexIterator vi = m.vert.begin();vi!=m.vert.end();++vi)
{
tree->doQueryK(vi->cP());
int neighbours = tree->getNofFoundNeighbors();
tree->doQueryK(vi->cP(),neighborNum,nq);
int neighbours = nq.getNofElements();
for (int i = 0; i < neighbours; i++)
{
int neightId = tree->getNeighborId(i);
int neightId = nq.getIndex(i);
if(m.vert[neightId].cN()*vi->cN()>0)
TD[vi]+= m.vert[neightId].cN();
else