Subversion Repositories gelsvn

Rev

Rev 121 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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