Added EdgeBarycentricToFaceBarycentric to convert an edge position into a face barycentric position

This commit is contained in:
Paolo Cignoni 2013-06-24 07:31:11 +00:00
parent 5049407069
commit 49d759af2a
1 changed files with 35 additions and 26 deletions

View File

@ -42,6 +42,7 @@ class UpdateTopology
public: public:
typedef UpdateMeshType MeshType; typedef UpdateMeshType MeshType;
typedef typename MeshType::ScalarType ScalarType;
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;
@ -63,39 +64,47 @@ class PEdge
{ {
public: public:
VertexPointer v[2]; // the two Vertex pointer are ordered! VertexPointer v[2]; // the two Vertex pointer are ordered!
FacePointer f; // the face where this edge belong FacePointer f; // the face where this edge belong
int z; // index in [0..2] of the edge of the face int z; // index in [0..2] of the edge of the face
PEdge() {} PEdge() {}
void Set( FacePointer pf, const int nz ) void Set( FacePointer pf, const int nz )
{ {
assert(pf!=0); assert(pf!=0);
assert(nz>=0); assert(nz>=0);
assert(nz<pf->VN()); assert(nz<pf->VN());
v[0] = pf->V(nz); v[0] = pf->V(nz);
v[1] = pf->V(pf->Next(nz)); v[1] = pf->V(pf->Next(nz));
assert(v[0] != v[1]); // The face pointed by 'f' is Degenerate (two coincident vertexes) assert(v[0] != v[1]); // The face pointed by 'f' is Degenerate (two coincident vertexes)
if( v[0] > v[1] ) math::Swap(v[0],v[1]); if( v[0] > v[1] ) math::Swap(v[0],v[1]);
f = pf; f = pf;
z = nz; z = nz;
} }
inline bool operator < ( const PEdge & pe ) const inline bool operator < ( const PEdge & pe ) const
{ {
if( v[0]<pe.v[0] ) return true; if( v[0]<pe.v[0] ) return true;
else if( v[0]>pe.v[0] ) return false; else if( v[0]>pe.v[0] ) return false;
else return v[1] < pe.v[1]; else return v[1] < pe.v[1];
} }
inline bool operator == ( const PEdge & pe ) const
{
return v[0]==pe.v[0] && v[1]==pe.v[1];
}
inline bool operator == ( const PEdge & pe ) const
{
return v[0]==pe.v[0] && v[1]==pe.v[1];
}
/// Convert from edge barycentric coord to the face baricentric coord a point on the current edge.
/// Face barycentric coordinates are relative to the edge face.
inline Point3<ScalarType> EdgeBarycentricToFaceBarycentric(ScalarType u) const
{
Point3<ScalarType> interp(0,0,0);
interp[ this->z ] = u;
interp[(this->z+1)%3] = 1.0f-u;
return interp;
}
}; };
// Fill a vector with all the edges of the mesh. // Fill a vector with all the edges of the mesh.