Subversion Repositories gelsvn

Rev

Rev 299 | Rev 595 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 299 Rev 309
1
#include <cfloat>
1
#include <cfloat>
2
#include "AABox.h"
2
#include "AABox.h"
3
 
3
 
4
using namespace std;
4
using namespace std;
5
using namespace CGLA;
5
using namespace CGLA;
6
 
6
 
7
namespace Geometry
7
namespace Geometry
8
{
8
{
9
 
9
 
10
bool AABox::intersect(const CGLA::Vec3f& p, const CGLA::Vec3f& dir) const
10
bool AABox::intersect(const CGLA::Vec3f& p, const CGLA::Vec3f& dir) const
11
{
11
{
12
	Vec3f t0,t1;
12
	Vec3f t0,t1;
13
	for(int i=0;i<3;++i)
13
	for(int i=0;i<3;++i)
14
		{
14
		{
15
			t0[i] = (pmin[i]-p[i])/dir[i];
15
			t0[i] = (pmin[i]-p[i])/dir[i];
16
			t1[i] = (pmax[i]-p[i])/dir[i];
16
			t1[i] = (pmax[i]-p[i])/dir[i];
17
		}
17
		}
-
 
18
	Vec3f tin = v_min(t0, t1);
-
 
19
	Vec3f tout = v_max(t0,t1);
18
	float tmin = max(min(t0[0],t1[0]),max(min(t0[1],t1[1]),min(t0[2],t1[2])));
20
	float tmin = max(tin[0], max(tin[1], tin[2]));
19
	float tmax = min(max(t0[0],t1[0]),min(max(t0[1],t1[1]),max(t0[2],t1[2])));
21
	float tmax = min(tout[0], min(tout[1], tout[2]));
20
 
22
 
21
	return ( (tmin + CGLA::TINY) <tmax);
23
	return ( (tmin-CGLA::TINY) < (tmax+CGLA::TINY));
22
}
24
}
23
 
25
 
24
void AABox::minmax_sq_dist(const CGLA::Vec3f& p, 
26
void AABox::minmax_sq_dist(const CGLA::Vec3f& p, 
25
													 float& dmin, float& dmax) const
27
													 float& dmin, float& dmax) const
26
{
28
{
27
	const Vec3f a = 0.5*pmax-0.5*pmin;
29
	const Vec3f a = 0.5*pmax-0.5*pmin;
28
	const Vec3f p0 = pmin + a;
30
	const Vec3f p0 = pmin + a;
29
 	Vec3f d = p-p0;
31
 	Vec3f d = p-p0;
30
 	Vec3f f(d);
32
 	Vec3f f(d);
31
 
33
 
32
	for(int i=0;i<3;++i)
34
	for(int i=0;i<3;++i)
33
		{
35
		{
34
 			if(f[i]>=0) 
36
 			if(f[i]>=0) 
35
 				f[i] = p[i]-pmin[i];
37
 				f[i] = p[i]-pmin[i];
36
 			else
38
 			else
37
 				f[i] = p[i]-pmax[i];
39
 				f[i] = p[i]-pmax[i];
38
			
40
			
39
			if(d[i]<-a[i])
41
			if(d[i]<-a[i])
40
				d[i] = p[i]-pmin[i];
42
				d[i] = p[i]-pmin[i];
41
			else if(d[i]>a[i])
43
			else if(d[i]>a[i])
42
				d[i] = p[i]-pmax[i];
44
				d[i] = p[i]-pmax[i];
43
			else 
45
			else 
44
				d[i] = 0;
46
				d[i] = 0;
45
		}
47
		}
46
	dmin = sqr_length(d);
48
	dmin = sqr_length(d);
47
//  	dmax = sqr_length(p-interior_point);
49
//  	dmax = sqr_length(p-interior_point);
48
	dmax = sqr_length(f);
50
	dmax = sqr_length(f);
49
	assert(dmin<=dmax);
51
	assert(dmin<=dmax);
50
}
52
}
51
 
53
 
52
AABox AABox::box_triangle(const Triangle& t)
54
AABox AABox::box_triangle(const Triangle& t)
53
{
55
{
54
	return AABox(t.get_pmin(), t.get_pmax(), t.get_centre());
56
	return AABox(t.get_pmin(), t.get_pmax(), t.get_centre());
55
}
57
}
56
 
58
 
57
 
59
 
58
AABox AABox::box_and_split(const std::vector<Triangle>& invec,
60
AABox AABox::box_and_split(const std::vector<Triangle>& invec,
59
													 std::vector<Triangle>& lvec,
61
													 std::vector<Triangle>& lvec,
60
													 std::vector<Triangle>& rvec)
62
													 std::vector<Triangle>& rvec)
61
{
63
{
62
	const int N = invec.size();
64
	const int N = invec.size();
63
	Vec3f tri_pmin(FLT_MAX), tri_pmax(-FLT_MAX);
65
	Vec3f tri_pmin(FLT_MAX), tri_pmax(-FLT_MAX);
64
			
66
			
65
	for(int i=0;i<N;++i)
67
	for(int i=0;i<N;++i)
66
		{
68
		{
67
			tri_pmin = v_min(invec[i].get_pmin(), tri_pmin);
69
			tri_pmin = v_min(invec[i].get_pmin(), tri_pmin);
68
			tri_pmax = v_max(invec[i].get_pmax(), tri_pmax);
70
			tri_pmax = v_max(invec[i].get_pmax(), tri_pmax);
69
		}
71
		}
70
	Vec3f diff = tri_pmax - tri_pmin;
72
	Vec3f diff = tri_pmax - tri_pmin;
71
 
73
 
72
	// Find the point closest to the centre.
74
	// Find the point closest to the centre.
73
	Vec3f centre = tri_pmin + diff;
75
	Vec3f centre = tri_pmin + diff;
74
	Vec3f centre_close = invec[0].get_v0();
76
	Vec3f centre_close = invec[0].get_v0();
75
	float min_dist = FLT_MAX;
77
	float min_dist = FLT_MAX;
76
	for(int i=0;i<N;++i)
78
	for(int i=0;i<N;++i)
77
		{
79
		{
78
			Vec3f v0 = invec[i].get_v0();
80
			Vec3f v0 = invec[i].get_v0();
79
			Vec3f v1 = invec[i].get_v1();
81
			Vec3f v1 = invec[i].get_v1();
80
			Vec3f v2 = invec[i].get_v2();
82
			Vec3f v2 = invec[i].get_v2();
81
			float sl0 = sqr_length(centre-v0);
83
			float sl0 = sqr_length(centre-v0);
82
			if(sl0 < min_dist)
84
			if(sl0 < min_dist)
83
				{
85
				{
84
					min_dist = sl0;
86
					min_dist = sl0;
85
					centre_close = v0;
87
					centre_close = v0;
86
				}
88
				}
87
			float sl1 = sqr_length(centre-v1);
89
			float sl1 = sqr_length(centre-v1);
88
			if(sl1 < min_dist)
90
			if(sl1 < min_dist)
89
				{
91
				{
90
					min_dist = sl1;
92
					min_dist = sl1;
91
					centre_close = v1;
93
					centre_close = v1;
92
				}
94
				}
93
			float sl2 = sqr_length(centre-v2);
95
			float sl2 = sqr_length(centre-v2);
94
			if(sl2 < min_dist)
96
			if(sl2 < min_dist)
95
				{
97
				{
96
					min_dist = sl2;
98
					min_dist = sl2;
97
					centre_close = v2;
99
					centre_close = v2;
98
				}
100
				}
99
		}
101
		}
100
 
102
 
101
	int k;
103
	int k;
102
	if(diff[0]>diff[1])
104
	if(diff[0]>diff[1])
103
		{
105
		{
104
			if(diff[0]>diff[2]) 
106
			if(diff[0]>diff[2]) 
105
				k = 0;
107
				k = 0;
106
			else 
108
			else 
107
				k = 2;
109
				k = 2;
108
		}
110
		}
109
	else
111
	else
110
		{
112
		{
111
			if(diff[1]>diff[2]) 
113
			if(diff[1]>diff[2]) 
112
				k = 1;
114
				k = 1;
113
			else 
115
			else 
114
				k = 2;
116
				k = 2;
115
		}
117
		}
116
 
118
 
117
	float thresh = diff[k]/2.0f + tri_pmin[k];
119
	float thresh = diff[k]/2.0f + tri_pmin[k];
118
 
120
 
119
 	for(int i=0;i<N;++i)
121
 	for(int i=0;i<N;++i)
120
		{
122
		{
121
			if(invec[i].get_centre()[k] > thresh)
123
			if(invec[i].get_centre()[k] > thresh)
122
				rvec.push_back(invec[i]);
124
				rvec.push_back(invec[i]);
123
			else
125
			else
124
				lvec.push_back(invec[i]);
126
				lvec.push_back(invec[i]);
125
		}
127
		}
126
	if(lvec.empty() || rvec.empty())
128
	if(lvec.empty() || rvec.empty())
127
		{
129
		{
128
			lvec.clear();
130
			lvec.clear();
129
			lvec.insert(lvec.end(),
131
			lvec.insert(lvec.end(),
130
									invec.begin(),
132
									invec.begin(),
131
									invec.begin()+N/2);
133
									invec.begin()+N/2);
132
			rvec.clear();
134
			rvec.clear();
133
			rvec.insert(rvec.end(),
135
			rvec.insert(rvec.end(),
134
									invec.begin()+N/2,
136
									invec.begin()+N/2,
135
									invec.end());
137
									invec.end());
136
		}
138
		}
137
	assert(!lvec.empty());
139
	assert(!lvec.empty());
138
	assert(!rvec.empty());
140
	assert(!rvec.empty());
139
	assert(lvec.size()+rvec.size() == invec.size());
141
	assert(lvec.size()+rvec.size() == invec.size());
140
	return AABox(tri_pmin, tri_pmax, centre_close);
142
	return AABox(tri_pmin, tri_pmax, centre_close);
141
}
143
}
142
 
144
 
143
}
145
}
144
 
146