Subversion Repositories gelsvn

Rev

Rev 363 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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