Subversion Repositories gelsvn

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#include <vector>
2
#include "CGLA/Mat3x3f.h"
3
#include "CGLA/Vec2f.h"
4
#include "Face.h"
5
#include "Manifold.h"
6
#include "FaceCirculator.h"
7
 
8
using namespace CGLA;
9
using namespace std;
10
 
11
namespace HMesh
12
{
444 jab 13
	FaceIter get_null_face_iter()
14
	{
15
		static FaceList l;
16
		return l.end();
17
	}
18
 
19
	template<class R>
20
	Face_template<R>::Face_template(): 
21
	last(NULL_HALFEDGE_ITER),
22
	touched(0)
23
	{}
24
 
25
	int no_edges(FaceIter f)
26
	{
27
		FaceCirculator fc(f);
28
		while(!fc.end()) ++fc;
29
		return fc.no_steps();
30
	}
31
 
32
	Vec3f normal(FaceIter f)
33
	{
34
		vector<Vec3f> v;
35
		FaceCirculator fc(f);
36
		int k;
37
		for(k=0;!fc.end();++fc,++k)
129 jab 38
		{
444 jab 39
			Vec3f p = fc.get_vertex()->pos;
40
			v.push_back(p);
129 jab 41
		}
444 jab 42
		Vec3f norm(0);
43
		for(int i=0;i<k;++i)
129 jab 44
		{
444 jab 45
			norm[0] += (v[i][1]-v[(i+1)%k][1])*(v[i][2]+v[(i+1)%k][2]);
46
			norm[1] += (v[i][2]-v[(i+1)%k][2])*(v[i][0]+v[(i+1)%k][0]);
47
			norm[2] += (v[i][0]-v[(i+1)%k][0])*(v[i][1]+v[(i+1)%k][1]);
129 jab 48
		}
444 jab 49
		float l = norm.length();
50
		if(l>0.0f)
51
			norm /= l;
52
		return norm;
53
	}
54
 
55
	float area(FaceIter f)
56
	{
57
		FaceCirculator fc(f);
58
		int k;
59
 
60
		// M is a matrix that projects a vector onto the orthogonal
61
		// complement of the face normal
62
		Vec3f n = normal(f);
63
		Vec3f a,b;
64
		orthogonal(n, a, b);
65
		Mat3x3f M(a,b,n);
66
 
67
		// Get all projected vertices
68
		vector<Vec2f> v;		
69
		for(k=0;!fc.end();++fc,++k)
129 jab 70
		{
444 jab 71
			Vec3f p = M * fc.get_vertex()->pos;
72
			v.push_back(Vec2f(p[0], p[1]));
129 jab 73
		}
444 jab 74
		float area = 0;
75
		for(int i=0;i<k;++i)
129 jab 76
		{
444 jab 77
			area += 0.5 * cross(v[i], v[(i+1)%k]);
129 jab 78
		}
444 jab 79
		return fabs(area);
80
	}
81
 
82
	Vec3f centre(FaceIter f)
83
	{
84
		Vec3f c(0);
85
		FaceCirculator fc(f);
86
		while(!fc.end())
87
		{
88
			c += fc.get_vertex()->pos;
89
			++fc;
90
		}
91
		c /= fc.no_steps();
92
		return c;
93
	}
94
 
95
	template struct Face_template<Iters>;	
96
 
39 bj 97
}