Skip to content

Commit

Permalink
boundingbox test
Browse files Browse the repository at this point in the history
  • Loading branch information
AJPfleger committed Nov 23, 2024
1 parent ba4e47a commit cf5c818
Showing 1 changed file with 62 additions and 67 deletions.
129 changes: 62 additions & 67 deletions Tests/UnitTests/Core/Utilities/BoundingBoxTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,11 @@ namespace Acts::Test {

struct Object {};

using BoundingBoxScalar = ActsScalar;
using ObjectBBox = Acts::AxisAlignedBoundingBox<Object, double, 3>;

using ObjectBBox = Acts::AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;

using Vector2F = Eigen::Matrix<BoundingBoxScalar, 2, 1>;
using Vector3F = Eigen::Matrix<BoundingBoxScalar, 3, 1>;
using AngleAxis3F = Eigen::AngleAxis<BoundingBoxScalar>;
using Vector2F = Eigen::Matrix<double, 2, 1>;
using Vector3F = Eigen::Matrix<double, 3, 1>;
using AngleAxis3F = Eigen::AngleAxis<double>;

std::filesystem::path tmp_path = []() {
auto tmpPath = std::filesystem::temp_directory_path() / "acts_unit_tests";
Expand All @@ -59,11 +57,11 @@ std::ofstream tmp(const std::string& path) {
BOOST_AUTO_TEST_CASE(box_construction) {
BOOST_TEST_CONTEXT("2D") {
Object o;
using Box = Acts::AxisAlignedBoundingBox<Object, BoundingBoxScalar, 2>;
using Box = Acts::AxisAlignedBoundingBox<Object, double, 2>;
Box bb(&o, {-1, -1}, {2, 2});

typename Box::transform_type rot;
rot = Eigen::Rotation2D<BoundingBoxScalar>(std::numbers::pi / 7.);
rot = Eigen::Rotation2D<double>(std::numbers::pi / 7.);
Box bb_rot = bb.transformed(rot);

CHECK_CLOSE_ABS(bb_rot.min(), Vector2F(-1.76874, -1.33485), 1e-4);
Expand All @@ -72,7 +70,7 @@ BOOST_AUTO_TEST_CASE(box_construction) {

BOOST_TEST_CONTEXT("3D") {
Object o;
using Box = Acts::AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
using Box = Acts::AxisAlignedBoundingBox<Object, double, 3>;
Box bb(&o, {-1, -1, -1}, {2, 2, 2});

typename Box::transform_type rot;
Expand Down Expand Up @@ -141,14 +139,14 @@ BOOST_AUTO_TEST_CASE(intersect_points) {

BOOST_AUTO_TEST_CASE(intersect_rays) {
BOOST_TEST_CONTEXT("2D") {
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 2>;
using Box = AxisAlignedBoundingBox<Object, double, 2>;

Object o;
Box bb(&o, {-1, -1}, {1, 1});

// ray in positive x direction

Ray<BoundingBoxScalar, 2> ray({-2, 0}, {1, 0});
Ray<double, 2> ray({-2, 0}, {1, 0});
BOOST_CHECK(bb.intersect(ray));

ray = {{-2, 2}, {1, 0}};
Expand Down Expand Up @@ -273,10 +271,10 @@ BOOST_AUTO_TEST_CASE(intersect_rays) {

// let's make sure it also works in 3d
ObjectBBox bb3(&o, {-1, -1, -1}, {1, 1, 1});
Ray<BoundingBoxScalar, 3> ray3({0, 0, -2}, {0, 0, 1});
Ray<double, 3> ray3({0, 0, -2}, {0, 0, 1});
BOOST_CHECK(bb3.intersect(ray3));

PlyVisualization3D<BoundingBoxScalar> ply;
PlyVisualization3D<double> ply;

ray3.draw(ply);
auto os = tmp("ray3d.ply");
Expand All @@ -290,7 +288,7 @@ BOOST_AUTO_TEST_CASE(intersect_rays) {

// let's make sure it also works in 3d
ObjectBBox bb3(&o, {-1, -1, -1}, {1, 1, 1});
Ray<BoundingBoxScalar, 3> ray3({0, 0, -2}, {0, 0, 1});
Ray<double, 3> ray3({0, 0, -2}, {0, 0, 1});
BOOST_CHECK(bb3.intersect(ray3));

// facing away from box
Expand Down Expand Up @@ -451,7 +449,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
return os;
};

using Frustum2 = Frustum<BoundingBoxScalar, 2, 2>;
using Frustum2 = Frustum<double, 2, 2>;

std::ofstream os;

Expand All @@ -460,19 +458,18 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
const std::size_t nSteps = 10;

// Visualise the parameters
const BoundingBoxScalar min = -20;
const BoundingBoxScalar max = 20;
const double min = -20;
const double max = 20;
os = make_svg("frust2d_parameters.svg", svgWidth, svgHeight);

const BoundingBoxScalar step = (max - min) / nSteps;
const double step = (max - min) / nSteps;
for (std::size_t i = 0; i <= nSteps; i++) {
for (std::size_t j = 0; j <= nSteps; j++) {
Vector2F dir(1, 0);
Vector2F origin(min + step * i, min + step * j);
origin.x() *= 1.10;
Eigen::Rotation2D<BoundingBoxScalar> rot(2 * std::numbers::pi / nSteps *
i);
BoundingBoxScalar angle = std::numbers::pi / 2. / nSteps * j;
Eigen::Rotation2D<double> rot(2 * std::numbers::pi / nSteps * i);
double angle = std::numbers::pi / 2. / nSteps * j;
Frustum2 fr(origin, rot * dir, angle);
fr.svg(os, svgWidth, svgHeight, 2);
}
Expand All @@ -481,18 +478,18 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
os << "</svg>";
os.close();

const BoundingBoxScalar unit = 20;
const double unit = 20.;

using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 2>;
using Box = AxisAlignedBoundingBox<Object, double, 2>;
Object o;
Box::Size size(Eigen::Matrix<BoundingBoxScalar, 2, 1>(2, 2));
Box::Size size(Eigen::Matrix<double, 2, 1>(2, 2));

const BoundingBoxScalar minX = -20;
const BoundingBoxScalar minY = -20;
const BoundingBoxScalar maxX = 20;
const BoundingBoxScalar maxY = 20;
const BoundingBoxScalar stepX = (maxX - minX) / nSteps;
const BoundingBoxScalar stepY = (maxY - minY) / nSteps;
const double minX = -20.;
const double minY = -20.;
const double maxX = 20.;
const double maxY = 20.;
const double stepX = (maxX - minX) / nSteps;
const double stepY = (maxY - minY) / nSteps;

std::set<std::size_t> idxsAct;

Expand Down Expand Up @@ -579,10 +576,10 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
boxes.reserve((nSteps + 1) * (nSteps + 1));
for (std::size_t i = 0; i <= nSteps; i++) {
for (std::size_t j = 0; j <= nSteps; j++) {
boxes.emplace_back(&o,
Eigen::Matrix<BoundingBoxScalar, 2, 1>{
minX + i * stepX, minY + j * stepY},
size);
boxes.emplace_back(
&o,
Eigen::Matrix<double, 2, 1>{minX + i * stepX, minY + j * stepY},
size);
std::stringstream st;
st << boxes.size() - 1;

Expand All @@ -605,9 +602,9 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
}
}

PlyVisualization3D<BoundingBoxScalar> helper;
PlyVisualization3D<double> helper;
BOOST_TEST_CONTEXT("3D - 3 Sides") {
using Frustum3 = Frustum<BoundingBoxScalar, 3, 3>;
using Frustum3 = Frustum<double, 3, 3>;
std::ofstream os;
std::size_t n = 10;
const std::size_t nSteps = 5;
Expand All @@ -619,7 +616,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
auto make = [&](double angle, const Vector3F& origin,
std::ofstream& osTmp) {
helper.clear();
BoundingBoxScalar far = 1;
double far = 1.;
Frustum3 fr(origin, {0, 0, 1}, angle);
fr.draw(helper, far);
fr = Frustum3(origin, {0, 0, -1}, angle);
Expand Down Expand Up @@ -655,7 +652,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
for (std::size_t i = 0; i <= n; i++) {
Vector3F origin(i * 4, 0, 0);
AngleAxis3F rot(std::numbers::pi / n * i, Vector3F::UnitY());
BoundingBoxScalar angle = (std::numbers::pi / 2.) / n * (1 + i);
double angle = (std::numbers::pi / 2.) / n * (1 + i);
Vector3F dir(1, 0, 0);
Frustum3 fr(origin, rot * dir, angle);
fr.draw(helper, 2);
Expand Down Expand Up @@ -850,16 +847,16 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
step = (max - min) / n;

Object o;
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
Box::Size size(Eigen::Matrix<BoundingBoxScalar, 3, 1>(2, 2, 2));
using Box = AxisAlignedBoundingBox<Object, double, 3>;
Box::Size size(Eigen::Matrix<double, 3, 1>(2, 2, 2));

std::size_t idx = 0;

for (std::size_t i = 0; i <= n; i++) {
for (std::size_t j = 0; j <= n; j++) {
for (std::size_t k = 0; k <= n; k++) {
Eigen::Matrix<BoundingBoxScalar, 3, 1> pos(
min + i * step, min + j * step, min + k * step);
Eigen::Matrix<double, 3, 1> pos(min + i * step, min + j * step,
min + k * step);
Box bb(&o, pos, size);

Color color = {255, 0, 0};
Expand All @@ -883,7 +880,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
}

BOOST_TEST_CONTEXT("3D - 4 Sides") {
using Frustum34 = Frustum<BoundingBoxScalar, 3, 4>;
using Frustum34 = Frustum<double, 3, 4>;
const std::size_t n = 10;
double min = -10;
double max = 10;
Expand All @@ -902,7 +899,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
Vector3F origin(min + i * step, min + j * step, min + k * step);
Vector3F dir(1, 0, 0);

BoundingBoxScalar piOverS = std::numbers::pi_v<BoundingBoxScalar> / s;
double piOverS = std::numbers::pi / s;
AngleAxis3F rot;
rot = AngleAxis3F(piOverS * i, Vector3F::UnitX()) *
AngleAxis3F(piOverS * j, Vector3F::UnitY()) *
Expand Down Expand Up @@ -1104,15 +1101,15 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
fr.draw(helper, 50);

Object o;
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
Box::Size size(Eigen::Matrix<BoundingBoxScalar, 3, 1>(2, 2, 2));
using Box = AxisAlignedBoundingBox<Object, double, 3>;
Box::Size size(Eigen::Matrix<double, 3, 1>(2, 2, 2));

std::size_t idx = 0;
for (std::size_t i = 0; i <= n; i++) {
for (std::size_t j = 0; j <= n; j++) {
for (std::size_t k = 0; k <= n; k++) {
Eigen::Matrix<BoundingBoxScalar, 3, 1> pos(
min + i * step, min + j * step, min + k * step);
Eigen::Matrix<double, 3, 1> pos(min + i * step, min + j * step,
min + k * step);
Box bb(&o, pos, size);

Color color = {255, 0, 0};
Expand All @@ -1136,13 +1133,13 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
}

BOOST_TEST_CONTEXT("3D - 5 Sides") {
using Frustum = Frustum<BoundingBoxScalar, 3, 5>;
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
Box::Size size(Eigen::Matrix<BoundingBoxScalar, 3, 1>(2, 2, 2));
using Frustum = Frustum<double, 3, 5>;
using Box = AxisAlignedBoundingBox<Object, double, 3>;
Box::Size size(Acts::Vector3(2, 2, 2));

Object o;

PlyVisualization3D<BoundingBoxScalar> ply;
PlyVisualization3D<double> ply;

Frustum fr({0, 0, 0}, {0, 0, 1}, std::numbers::pi / 8.);
fr.draw(ply, 10);
Expand All @@ -1158,17 +1155,16 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
}

BOOST_TEST_CONTEXT("3D - 10 Sides") {
using Frustum = Frustum<BoundingBoxScalar, 3, 10>;
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
using vec3 = Eigen::Matrix<BoundingBoxScalar, 3, 1>;
Box::Size size(vec3(2, 2, 2));
using Frustum = Frustum<double, 3, 10>;
using Box = AxisAlignedBoundingBox<Object, double, 3>;
Box::Size size(Acts::Vector3(2, 2, 2));

Object o;

PlyVisualization3D<BoundingBoxScalar> ply;
PlyVisualization3D<double> ply;

vec3 pos = {-12.4205, 29.3578, 44.6207};
vec3 dir = {-0.656862, 0.48138, 0.58035};
Acts::Vector3 pos = {-12.4205, 29.3578, 44.6207};
Acts::Vector3 dir = {-0.656862, 0.48138, 0.58035};
Frustum fr(pos, dir, 0.972419);
fr.draw(ply, 10);

Expand All @@ -1183,20 +1179,19 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {
}

BOOST_TEST_CONTEXT("3D - 4 Sides - Big box") {
using Frustum = Frustum<BoundingBoxScalar, 3, 4>;
using Box = AxisAlignedBoundingBox<Object, BoundingBoxScalar, 3>;
using vec3 = Eigen::Matrix<BoundingBoxScalar, 3, 1>;
using Frustum = Frustum<double, 3, 4>;
using Box = AxisAlignedBoundingBox<Object, double, 3>;

Object o;

PlyVisualization3D<BoundingBoxScalar> ply;
PlyVisualization3D<double> ply;

vec3 pos = {0, 0, 0};
vec3 dir = {0, 0, 1};
Acts::Vector3 pos = {0, 0, 0};
Acts::Vector3 dir = {0, 0, 1};
Frustum fr(pos, dir, 0.972419);
fr.draw(ply, 10);

Box::Size size(vec3(100, 100, 2));
Box::Size size(Acts::Vector3(100, 100, 2));
Box bb(&o, pos + dir * 7, size);
bb.draw(ply);

Expand All @@ -1210,7 +1205,7 @@ BOOST_AUTO_TEST_CASE(frustum_intersect) {

BOOST_AUTO_TEST_CASE(ostream_operator) {
Object o;
using Box = Acts::AxisAlignedBoundingBox<Object, BoundingBoxScalar, 2>;
using Box = Acts::AxisAlignedBoundingBox<Object, double, 2>;
Box bb(&o, {-1, -1}, {2, 2});

std::stringstream ss;
Expand Down

0 comments on commit cf5c818

Please sign in to comment.