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