Subversion Repositories gelsvn

Rev

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

Rev 363 Rev 393
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
 
29
 
30
				while(h->face != NULL_FACE_ITER)
30
				while(h->face != NULL_FACE_ITER)
31
				{
31
				{
32
						h = h->prev->opp;
32
						h = h->prev->opp;
33
						if(h==h0) return;
33
						if(h==h0) return;
34
				}
34
				}
35
 
35
 
36
				v->he = h;
36
				v->he = h;
37
				HalfEdgeIter h_opp = h->opp;
37
				HalfEdgeIter h_opp = h->opp;
38
				while(h_opp->face != NULL_FACE_ITER)
38
				while(h_opp->face != NULL_FACE_ITER)
39
						h_opp = h_opp->next->opp;
39
						h_opp = h_opp->next->opp;
40
				h_opp->vert = v;
40
				h_opp->vert = v;
41
				link(h_opp,h);
41
				link(h_opp,h);
42
		}
42
		}
43
 
43
 
44
		int valency(VertexIter v) 
44
		int valency(VertexIter v) 
45
		{
45
		{
46
				VertexCirculator vc(v);
46
				VertexCirculator vc(v);
47
				for(;!vc.end();++vc);
47
				for(;!vc.end();++vc);
48
				return vc.no_steps();
48
				return vc.no_steps();
49
		}
49
		}
50
 
50
 
51
		const Vec3f normal(VertexIter v)
51
		const Vec3f normal(VertexIter v)
52
		{
52
		{
53
				Vec3f p0 = v->pos;
53
				Vec3f p0 = v->pos;
54
				vector<Vec3f> one_ring;						
54
				vector<Vec3f> one_ring;						
55
				for(VertexCirculator vc(v);!vc.end();++vc)
55
				for(VertexCirculator vc(v);!vc.end();++vc)
56
				{
56
				{
57
						Vec3f p = vc.get_vertex()->pos;
57
						Vec3f p = vc.get_vertex()->pos;
58
						Vec3f edge = p-p0;
58
						Vec3f edge = p-p0;
59
						float len = length(edge);
59
						float len = length(edge);
60
						if(len>0.0f)
60
						if(len>0.0f)
61
								one_ring.push_back(edge/len);
61
								one_ring.push_back(edge/len);
62
				}
62
				}
63
		
63
		
64
				Vec3f norm(0);
64
				Vec3f norm(0);
65
				int N = one_ring.size();
65
				int N = one_ring.size();
66
				for(int i=0;i<N-1;++i)
66
				for(int i=0;i<N-1;++i)
67
				{
67
				{
68
						Vec3f e1 = one_ring[i];
68
						Vec3f e1 = one_ring[i];
69
						Vec3f e0 = one_ring[(i+1)%N];
69
						Vec3f e0 = one_ring[(i+1)%N];
70
						Vec3f n = normalize(cross(e0,e1));
70
						Vec3f n = normalize(cross(e0,e1));
71
						norm += n*acos(max(-1.0f,min(1.0f,dot(e0,e1))));
71
						norm += n*acos(max(-1.0f,min(1.0f,dot(e0,e1))));
72
				}
72
				}
73
				float l = sqr_length(norm);
73
				float l = sqr_length(norm);
74
				if(l>0.0f)
74
				if(l>0.0f)
75
						return norm/sqrt(l);
75
						return norm/sqrt(l);
76
		
76
		
77
				return norm;
77
				return norm;
78
		}
78
		}
79
 
79
 
80
		bool is_connected(VertexIter v1, VertexIter v2)
80
		bool is_connected(VertexIter v1, VertexIter v2)
81
		{
81
		{
82
				vector<VertexIter> vertices;
82
				vector<VertexIter> vertices;
83
				VertexCirculator vc(v1);
83
				VertexCirculator vc(v1);
84
				for(;!vc.end();++vc)
84
				for(;!vc.end();++vc)
85
						vertices.push_back(vc.get_vertex());
85
						vertices.push_back(vc.get_vertex());
86
				if(find(vertices.begin(),vertices.end(),v2) != vertices.end())
86
				if(find(vertices.begin(),vertices.end(),v2) != vertices.end())
87
						return true;
87
						return true;
88
				return false;
88
				return false;
89
		}
89
		}
90
 
90
 
91
		template struct Vertex_template<Iters>;	
91
		template struct Vertex_template<Iters>;	
92
 
92
 
93
}
93
}
94
 
94