Subversion Repositories gelsvn

Rev

Rev 363 | Go to most recent revision | Details | Compare with Previous | 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
{
444 jab 9
	using namespace std;
10
	using namespace CGLA;
11
 
12
	VertexIter get_null_vertex_iter()
13
	{
14
		static VertexList l;
15
		return l.end();
16
	}
17
 
18
 
19
	template<class R>
20
	Vertex_template<R>::Vertex_template(const CGLA::Vec3f& _pos): 
21
	he(NULL_HALFEDGE_ITER),
22
	pos(_pos),
23
	touched(0)
24
	{}
25
 
26
	bool is_boundary(VertexIter v)
27
	{
28
		return is_boundary(v->he);
29
	}
30
 
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)
129 jab 37
		{
444 jab 38
			h = h->prev->opp;
39
			if(h==h0) return;
129 jab 40
		}
444 jab 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
	}
49
 
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)
129 jab 62
		{
444 jab 63
			Vec3f p = vc.get_vertex()->pos;
64
			Vec3f edge = p-p0;
65
			float len = length(edge);
66
			if(len>0.0f)
67
				one_ring.push_back(edge/len);
129 jab 68
		}
444 jab 69
 
70
		Vec3f norm(0);
71
		int N = one_ring.size();
72
		for(int i=0;i<N-1;++i)
129 jab 73
		{
444 jab 74
			Vec3f e1 = one_ring[i];
75
			Vec3f e0 = one_ring[(i+1)%N];
76
			Vec3f n = normalize(cross(e0,e1));
77
			norm += n*acos(max(-1.0f,min(1.0f,dot(e0,e1))));
129 jab 78
		}
444 jab 79
		float l = sqr_length(norm);
80
		if(l>0.0f)
81
			return norm/sqrt(l);
39 bj 82
 
444 jab 83
		return norm;
84
	}
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
 
97
	template struct Vertex_template<Iters>;	
98
 
39 bj 99
}