Subversion Repositories gelsvn

Rev

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