1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/StdVector>
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Geometry>
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unsupported/Eigen/BVH>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> AlignedBox<Scalar, Dim> bounding_box(const Matrix<Scalar, Dim, 1> &v) { return AlignedBox<Scalar, Dim>(v); }
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Dim>
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct Ball
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(double, Dim)
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<double, Dim, 1> VectorType;
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Ball() {}
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Ball(const VectorType &c, double r) : center(c), radius(r) {}
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VectorType center;
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double radius;
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Dim> AlignedBox<double, Dim> bounding_box(const Ball<Dim> &b)
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ return AlignedBox<double, Dim>(b.center.array() - b.radius, b.center.array() + b.radius); }
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline double SQR(double x) { return x * x; }
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Dim>
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct BallPointStuff //this class provides functions to be both an intersector and a minimizer, both for a ball and a point and for two trees
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef double Scalar;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<double, Dim, 1> VectorType;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Ball<Dim> BallType;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef AlignedBox<double, Dim> BoxType;
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  BallPointStuff() : calls(0), count(0) {}
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  BallPointStuff(const VectorType &inP) : p(inP), calls(0), count(0) {}
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectVolume(const BoxType &r) { ++calls; return r.contains(p); }
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectObject(const BallType &b) {
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++calls;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if((b.center - p).squaredNorm() < SQR(b.radius))
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ++count;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return false; //continue
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectVolumeVolume(const BoxType &r1, const BoxType &r2) { ++calls; return !(r1.intersection(r2)).isNull(); }
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectVolumeObject(const BoxType &r, const BallType &b) { ++calls; return r.squaredExteriorDistance(b.center) < SQR(b.radius); }
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectObjectVolume(const BallType &b, const BoxType &r) { ++calls; return r.squaredExteriorDistance(b.center) < SQR(b.radius); }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectObjectObject(const BallType &b1, const BallType &b2){
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++calls;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if((b1.center - b2.center).norm() < b1.radius + b2.radius)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ++count;
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return false;
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectVolumeObject(const BoxType &r, const VectorType &v) { ++calls; return r.contains(v); }
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool intersectObjectObject(const BallType &b, const VectorType &v){
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++calls;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if((b.center - v).squaredNorm() < SQR(b.radius))
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ++count;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return false;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnVolume(const BoxType &r) { ++calls; return r.squaredExteriorDistance(p); }
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnObject(const BallType &b) { ++calls; return (std::max)(0., (b.center - p).squaredNorm() - SQR(b.radius)); }
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnVolumeVolume(const BoxType &r1, const BoxType &r2) { ++calls; return r1.squaredExteriorDistance(r2); }
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnVolumeObject(const BoxType &r, const BallType &b) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnObjectVolume(const BallType &b, const BoxType &r) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); }
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnObjectObject(const BallType &b1, const BallType &b2){ ++calls; return SQR((std::max)(0., (b1.center - b2.center).norm() - b1.radius - b2.radius)); }
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnVolumeObject(const BoxType &r, const VectorType &v) { ++calls; return r.squaredExteriorDistance(v); }
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double minimumOnObjectObject(const BallType &b, const VectorType &v){ ++calls; return SQR((std::max)(0., (b.center - v).norm() - b.radius)); }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VectorType p;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int calls;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int count;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Dim>
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct TreeTest
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<double, Dim, 1> VectorType;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef std::vector<VectorType, aligned_allocator<VectorType> > VectorTypeList;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Ball<Dim> BallType;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef std::vector<BallType, aligned_allocator<BallType> > BallTypeList;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef AlignedBox<double, Dim> BoxType;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void testIntersect1()
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallTypeList b;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < 500; ++i) {
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        b.push_back(BallType(VectorType::Random(), 0.5 * internal::random(0., 1.)));
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorType pt = VectorType::Random();
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallPointStuff<Dim> i1(pt), i2(pt);
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < (int)b.size(); ++i)
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      i1.intersectObject(b[i]);
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BVIntersect(tree, i2);
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(i1.count == i2.count);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void testMinimize1()
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallTypeList b;
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < 500; ++i) {
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        b.push_back(BallType(VectorType::Random(), 0.01 * internal::random(0., 1.)));
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorType pt = VectorType::Random();
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallPointStuff<Dim> i1(pt), i2(pt);
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    double m1 = (std::numeric_limits<double>::max)(), m2 = m1;
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < (int)b.size(); ++i)
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m1 = (std::min)(m1, i1.minimumOnObject(b[i]));
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m2 = BVMinimize(tree, i2);
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(m1, m2);
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void testIntersect2()
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallTypeList b;
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorTypeList v;
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < 50; ++i) {
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        b.push_back(BallType(VectorType::Random(), 0.5 * internal::random(0., 1.)));
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for(int j = 0; j < 3; ++j)
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            v.push_back(VectorType::Random());
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, VectorType> vTree(v.begin(), v.end());
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallPointStuff<Dim> i1, i2;
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < (int)b.size(); ++i)
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for(int j = 0; j < (int)v.size(); ++j)
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            i1.intersectObjectObject(b[i], v[j]);
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BVIntersect(tree, vTree, i2);
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(i1.count == i2.count);
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void testMinimize2()
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallTypeList b;
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorTypeList v;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < 50; ++i) {
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        b.push_back(BallType(VectorType::Random(), 1e-7 + 1e-6 * internal::random(0., 1.)));
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for(int j = 0; j < 3; ++j)
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            v.push_back(VectorType::Random());
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    KdBVH<double, Dim, VectorType> vTree(v.begin(), v.end());
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BallPointStuff<Dim> i1, i2;
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    double m1 = (std::numeric_limits<double>::max)(), m2 = m1;
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i = 0; i < (int)b.size(); ++i)
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for(int j = 0; j < (int)v.size(); ++j)
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m1 = (std::min)(m1, i1.minimumOnObjectObject(b[i], v[j]));
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m2 = BVMinimize(tree, vTree, i2);
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(m1, m2);
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_BVH()
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat; i++) {
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_TEST_PART_1
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    TreeTest<2> test2;
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test2.testIntersect1());
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test2.testMinimize1());
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test2.testIntersect2());
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test2.testMinimize2());
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_TEST_PART_2
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    TreeTest<3> test3;
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test3.testIntersect1());
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test3.testMinimize1());
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test3.testIntersect2());
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test3.testMinimize2());
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_TEST_PART_3
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    TreeTest<4> test4;
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test4.testIntersect1());
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test4.testMinimize1());
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test4.testIntersect2());
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST(test4.testMinimize2());
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
223