Added EdgeMeshUniform method that generate samples over the edges of a polyline in a uniform way.
This commit is contained in:
parent
c6e5015090
commit
967f61b2be
|
@ -72,8 +72,10 @@ template <class MeshType>
|
||||||
class TrivialSampler
|
class TrivialSampler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef typename MeshType::ScalarType ScalarType;
|
||||||
typedef typename MeshType::CoordType CoordType;
|
typedef typename MeshType::CoordType CoordType;
|
||||||
typedef typename MeshType::VertexType VertexType;
|
typedef typename MeshType::VertexType VertexType;
|
||||||
|
typedef typename MeshType::EdgeType EdgeType;
|
||||||
typedef typename MeshType::FaceType FaceType;
|
typedef typename MeshType::FaceType FaceType;
|
||||||
|
|
||||||
void reset()
|
void reset()
|
||||||
|
@ -108,6 +110,11 @@ public:
|
||||||
{
|
{
|
||||||
sampleVec->push_back(p.cP());
|
sampleVec->push_back(p.cP());
|
||||||
}
|
}
|
||||||
|
void AddEdge(const EdgeType& e, ScalarType u ) // u==0 -> v(0) u==1 -> v(1);
|
||||||
|
{
|
||||||
|
sampleVec->push_back(e.cV(0)->cP()*(1.0-u)+e.cV(1)->cP()*u);
|
||||||
|
}
|
||||||
|
|
||||||
void AddFace(const FaceType &f, const CoordType &p)
|
void AddFace(const FaceType &f, const CoordType &p)
|
||||||
{
|
{
|
||||||
sampleVec->push_back(f.cP(0)*p[0] + f.cP(1)*p[1] +f.cP(2)*p[2] );
|
sampleVec->push_back(f.cP(0)*p[0] + f.cP(1)*p[1] +f.cP(2)*p[2] );
|
||||||
|
@ -204,9 +211,11 @@ class SurfaceSampling
|
||||||
typedef typename MeshType::VertexType VertexType;
|
typedef typename MeshType::VertexType VertexType;
|
||||||
typedef typename MeshType::VertexPointer VertexPointer;
|
typedef typename MeshType::VertexPointer VertexPointer;
|
||||||
typedef typename MeshType::VertexIterator VertexIterator;
|
typedef typename MeshType::VertexIterator VertexIterator;
|
||||||
|
typedef typename MeshType::EdgeType EdgeType;
|
||||||
|
typedef typename MeshType::EdgeIterator EdgeIterator;
|
||||||
|
typedef typename MeshType::FaceType FaceType;
|
||||||
typedef typename MeshType::FacePointer FacePointer;
|
typedef typename MeshType::FacePointer FacePointer;
|
||||||
typedef typename MeshType::FaceIterator FaceIterator;
|
typedef typename MeshType::FaceIterator FaceIterator;
|
||||||
typedef typename MeshType::FaceType FaceType;
|
|
||||||
typedef typename MeshType::FaceContainer FaceContainer;
|
typedef typename MeshType::FaceContainer FaceContainer;
|
||||||
|
|
||||||
typedef typename vcg::SpatialHashTable<FaceType, ScalarType> MeshSHT;
|
typedef typename vcg::SpatialHashTable<FaceType, ScalarType> MeshSHT;
|
||||||
|
@ -469,6 +478,72 @@ static void VertexUniform(MeshType & m, VertexSampler &ps, int sampleNum)
|
||||||
ps.AddVert(*vertVec[i]);
|
ps.AddVert(*vertVec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
static void EdgeMeshUniform(MeshType &m, VertexSampler &ps, float radius)
|
||||||
|
{
|
||||||
|
tri::RequireEEAdjacency(m);
|
||||||
|
tri::RequireCompactness(m);
|
||||||
|
tri::UpdateTopology<MeshType>::EdgeEdge(m);
|
||||||
|
tri::UpdateFlags<MeshType>::EdgeClearV(m);
|
||||||
|
|
||||||
|
for(EdgeIterator ei = m.edge.begin();ei!=m.edge.end();++ei)
|
||||||
|
{
|
||||||
|
if(!ei->IsV())
|
||||||
|
{
|
||||||
|
edge::Pos<EdgeType> ep(&*ei,0);
|
||||||
|
edge::Pos<EdgeType> startep =ep;
|
||||||
|
|
||||||
|
do // first loop to search a boundary.
|
||||||
|
{
|
||||||
|
ep.NextE();
|
||||||
|
if(ep.IsBorder()) break;
|
||||||
|
} while(startep!=ep);
|
||||||
|
assert(ep.IsBorder());
|
||||||
|
|
||||||
|
ScalarType totalLen=0;
|
||||||
|
ep.FlipV();
|
||||||
|
do // second loop to compute len of the chain.
|
||||||
|
{
|
||||||
|
ep.E()->SetV();
|
||||||
|
totalLen+=Distance(ep.V()->P(),ep.VFlip()->P());
|
||||||
|
ep.NextE();
|
||||||
|
} while(!ep.IsBorder());
|
||||||
|
totalLen+=Distance(ep.V()->P(),ep.VFlip()->P());
|
||||||
|
|
||||||
|
// Third loop actually perform the sampling.
|
||||||
|
int sampleNum = floor(totalLen / radius);
|
||||||
|
ScalarType sampleDist = totalLen/sampleNum;
|
||||||
|
printf("Found a chain of %f with %i samples every %f (%f)\n",totalLen,sampleNum,sampleDist,radius);
|
||||||
|
|
||||||
|
ScalarType curLen=0;
|
||||||
|
int sampleCnt=1;
|
||||||
|
assert(ep.IsBorder());
|
||||||
|
ps.AddEdge(*(ep.E()),ep.VInd()==0?0.0:1.0);
|
||||||
|
ep.FlipV();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ScalarType edgeLen = Distance(ep.V()->P(),ep.VFlip()->P());
|
||||||
|
ScalarType d0 = curLen;
|
||||||
|
ScalarType d1 = d0+edgeLen;
|
||||||
|
|
||||||
|
while(d1>sampleCnt*sampleDist)
|
||||||
|
{
|
||||||
|
ScalarType off = (sampleCnt*sampleDist-d0) /edgeLen;
|
||||||
|
printf("edgeLen %f off %f samplecnt %i\n",edgeLen,off,sampleCnt);
|
||||||
|
ps.AddEdge(*(ep.E()),ep.VInd()==0?1.0-off:off);
|
||||||
|
sampleCnt++;
|
||||||
|
}
|
||||||
|
curLen+=edgeLen;
|
||||||
|
ep.NextE();
|
||||||
|
} while(!ep.IsBorder());
|
||||||
|
assert(ep.IsBorder());
|
||||||
|
ps.AddEdge(*(ep.E()),ep.VInd()==0?0.0:1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// \brief Sample all the border corner vertices
|
/// \brief Sample all the border corner vertices
|
||||||
///
|
///
|
||||||
/// It assumes that the border flag have been set over the mesh both for vertex and for faces.
|
/// It assumes that the border flag have been set over the mesh both for vertex and for faces.
|
||||||
|
|
Loading…
Reference in New Issue