Subversion Repositories gelsvn

Rev

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

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