added division of edge operation
This commit is contained in:
parent
d18f2f9f39
commit
e591c644be
|
@ -46,16 +46,124 @@ namespace vcg{
|
||||||
f1->FFi(z1)=z0;
|
f1->FFi(z1)=z0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class MESH_TYPE>
|
||||||
|
///insert a vertex iside a face and re-triangolarize v will be pointer to inserted vertex
|
||||||
|
void InsertVertEdge(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,int edge,typename MESH_TYPE::VertexType *&v)
|
||||||
|
{
|
||||||
|
std::vector<MESH_TYPE::FaceType **> local_var;
|
||||||
|
local_var.push_back(f);
|
||||||
|
MESH_TYPE::VertexIterator Vi=vcg::tri::Allocator<MESH_TYPE>::AddVertices(m,1);
|
||||||
|
MESH_TYPE::FaceIterator Finit=vcg::tri::Allocator<MESH_TYPE>::AddFaces(m,4,local_var);
|
||||||
|
|
||||||
|
if (MESH_TYPE::HasVFTopology())
|
||||||
|
Vi->VFp()=0;
|
||||||
|
|
||||||
|
MESH_TYPE::FaceIterator Fi=Finit;
|
||||||
|
|
||||||
|
|
||||||
|
//take new faces added
|
||||||
|
MESH_TYPE::FaceType *Fr0=&(*Fi);
|
||||||
|
Fi++;
|
||||||
|
MESH_TYPE::FaceType *Fr1=&(*Fi);
|
||||||
|
Fi++;
|
||||||
|
MESH_TYPE::FaceType *Fl0=&(*Fi);
|
||||||
|
Fi++;
|
||||||
|
MESH_TYPE::FaceType *Fl1=&(*Fi);
|
||||||
|
|
||||||
|
//old faces
|
||||||
|
MESH_TYPE::FaceType *fdl=(*f);
|
||||||
|
MESH_TYPE::FaceType *fdr=(*f)->FFp(edge);
|
||||||
|
|
||||||
|
int edgel=edge;
|
||||||
|
int edger=(*f)->FFi(edge);
|
||||||
|
|
||||||
|
//opposite vertex used to build new triangles
|
||||||
|
MESH_TYPE::VertexType *voppl=fdl->V((edgel+2)%3);
|
||||||
|
MESH_TYPE::VertexType *voppr=fdr->V((edger+2)%3);
|
||||||
|
|
||||||
|
//inizialize the for new faces
|
||||||
|
Fl0->V(0)=voppl;
|
||||||
|
Fl0->V(1)=fdl->V(edgel);
|
||||||
|
Fl0->V(2)=&(*Vi);
|
||||||
|
Fl1->V(0)=voppl;
|
||||||
|
Fl1->V(1)=&(*Vi);
|
||||||
|
Fl1->V(2)=fdl->V((edgel+1)%3);
|
||||||
|
|
||||||
|
Fr0->V(0)=voppr;
|
||||||
|
Fr0->V(1)=&(*Vi);
|
||||||
|
Fr0->V(2)=fdr->V((edger+1)%3);
|
||||||
|
Fr1->V(0)=voppr;
|
||||||
|
Fr1->V(1)=fdr->V(edger);
|
||||||
|
Fr1->V(2)=&(*Vi);
|
||||||
|
|
||||||
|
//VFTopology setting
|
||||||
|
if (MESH_TYPE::HasVFTopology())
|
||||||
|
{
|
||||||
|
for (int i=0;i<3;i++)
|
||||||
|
{
|
||||||
|
//initial settings
|
||||||
|
Fl0->VFp(i)=0;
|
||||||
|
Fl1->VFp(i)=0;
|
||||||
|
Fr0->VFp(i)=0;
|
||||||
|
Fr1->VFp(i)=0;
|
||||||
|
|
||||||
|
//append new faces to VF topology
|
||||||
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(Fl0,i);
|
||||||
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(Fl1,i);
|
||||||
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(Fr0,i);
|
||||||
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(Fr1,i);
|
||||||
|
|
||||||
|
//erase old faces from VF topology
|
||||||
|
vcg::face::VFDetach<MESH_TYPE::FaceType>((*fdl),i);
|
||||||
|
vcg::face::VFDetach<MESH_TYPE::FaceType>((*fdr),i);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//FFTopology setting
|
||||||
|
if (MESH_TYPE::HasFFTopology())
|
||||||
|
{
|
||||||
|
//attach old faces that was attached by
|
||||||
|
//the one that should be substituted
|
||||||
|
FFAttach(Fl0,0,fdl->FFp((edgel+2)%3),fdl->FFi((edgel+2)%3));
|
||||||
|
FFAttach(Fl1,2,fdl->FFp((edgel+1)%3),fdl->FFi((edgel+1)%3));
|
||||||
|
|
||||||
|
FFAttach(Fr0,2,fdr->FFp((edger+1)%3),fdr->FFi((edger+1)%3));
|
||||||
|
FFAttach(Fr1,0,fdr->FFp((edger+2)%3),fdr->FFi((edger+2)%3));
|
||||||
|
|
||||||
|
//then connect between thenselfes
|
||||||
|
|
||||||
|
FFAttach(Fl0,2,Fl1,0);
|
||||||
|
FFAttach(Fl0,1,Fr0,1);
|
||||||
|
|
||||||
|
FFAttach(Fl1,1,Fr1,1);
|
||||||
|
FFAttach(Fr0,0,Fr1,2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//finally set as deleted the old faces
|
||||||
|
fdl->SetD();
|
||||||
|
fdr->SetD();
|
||||||
|
v=&(*Vi);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <class MESH_TYPE>
|
template <class MESH_TYPE>
|
||||||
///insert a vertex iside a face and re-triangolarize v will be pointer to inserted vertex
|
///insert a vertex iside a face and re-triangolarize v will be pointer to inserted vertex
|
||||||
void InsertVert(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,typename MESH_TYPE::VertexType *&v)
|
void InsertVertFace(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,typename MESH_TYPE::VertexType *&v)
|
||||||
{
|
{
|
||||||
|
assert(!(*f)->IsD());
|
||||||
std::vector<MESH_TYPE::FaceType **> local_var;
|
std::vector<MESH_TYPE::FaceType **> local_var;
|
||||||
local_var.push_back(f);
|
local_var.push_back(f);
|
||||||
MESH_TYPE::VertexIterator Vi=vcg::tri::Allocator<MESH_TYPE>::AddVertices(m,1);
|
MESH_TYPE::VertexIterator Vi=vcg::tri::Allocator<MESH_TYPE>::AddVertices(m,1);
|
||||||
MESH_TYPE::FaceIterator Finit=vcg::tri::Allocator<MESH_TYPE>::AddFaces(m,3,local_var);
|
MESH_TYPE::FaceIterator Finit=vcg::tri::Allocator<MESH_TYPE>::AddFaces(m,3,local_var);
|
||||||
|
|
||||||
|
if (MESH_TYPE::HasVFTopology())
|
||||||
|
Vi->VFp()=0;
|
||||||
|
|
||||||
MESH_TYPE::FaceIterator Fi=Finit;
|
MESH_TYPE::FaceIterator Fi=Finit;
|
||||||
MESH_TYPE::FaceType *F;
|
MESH_TYPE::FaceType *F;
|
||||||
MESH_TYPE::FaceType *fd=(*f);
|
MESH_TYPE::FaceType *fd=(*f);
|
||||||
|
@ -81,6 +189,9 @@ namespace vcg{
|
||||||
|
|
||||||
if (MESH_TYPE::HasVFTopology())
|
if (MESH_TYPE::HasVFTopology())
|
||||||
{
|
{
|
||||||
|
F->VFp(0)=0;
|
||||||
|
F->VFp(1)=0;
|
||||||
|
F->VFp(2)=0;
|
||||||
//put new faces on list of the old vertex and new one
|
//put new faces on list of the old vertex and new one
|
||||||
vcg::face::VFAppend<MESH_TYPE::FaceType>(F,0);
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(F,0);
|
||||||
vcg::face::VFAppend<MESH_TYPE::FaceType>(F,1);
|
vcg::face::VFAppend<MESH_TYPE::FaceType>(F,1);
|
||||||
|
|
Loading…
Reference in New Issue