Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#include <iostream>
2
 
3
#include "Vertex.h"
4
#include "Manifold.h"
5
#include "VertexCirculator.h"
6
 
7
namespace HMesh
8
{
9
 
10
	using namespace std;
11
	using namespace CGLA;
12
 
13
	template<class R>
14
	Vertex_template<R>::Vertex_template(const CGLA::Vec3f& _pos): 
15
		he(NULL_HALFEDGE_ITER),
16
		pos(_pos),
17
		touched(0)
18
	{}
19
 
20
 
21
	template<class R>
22
	bool Vertex_template<R>::is_boundary()
23
	{
24
		return he->is_boundary();
25
	}
26
 
27
	template<class R>
28
	void Vertex_template<R>::check_boundary_consistency()
29
	{
30
		HalfEdgeIter h = he;
31
		HalfEdgeIter h0 = h;
32
#ifndef NDEBUG
33
		int k=0;
34
#endif
35
		while(h->face != NULL_FACE_ITER)
36
			{
37
				assert(h->prev != NULL_HALFEDGE_ITER);
38
				assert(h->prev->opp != NULL_HALFEDGE_ITER);
39
#ifndef NDEBUG
40
				if(++k == 1e6) 
41
					{
42
						cout << __FILE__ << __LINE__ 
43
								 << " : Oops infinite loop around vertex" << endl;
44
						return;
45
					}
46
#endif
47
				h = h->prev->opp;
48
				if(h==h0) return;
49
			}
50
 
51
		he = h;
52
		HalfEdgeIter h_opp = he->opp;
53
		while(h_opp->face != NULL_FACE_ITER)
54
			h_opp = h_opp->next->opp;
55
		h_opp->next = h;
56
		h->prev = h_opp;
57
	}
58
 
59
	int valency(VertexIter v) 
60
	{
61
		VertexCirculator vc(v);
62
		for(;!vc.end();++vc);
63
		return vc.no_steps();
64
	}
65
 
66
	const Vec3f normal(VertexIter v)
67
	{
68
		Vec3f p0 = v->get_pos();
69
		vector<Vec3f> one_ring;						
70
		for(VertexCirculator vc(v);!vc.end();++vc)
71
			{
72
				Vec3f p = vc.get_vertex()->get_pos();
73
				Vec3f edge = p-p0;
74
				float len = length(edge);
75
				if(len>0.0f)
76
					one_ring.push_back(edge/len);
77
			}
78
 
79
		Vec3f norm(0);
80
		int N= one_ring.size();
81
		for(int i=0;i<N;++i)
82
			{
83
				Vec3f e1 = one_ring[i];
84
				Vec3f e0 = one_ring[(i+1)%N];
85
				Vec3f n = normalize(cross(e0,e1));
86
				norm += n*acos(max(-1.0f,min(1.0f,dot(e0,e1))));
87
			}
88
		float l = sqr_length(norm);
89
		if(l>0.0f)
90
			return norm/sqrt(l);
91
 
92
		return norm;
93
	}
94
 
95
	bool is_connected(VertexIter v1, VertexIter v2)
96
	{
97
		vector<VertexIter> vertices;
98
		VertexCirculator vc(v1);
99
		for(;!vc.end();++vc)
100
			vertices.push_back(vc.get_vertex());
101
		if(find(vertices.begin(),vertices.end(),v2) != vertices.end())
102
			return true;
103
		return false;
104
	}
105
 
106
	VertexIter NULL_VERTEX_ITER(0);
107
 
108
	template class Vertex_template<Iters>;
109
}