Go to most recent revision | Blame | Last modification | View Log | RSS feed
#include <iostream>
#include "Vertex.h"
#include "Manifold.h"
#include "VertexCirculator.h"
namespace HMesh
{
using namespace std;
using namespace CGLA;
template<class R>
Vertex_template<R>::Vertex_template(const CGLA::Vec3f& _pos):
he(NULL_HALFEDGE_ITER),
pos(_pos),
touched(0)
{}
template<class R>
bool Vertex_template<R>::is_boundary()
{
return he->is_boundary();
}
template<class R>
void Vertex_template<R>::check_boundary_consistency()
{
HalfEdgeIter h = he;
HalfEdgeIter h0 = h;
#ifndef NDEBUG
int k=0;
#endif
while(h->face != NULL_FACE_ITER)
{
assert(h->prev != NULL_HALFEDGE_ITER);
assert(h->prev->opp != NULL_HALFEDGE_ITER);
#ifndef NDEBUG
if(++k == 1e6)
{
cout << __FILE__ << __LINE__
<< " : Oops infinite loop around vertex" << endl;
return;
}
#endif
h = h->prev->opp;
if(h==h0) return;
}
he = h;
HalfEdgeIter h_opp = he->opp;
while(h_opp->face != NULL_FACE_ITER)
h_opp = h_opp->next->opp;
h_opp->next = h;
h->prev = h_opp;
}
int valency(VertexIter v)
{
VertexCirculator vc(v);
for(;!vc.end();++vc);
return vc.no_steps();
}
const Vec3f normal(VertexIter v)
{
Vec3f p0 = v->get_pos();
vector<Vec3f> one_ring;
for(VertexCirculator vc(v);!vc.end();++vc)
{
Vec3f p = vc.get_vertex()->get_pos();
Vec3f edge = p-p0;
float len = length(edge);
if(len>0.0f)
one_ring.push_back(edge/len);
}
Vec3f norm(0);
int N= one_ring.size();
for(int i=0;i<N;++i)
{
Vec3f e1 = one_ring[i];
Vec3f e0 = one_ring[(i+1)%N];
Vec3f n = normalize(cross(e0,e1));
norm += n*acos(max(-1.0f,min(1.0f,dot(e0,e1))));
}
float l = sqr_length(norm);
if(l>0.0f)
return norm/sqrt(l);
return norm;
}
bool is_connected(VertexIter v1, VertexIter v2)
{
vector<VertexIter> vertices;
VertexCirculator vc(v1);
for(;!vc.end();++vc)
vertices.push_back(vc.get_vertex());
if(find(vertices.begin(),vertices.end(),v2) != vertices.end())
return true;
return false;
}
VertexIter NULL_VERTEX_ITER(0);
template class Vertex_template<Iters>;
}