Subversion Repositories gelsvn

Rev

Rev 609 | Details | Compare with Previous | Last modification | View Log | RSS feed

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