diff --git a/GeoLib/AABB.h b/GeoLib/AABB.h index 35e13a548d24c139c0648304fd5899d317d5775b..3275c0f0965f9edc17b4865a6adb4ac46af0b000 100644 --- a/GeoLib/AABB.h +++ b/GeoLib/AABB.h @@ -42,10 +42,11 @@ public: * */ AABB(std::vector<PNT_TYPE*> const& pnts, std::vector<std::size_t> const& ids) : _min_pnt(std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), std::numeric_limits<double>::max()), - _max_pnt(std::numeric_limits<double>::min(), std::numeric_limits<double>::min(), std::numeric_limits<double>::min()) + _max_pnt(std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest()) { assert(! ids.empty()); - for (unsigned i=0; i<ids.size(); ++i) { + init(pnts[ids[0]]); + for (std::size_t i=1; i<ids.size(); ++i) { update(*(pnts[ids[i]])); } } @@ -70,7 +71,7 @@ public: template <typename InputIterator> AABB(InputIterator first, InputIterator last) : _min_pnt(std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), std::numeric_limits<double>::max()), - _max_pnt(std::numeric_limits<double>::min(), std::numeric_limits<double>::min(), std::numeric_limits<double>::min()) + _max_pnt(std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest()) { if (! (std::distance(first,last) > 0)) { throw std::invalid_argument("AABB::AABB(InputIterator first, InputIterator last): first == last"); diff --git a/Tests/GeoLib/TestAABB.cpp b/Tests/GeoLib/TestAABB.cpp index aba72762250f58e0058514b4c7751b9b8e259c9d..f2aedd8268255860a54ee8bd7c1c9e717033c935 100644 --- a/Tests/GeoLib/TestAABB.cpp +++ b/Tests/GeoLib/TestAABB.cpp @@ -169,7 +169,7 @@ TEST(GeoLibAABB, RandomNumberOfPointsRandomBox) pnts.push_back(GeoLib::Point(rand() % box_size_x - half_box_size_x, rand() % box_size_y - half_box_size_y, rand() % box_size_z - half_box_size_z)); } - // construct from list points a axis algined bounding box + // construct from list points a axis aligned bounding box GeoLib::AABB<GeoLib::Point> aabb(pnts.begin(), pnts.end()); GeoLib::Point const& min_pnt(aabb.getMinPoint()); @@ -182,3 +182,39 @@ TEST(GeoLibAABB, RandomNumberOfPointsRandomBox) ASSERT_GE(half_box_size_y, max_pnt[1]) << "coordinate 1 of max_pnt is greater than " << half_box_size_y; ASSERT_GE(half_box_size_z, max_pnt[2]) << "coordinate 2 of max_pnt is greater than " << half_box_size_z; } + +TEST(GeoLib, AABBAllPointsWithNegativeCoordinatesI) +{ + std::vector<GeoLib::Point*> pnts; + pnts.push_back(new GeoLib::Point(-1, -1, -1)); + pnts.push_back(new GeoLib::Point(-10, -10, -10)); + + std::vector<std::size_t> ids; + ids.push_back(0); + ids.push_back(1); + GeoLib::AABB<GeoLib::Point> aabb(pnts, ids); + + GeoLib::Point const& max_pnt(aabb.getMaxPoint()); + + ASSERT_NEAR(-1.0, max_pnt[0], std::numeric_limits<double>::epsilon()); + ASSERT_NEAR(-1.0, max_pnt[1], std::numeric_limits<double>::epsilon()); + ASSERT_NEAR(-1.0, max_pnt[2], std::numeric_limits<double>::epsilon()); +} + +TEST(GeoLib, AABBAllPointsWithNegativeCoordinatesII) +{ + std::vector<GeoLib::Point> pnts; + + pnts.push_back(GeoLib::Point(-1, -1, -1)); + pnts.push_back(GeoLib::Point(-10, -10, -10)); + + // construct from points of the vector a axis aligned bounding box + GeoLib::AABB<GeoLib::Point> aabb(pnts.begin(), pnts.end()); + + GeoLib::Point const& max_pnt(aabb.getMaxPoint()); + + ASSERT_NEAR(-1.0, max_pnt[0], std::numeric_limits<double>::epsilon()); + ASSERT_NEAR(-1.0, max_pnt[1], std::numeric_limits<double>::epsilon()); + ASSERT_NEAR(-1.0, max_pnt[2], std::numeric_limits<double>::epsilon()); +} +