*** empty log message ***
This commit is contained in:
parent
831a570d0b
commit
5334ca63b7
|
@ -31,23 +31,12 @@
|
||||||
#include <vcg/complex/tetramesh/update/topology.h>
|
#include <vcg/complex/tetramesh/update/topology.h>
|
||||||
#include <vcg/complex/tetramesh/update/normal.h>
|
#include <vcg/complex/tetramesh/update/normal.h>
|
||||||
|
|
||||||
//#include <vcg/complex/trimesh/edge_collapse.h>
|
|
||||||
//
|
|
||||||
////used to verify the edge collapse on the surface of the mesh
|
|
||||||
//#include <vcg/simplex/face/with/afav.h>
|
|
||||||
//#include <vcg/complex/trimesh/base.h>
|
|
||||||
//#include <vcg/complex/trimesh/update/topology.h>
|
|
||||||
|
|
||||||
#include <vcg/complex/tetramesh/update/triconvert.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace vcg{
|
namespace vcg{
|
||||||
namespace tetra{
|
namespace tetra{
|
||||||
|
|
||||||
/** \addtogroup tetramesh */
|
/** \addtogroup tetramesh */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
/// This Class is used for the edge collapse
|
/// This Class is used for the edge collapse
|
||||||
|
|
||||||
template <class TETRA_MESH_TYPE>
|
template <class TETRA_MESH_TYPE>
|
||||||
class EdgeCollapse
|
class EdgeCollapse
|
||||||
{
|
{
|
||||||
|
@ -83,11 +72,6 @@ class EdgeCollapse
|
||||||
/// Default Constructor
|
/// Default Constructor
|
||||||
EdgeCollapse()
|
EdgeCollapse()
|
||||||
{
|
{
|
||||||
c0=0;
|
|
||||||
flip=0;
|
|
||||||
lkv=0;
|
|
||||||
lke=0;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
~EdgeCollapse()
|
~EdgeCollapse()
|
||||||
|
@ -98,16 +82,9 @@ class EdgeCollapse
|
||||||
vector<TetraType*> To_Del;
|
vector<TetraType*> To_Del;
|
||||||
Topology _Topo;
|
Topology _Topo;
|
||||||
UpdateNormals _UN;
|
UpdateNormals _UN;
|
||||||
typedef pair <VertexType*,VertexType*> VertPair;
|
//typedef pair <VertexType*,VertexType*> VertPair;
|
||||||
typedef pair <int,int> FacePair;
|
typedef pair <int,int> FacePair;
|
||||||
|
|
||||||
public:
|
|
||||||
int c0;
|
|
||||||
int flip;
|
|
||||||
int lkv;
|
|
||||||
int lke;
|
|
||||||
|
|
||||||
private:
|
|
||||||
///select the 2 faces that does not share the edge
|
///select the 2 faces that does not share the edge
|
||||||
FacePair _FindNoEdgeFace(TetraType *t,int edge)
|
FacePair _FindNoEdgeFace(TetraType *t,int edge)
|
||||||
{
|
{
|
||||||
|
@ -129,23 +106,7 @@ FacePair _FindNoEdgeFace(TetraType *t,int edge)
|
||||||
return FacePair(fa2,fa3);
|
return FacePair(fa2,fa3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///Connect trought Tetrahedron-Tetrahedron Topology t0 and t1 with faces i0 and i1
|
|
||||||
void _ConnectTTTopology(TetraType *t0,int i0,TetraType *t1,int i1)
|
|
||||||
{
|
|
||||||
assert((i0>=0)&&(i0<4));
|
|
||||||
assert((i1>=0)&&(i1<4));
|
|
||||||
assert((!t0->IsD())&&(!t1->IsD()));
|
|
||||||
t0->TTp(i0)=t1;
|
|
||||||
t0->TTi(i0)=i1;
|
|
||||||
t1->TTp(i1)=t0;
|
|
||||||
t1->TTi(i1)=i0;
|
|
||||||
assert( (((t0->TTp(i0))->TTp(t0->TTi(i0)))==t0));
|
|
||||||
assert( (((t1->TTp(i1))->TTp(t1->TTi(i1)))==t1));
|
|
||||||
}
|
|
||||||
|
|
||||||
///Calculate the volume on the vertex resulting after collapse...
|
///Calculate the volume on the vertex resulting after collapse...
|
||||||
|
|
||||||
ScalarType _VolumeSimulateCollapse(PosType Pos,ScalarType alfa)
|
ScalarType _VolumeSimulateCollapse(PosType Pos,ScalarType alfa)
|
||||||
{
|
{
|
||||||
VertexType *Vrem=(Pos.T()->V(Tetra::VofE(Pos.E(),0)));
|
VertexType *Vrem=(Pos.T()->V(Tetra::VofE(Pos.E(),0)));
|
||||||
|
@ -197,8 +158,8 @@ void _AssertingVolume(TetraType *t)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
///collpse de edge specified by pos (the first vertex on edge remain)
|
|
||||||
|
|
||||||
|
///collpse de edge specified by pos (the first vertex on edge remain)
|
||||||
void _Collapse(PosType p,ScalarType alfa)
|
void _Collapse(PosType p,ScalarType alfa)
|
||||||
{
|
{
|
||||||
VertexType *Vrem=(p.T()->V(Tetra::VofE(p.E(),0)));
|
VertexType *Vrem=(p.T()->V(Tetra::VofE(p.E(),0)));
|
||||||
|
@ -227,7 +188,7 @@ void _Collapse(PosType p,ScalarType alfa)
|
||||||
//case no one is extern face
|
//case no one is extern face
|
||||||
if ((!pos.T()->IsBorderF(fa0))&&(!pos.T()->IsBorderF(fa1)))
|
if ((!pos.T()->IsBorderF(fa0))&&(!pos.T()->IsBorderF(fa1)))
|
||||||
//connect the 2 tetrahedrons
|
//connect the 2 tetrahedrons
|
||||||
_ConnectTTTopology(tleft,ileft,tright,iright);
|
_Topo._AttachTTTopology(tleft,ileft,tright,iright);
|
||||||
else
|
else
|
||||||
//case f2 is an extern face
|
//case f2 is an extern face
|
||||||
if (pos.T()->IsBorderF(fa0))
|
if (pos.T()->IsBorderF(fa0))
|
||||||
|
@ -395,114 +356,7 @@ struct TetraSets
|
||||||
|
|
||||||
TetraSets _Sets;
|
TetraSets _Sets;
|
||||||
|
|
||||||
/////verify if the collapse can done looking to the edges
|
///verify the link conditions on faces
|
||||||
//bool _LinkConditionsE(PosType pos)
|
|
||||||
//{
|
|
||||||
// const int LINK_V0 = 0x00000001;
|
|
||||||
// const int LINK_EE = 0x00000002;
|
|
||||||
//
|
|
||||||
// EdgeMark.clear();
|
|
||||||
//
|
|
||||||
// // Mark edges of ve0
|
|
||||||
// vector< TetraType *>::iterator ti=_Sets.v0.begin();
|
|
||||||
// vector< char >::iterator en=_Sets.indexv0.begin();
|
|
||||||
// while (ti!=_Sets.v0.end())
|
|
||||||
// {
|
|
||||||
// for(int i=0;i<6;i++)
|
|
||||||
// //put the edge of each tetrahedron on the map
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofE(i,0)),(*ti)->V(Tetra::VofE(i,1))),LINK_V0);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// //put dummy edge
|
|
||||||
// for (int f=0;f<3;f++)
|
|
||||||
// {
|
|
||||||
// int f_test=Tetra::FofV((*en),f);
|
|
||||||
// if ((*ti)->IsBorderF(f_test))
|
|
||||||
// {
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f_test,0)),&_dummyV),LINK_V0);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f_test,1)),&_dummyV),LINK_V0);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f_test,2)),&_dummyV),LINK_V0);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ti++;
|
|
||||||
// en++;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ti=_Sets.E.begin();
|
|
||||||
// en=_Sets.indexE.begin();
|
|
||||||
// //mark them as intersection
|
|
||||||
// while (ti!=_Sets.E.end())
|
|
||||||
// {
|
|
||||||
// for(int i=0;i<6;i++)
|
|
||||||
// //put the edge of each tetrahedron on the map
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofE(i,0)),(*ti)->V(Tetra::VofE(i,1))),LINK_EE);
|
|
||||||
// // //edges with dummy vertex
|
|
||||||
//
|
|
||||||
// //faces on the edge
|
|
||||||
// int f0=Tetra::FofE((*en),0);
|
|
||||||
// int f1=Tetra::FofE((*en),1);
|
|
||||||
//
|
|
||||||
// if ((*ti)->IsBorderF(f0))
|
|
||||||
// {
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f0,0)),&_dummyV),LINK_EE);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f0,1)),&_dummyV),LINK_EE);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f0,2)),&_dummyV),LINK_EE);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if ((*ti)->IsBorderF(f1))
|
|
||||||
// {
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f1,0)),&_dummyV),LINK_EE);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f1,1)),&_dummyV),LINK_EE);
|
|
||||||
// orMarkE(Edge((*ti)->V(Tetra::VofF(f1,2)),&_dummyV),LINK_EE);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ti++;
|
|
||||||
// en++;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //and at the end I verify if the intersection is equal to the star of the edge
|
|
||||||
// ti=_Sets.v1.begin();
|
|
||||||
// en=_Sets.indexv1.begin();
|
|
||||||
// while (ti!=_Sets.v1.end())
|
|
||||||
// {
|
|
||||||
// for(int i=0;i<6;i++)
|
|
||||||
// {
|
|
||||||
// Edge e_test=Edge((*ti)->V(Tetra::VofE(i,0)),(*ti)->V(Tetra::VofE(i,1)));
|
|
||||||
// if ((isMarkedE(e_test,LINK_V0))&&(!isMarkedE(e_test,LINK_EE)))
|
|
||||||
// {
|
|
||||||
// lke++;
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //dummy edges control
|
|
||||||
// //put dummy edge
|
|
||||||
// for (int f=0;f<3;f++)
|
|
||||||
// {
|
|
||||||
// int f_test=Tetra::FofV((*en),f);
|
|
||||||
// if ((*ti)->IsBorderF(f_test))
|
|
||||||
// {
|
|
||||||
// //control all the 3 edges
|
|
||||||
// Edge e_test0=Edge((*ti)->V(Tetra::VofF(f_test,0)),&_dummyV);
|
|
||||||
// Edge e_test1=Edge((*ti)->V(Tetra::VofF(f_test,1)),&_dummyV);
|
|
||||||
// Edge e_test2=Edge((*ti)->V(Tetra::VofF(f_test,2)),&_dummyV);
|
|
||||||
// if (((isMarkedE(e_test0,LINK_V0))&&(!isMarkedE(e_test0,LINK_EE)))||
|
|
||||||
// ((isMarkedE(e_test1,LINK_V0))&&(!isMarkedE(e_test1,LINK_EE)))||
|
|
||||||
// ((isMarkedE(e_test2,LINK_V0))&&(!isMarkedE(e_test2,LINK_EE))))
|
|
||||||
// {
|
|
||||||
// lke++;
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ti++;
|
|
||||||
// en++;
|
|
||||||
// }
|
|
||||||
// return true;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
///verify if the collapse can done looking to the edges
|
|
||||||
bool _LinkConditionsF(PosType pos)
|
bool _LinkConditionsF(PosType pos)
|
||||||
{
|
{
|
||||||
const int LINK_V0 = 0x00000001;
|
const int LINK_V0 = 0x00000001;
|
||||||
|
@ -576,10 +430,7 @@ bool _LinkConditionsF(PosType pos)
|
||||||
if (((isMarkedF(f_test0,LINK_V0))&&(!isMarkedF(f_test0,LINK_EE)))||
|
if (((isMarkedF(f_test0,LINK_V0))&&(!isMarkedF(f_test0,LINK_EE)))||
|
||||||
((isMarkedF(f_test1,LINK_V0))&&(!isMarkedF(f_test1,LINK_EE)))||
|
((isMarkedF(f_test1,LINK_V0))&&(!isMarkedF(f_test1,LINK_EE)))||
|
||||||
((isMarkedF(f_test2,LINK_V0))&&(!isMarkedF(f_test2,LINK_EE))))
|
((isMarkedF(f_test2,LINK_V0))&&(!isMarkedF(f_test2,LINK_EE))))
|
||||||
{
|
|
||||||
lke++;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ti++;
|
ti++;
|
||||||
|
@ -588,7 +439,7 @@ bool _LinkConditionsF(PosType pos)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
///verify if the collapse can done looking to the edges
|
///verify the link conditions on edges
|
||||||
bool _LinkConditionsE(PosType pos)
|
bool _LinkConditionsE(PosType pos)
|
||||||
{
|
{
|
||||||
const int LINK_V0 = 0x00000001;
|
const int LINK_V0 = 0x00000001;
|
||||||
|
@ -662,10 +513,7 @@ bool _LinkConditionsE(PosType pos)
|
||||||
if (((isMarkedE(e_test0,LINK_V0))&&(!isMarkedE(e_test0,LINK_EE)))||
|
if (((isMarkedE(e_test0,LINK_V0))&&(!isMarkedE(e_test0,LINK_EE)))||
|
||||||
((isMarkedE(e_test1,LINK_V0))&&(!isMarkedE(e_test1,LINK_EE)))||
|
((isMarkedE(e_test1,LINK_V0))&&(!isMarkedE(e_test1,LINK_EE)))||
|
||||||
((isMarkedE(e_test2,LINK_V0))&&(!isMarkedE(e_test2,LINK_EE))))
|
((isMarkedE(e_test2,LINK_V0))&&(!isMarkedE(e_test2,LINK_EE))))
|
||||||
{
|
|
||||||
lke++;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ti++;
|
ti++;
|
||||||
|
@ -674,8 +522,8 @@ bool _LinkConditionsE(PosType pos)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
///verify the link conditions for a collapse using vertices
|
|
||||||
|
|
||||||
|
///verify the link conditions on vertices
|
||||||
bool _LinkConditionsV()
|
bool _LinkConditionsV()
|
||||||
{
|
{
|
||||||
const int LINK_V0 = VertexType::NewUserBit();
|
const int LINK_V0 = VertexType::NewUserBit();
|
||||||
|
@ -789,7 +637,6 @@ bool _LinkConditionsV()
|
||||||
VertexType::DeleteUserBit(LINK_EE);
|
VertexType::DeleteUserBit(LINK_EE);
|
||||||
VertexType::DeleteUserBit(LINK_V1);
|
VertexType::DeleteUserBit(LINK_V1);
|
||||||
VertexType::DeleteUserBit(LINK_V0);
|
VertexType::DeleteUserBit(LINK_V0);
|
||||||
lkv++;
|
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
en++;
|
en++;
|
||||||
|
@ -801,7 +648,7 @@ bool _LinkConditionsV()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
///verify the flip conditions for a collapse
|
///verify the flip condition
|
||||||
bool _FlipCondition(PosType pos,ScalarType alfa)
|
bool _FlipCondition(PosType pos,ScalarType alfa)
|
||||||
{
|
{
|
||||||
int edge=pos.E();
|
int edge=pos.E();
|
||||||
|
@ -837,7 +684,6 @@ bool _FlipCondition(PosType pos,ScalarType alfa)
|
||||||
{
|
{
|
||||||
ve0->P()=oldpos0;
|
ve0->P()=oldpos0;
|
||||||
ve1->P()=oldpos1;
|
ve1->P()=oldpos1;
|
||||||
flip++;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ti++;
|
ti++;
|
||||||
|
@ -887,7 +733,7 @@ ScalarType AspectRatioCollapsed(PosType p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///check the link conditions for the collapse indicated by pos
|
///check the topologycal preserving conditions for the collapse indicated by pos
|
||||||
bool CheckPreconditions(PosType pos,ScalarType alfa)
|
bool CheckPreconditions(PosType pos,ScalarType alfa)
|
||||||
{
|
{
|
||||||
VertexType *v0=pos.T()->V(Tetra::VofE(pos.E(),0));
|
VertexType *v0=pos.T()->V(Tetra::VofE(pos.E(),0));
|
||||||
|
@ -900,11 +746,8 @@ bool CheckPreconditions(PosType pos,ScalarType alfa)
|
||||||
|
|
||||||
//first case vertex external and edge internal
|
//first case vertex external and edge internal
|
||||||
if ((border0 && border1)&&(!bordere))
|
if ((border0 && border1)&&(!bordere))
|
||||||
{
|
|
||||||
c0++;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
else
|
||||||
else
|
|
||||||
//if both vertex are internal so is enougth to verify flip conditions
|
//if both vertex are internal so is enougth to verify flip conditions
|
||||||
if ((!border0) && (!border1))
|
if ((!border0) && (!border1))
|
||||||
return (_FlipCondition(pos,alfa));
|
return (_FlipCondition(pos,alfa));
|
|
@ -393,6 +393,20 @@ void TTTopology(VertexContainer &vert,TetraContainer &tetra)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///Connect trought Tetrahedron-Tetrahedron Topology t0 and t1 with faces i0 and i1
|
||||||
|
void _AttachTTTopology(TetraType *t0,int i0,TetraType *t1,int i1)
|
||||||
|
{
|
||||||
|
assert((i0>=0)&&(i0<4));
|
||||||
|
assert((i1>=0)&&(i1<4));
|
||||||
|
assert((!t0->IsD())&&(!t1->IsD()));
|
||||||
|
t0->TTp(i0)=t1;
|
||||||
|
t0->TTi(i0)=i1;
|
||||||
|
t1->TTp(i1)=t0;
|
||||||
|
t1->TTi(i1)=i0;
|
||||||
|
assert( (((t0->TTp(i0))->TTp(t0->TTi(i0)))==t0));
|
||||||
|
assert( (((t1->TTp(i1))->TTp(t1->TTi(i1)))==t1));
|
||||||
|
}
|
||||||
|
|
||||||
///Test the Tetrahedron-Tetrahedron Topology (by Face)
|
///Test the Tetrahedron-Tetrahedron Topology (by Face)
|
||||||
void TestTTTopology(VertexContainer &vert,TetraContainer &tetra)
|
void TestTTTopology(VertexContainer &vert,TetraContainer &tetra)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue