Subversion Repositories gelsvn

Rev

Rev 54 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 54 Rev 62
Line 25... Line 25...
25
		FaceCirculator fc(f);
25
		FaceCirculator fc(f);
26
		while(!fc.end()) ++fc;
26
		while(!fc.end()) ++fc;
27
		return fc.no_steps();
27
		return fc.no_steps();
28
	}
28
	}
29
 
29
 
30
	Vec3f get_normal(FaceIter f)
30
	Vec3f normal(FaceIter f)
31
	{
31
	{
32
		vector<Vec3f> v;
32
		vector<Vec3f> v;
33
		FaceCirculator fc(f);
33
		FaceCirculator fc(f);
34
		int k;
34
		int k;
35
		for(k=0;!fc.end();++fc,++k)
35
		for(k=0;!fc.end();++fc,++k)
36
			{
36
			{
37
				Vec3f p = fc.get_vertex()->get_pos();
37
				Vec3f p = fc.get_vertex()->pos;
38
				v.push_back(p);
38
				v.push_back(p);
39
			}
39
			}
40
		Vec3f norm(0);
40
		Vec3f norm(0);
41
		for(int i=0;i<k;++i)
41
		for(int i=0;i<k;++i)
42
			{
42
			{
Line 48... Line 48...
48
		if(l>0.0f)
48
		if(l>0.0f)
49
			norm /= l;
49
			norm /= l;
50
		return norm;
50
		return norm;
51
	}
51
	}
52
 
52
 
53
	float get_area(FaceIter f)
53
	float area(FaceIter f)
54
	{
54
	{
55
		FaceCirculator fc(f);
55
		FaceCirculator fc(f);
56
		int k;
56
		int k;
57
 
57
 
58
		// M is a matrix that projects a vector onto the orthogonal
58
		// M is a matrix that projects a vector onto the orthogonal
59
		// complement of the face normal
59
		// complement of the face normal
60
		Vec3f n = get_normal(f);
60
		Vec3f n = normal(f);
61
		Vec3f a,b;
61
		Vec3f a,b;
62
		orthogonal(n, a, b);
62
		orthogonal(n, a, b);
63
		Mat3x3f M(a,b,n);
63
		Mat3x3f M(a,b,n);
64
 
64
 
65
		// Get all projected vertices
65
		// Get all projected vertices
66
		vector<Vec2f> v;		
66
		vector<Vec2f> v;		
67
		for(k=0;!fc.end();++fc,++k)
67
		for(k=0;!fc.end();++fc,++k)
68
			{
68
			{
69
				Vec3f p = M * fc.get_vertex()->get_pos();
69
				Vec3f p = M * fc.get_vertex()->pos;
70
				v.push_back(Vec2f(p[0], p[1]));
70
				v.push_back(Vec2f(p[0], p[1]));
71
			}
71
			}
72
		float area = 0;
72
		float area = 0;
73
		for(int i=0;i<k;++i)
73
		for(int i=0;i<k;++i)
74
			{
74
			{
75
				area += 0.5 * cross(v[i], v[(i+1)%k]);
75
				area += 0.5 * cross(v[i], v[(i+1)%k]);
76
			}
76
			}
77
		return fabs(area);
77
		return fabs(area);
78
	}
78
	}
79
 
79
 
80
	Vec3f get_centre(FaceIter f)
80
	Vec3f centre(FaceIter f)
81
	{
81
	{
82
		Vec3f c(0);
82
		Vec3f c(0);
83
		FaceCirculator fc(f);
83
		FaceCirculator fc(f);
84
		while(!fc.end())
84
		while(!fc.end())
85
			{
85
			{
86
				c += fc.get_vertex()->get_pos();
86
				c += fc.get_vertex()->pos;
87
				++fc;
87
				++fc;
88
			}
88
			}
89
		c /= fc.no_steps();
89
		c /= fc.no_steps();
90
		return c;
90
		return c;
91
	}
91
	}