Subversion Repositories gelsvn

Rev

Rev 54 | Go to most recent revision | Details | Compare with Previous | 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
{
13
	template<class R>
14
	Face_template<R>::Face_template(): 
15
		last(NULL_HALFEDGE_ITER),
16
		touched(0)
17
	{}
18
 
19
	FaceIter NULL_FACE_ITER(0);
20
 
21
	template class Face_template<Iters>;
22
 
23
	int no_edges(FaceIter f)
24
	{
25
		FaceCirculator fc(f);
26
		while(!fc.end()) ++fc;
27
		return fc.no_steps();
28
	}
29
 
62 jab 30
	Vec3f normal(FaceIter f)
39 bj 31
	{
32
		vector<Vec3f> v;
33
		FaceCirculator fc(f);
34
		int k;
35
		for(k=0;!fc.end();++fc,++k)
36
			{
62 jab 37
				Vec3f p = fc.get_vertex()->pos;
39 bj 38
				v.push_back(p);
39
			}
40
		Vec3f norm(0);
41
		for(int i=0;i<k;++i)
42
			{
43
				norm[0] += (v[i][1]-v[(i+1)%k][1])*(v[i][2]+v[(i+1)%k][2]);
44
				norm[1] += (v[i][2]-v[(i+1)%k][2])*(v[i][0]+v[(i+1)%k][0]);
45
				norm[2] += (v[i][0]-v[(i+1)%k][0])*(v[i][1]+v[(i+1)%k][1]);
46
			}
47
		float l = norm.length();
48
		if(l>0.0f)
49
			norm /= l;
50
		return norm;
51
	}
52
 
62 jab 53
	float area(FaceIter f)
39 bj 54
	{
55
		FaceCirculator fc(f);
56
		int k;
57
 
58
		// M is a matrix that projects a vector onto the orthogonal
59
		// complement of the face normal
62 jab 60
		Vec3f n = normal(f);
54 jab 61
		Vec3f a,b;
62
		orthogonal(n, a, b);
63
		Mat3x3f M(a,b,n);
39 bj 64
 
65
		// Get all projected vertices
66
		vector<Vec2f> v;		
67
		for(k=0;!fc.end();++fc,++k)
68
			{
62 jab 69
				Vec3f p = M * fc.get_vertex()->pos;
39 bj 70
				v.push_back(Vec2f(p[0], p[1]));
71
			}
72
		float area = 0;
73
		for(int i=0;i<k;++i)
74
			{
75
				area += 0.5 * cross(v[i], v[(i+1)%k]);
76
			}
77
		return fabs(area);
78
	}
79
 
62 jab 80
	Vec3f centre(FaceIter f)
39 bj 81
	{
82
		Vec3f c(0);
83
		FaceCirculator fc(f);
84
		while(!fc.end())
85
			{
62 jab 86
				c += fc.get_vertex()->pos;
39 bj 87
				++fc;
88
			}
89
		c /= fc.no_steps();
90
		return c;
91
	}
92
 
93
}