You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
8.1 KiB
C++
271 lines
8.1 KiB
C++
//Copyright (c) 2015 Ultimaker B.V.
|
|
//CuraEngine is released under the terms of the AGPLv3 or higher.
|
|
|
|
#include "SparseGridTest.h"
|
|
|
|
#include <algorithm>
|
|
#include <vector>
|
|
|
|
namespace cura
|
|
{
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(SparseGridTest);
|
|
|
|
void SparseGridTest::setUp()
|
|
{
|
|
//Do nothing.
|
|
}
|
|
|
|
void SparseGridTest::tearDown()
|
|
{
|
|
//Do nothing.
|
|
}
|
|
|
|
void SparseGridTest::getNearbyFarTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(0, 100);
|
|
const Point target(100, 100);
|
|
std::unordered_set<Point> near;
|
|
std::unordered_set<Point> far;
|
|
far.emplace(0, 100);
|
|
getNearbyAssert(input, target, 10, near, far);
|
|
}
|
|
|
|
void SparseGridTest::getNearbyLine2Test()
|
|
{
|
|
std::vector<Point> input;
|
|
for (coord_t x = 0; x < 200; x++)
|
|
{
|
|
input.emplace_back(x, 95);
|
|
}
|
|
const Point target(99, 100); //Slightly shifted.
|
|
const coord_t grid_size = 10;
|
|
std::unordered_set<Point> near;
|
|
std::unordered_set<Point> far;
|
|
for (const Point point : input)
|
|
{
|
|
coord_t distance = vSize(point - target);
|
|
if (distance < grid_size)
|
|
{
|
|
near.insert(point);
|
|
}
|
|
else if (distance > grid_size * 2) //Grid size * 2 are guaranteed to be considered "far".
|
|
{
|
|
far.insert(point);
|
|
}
|
|
}
|
|
getNearbyAssert(input, target, grid_size, near, far);
|
|
}
|
|
|
|
void SparseGridTest::getNearbyLineTest()
|
|
{
|
|
std::vector<Point> input;
|
|
for (coord_t x = 0; x < 200; x++)
|
|
{
|
|
input.emplace_back(x, 95);
|
|
}
|
|
const Point target(100, 100);
|
|
const coord_t grid_size = 10;
|
|
std::unordered_set<Point> near;
|
|
std::unordered_set<Point> far;
|
|
for (const Point point : input)
|
|
{
|
|
coord_t distance = vSize(point - target);
|
|
if (distance < grid_size)
|
|
{
|
|
near.insert(point);
|
|
}
|
|
else if (distance > grid_size * 2) //Grid size * 2 are guaranteed to be considered "far".
|
|
{
|
|
far.insert(point);
|
|
}
|
|
}
|
|
getNearbyAssert(input, target, grid_size, near, far);
|
|
}
|
|
|
|
void SparseGridTest::getNearbyNearTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(95, 100);
|
|
const Point target(100, 100);
|
|
std::unordered_set<Point> near;
|
|
near.emplace(95, 100);
|
|
std::unordered_set<Point> far;
|
|
getNearbyAssert(input, target, 10, near, far);
|
|
}
|
|
|
|
void SparseGridTest::getNearbySameTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(100, 100);
|
|
const Point target(100, 100);
|
|
std::unordered_set<Point> near;
|
|
near.emplace(100, 100);
|
|
std::unordered_set<Point> far;
|
|
getNearbyAssert(input, target, 10, near, far);
|
|
}
|
|
|
|
void SparseGridTest::getNearestChoiceTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(95, 100);
|
|
input.emplace_back(103, 100);
|
|
input.emplace_back(200, 100);
|
|
getNearestAssert(input, Point(100, 100), 10, new Point(103, 100));
|
|
}
|
|
|
|
void SparseGridTest::getNearestEqualTest()
|
|
{
|
|
std::vector<Point> registered_points;
|
|
registered_points.emplace_back(95, 100);
|
|
registered_points.emplace_back(105, 100);
|
|
Point target = Point(100, 100);
|
|
const coord_t grid_size = 10;
|
|
const Point expected1 = Point(95, 100);
|
|
const Point expected2 = Point(105, 100);
|
|
|
|
SparsePointGridInclusive<Point> grid(grid_size);
|
|
for (Point point : registered_points)
|
|
{
|
|
grid.insert(point, point);
|
|
}
|
|
|
|
typename SparsePointGridInclusive<Point>::Elem result;
|
|
//The actual call to test.
|
|
const bool success = grid.getNearest(target, grid_size,
|
|
result, SparsePointGridInclusive<Point>::no_precondition);
|
|
|
|
{
|
|
std::stringstream ss;
|
|
ss << "getNearest returned " << success << " but should've returned true.";
|
|
CPPUNIT_ASSERT_MESSAGE(ss.str(), success);
|
|
}
|
|
{
|
|
std::stringstream ss;
|
|
ss << "getNearest reported the nearest point to be " << result.val <<
|
|
" (distance " << vSize(target - result.val) <<
|
|
"), but it should've been " << expected1 <<
|
|
" (distance " << vSize(expected1 - target) <<
|
|
") or " << expected2 <<
|
|
" (distance " << vSize(expected2 - target) << ").";
|
|
CPPUNIT_ASSERT_MESSAGE(ss.str(), result.val == expected1 || result.val == expected2);
|
|
}
|
|
}
|
|
|
|
void SparseGridTest::getNearestFilterTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(95, 100);
|
|
input.emplace_back(98, 100);
|
|
input.emplace_back(106, 100);
|
|
std::function<bool(const typename SparsePointGridInclusive<Point>::Elem &)> filter =
|
|
[&] (const typename SparsePointGridInclusive<Point>::Elem& elem) -> bool
|
|
{
|
|
return elem.point.X > 100;
|
|
};
|
|
getNearestAssert(input, Point(100, 100), 10, new Point(106, 100), filter);
|
|
}
|
|
|
|
void SparseGridTest::getNearestNoneTest()
|
|
{
|
|
std::vector<Point> input;
|
|
getNearestAssert(input, Point(100, 100), 10, nullptr);
|
|
}
|
|
|
|
void SparseGridTest::getNearestSameTest()
|
|
{
|
|
std::vector<Point> input;
|
|
input.emplace_back(100, 100);
|
|
getNearestAssert(input, Point(100, 100), 10, new Point(100, 100));
|
|
}
|
|
|
|
void SparseGridTest::getNearbyAssert(
|
|
const std::vector<Point>& registered_points,
|
|
Point target, const coord_t grid_size,
|
|
const std::unordered_set<Point>& expected_near,
|
|
const std::unordered_set<Point>& expected_far)
|
|
{
|
|
SparsePointGridInclusive<Point> grid(grid_size);
|
|
for(Point point : registered_points)
|
|
{
|
|
grid.insert(point, point);
|
|
}
|
|
|
|
//The actual call to test.
|
|
const std::vector<typename SparsePointGridInclusive<Point>::Elem> result =
|
|
grid.getNearby(target, grid_size);
|
|
|
|
//Are all near points reported as near?
|
|
for (const Point point : expected_near)
|
|
{
|
|
std::stringstream ss;
|
|
ss << "Point " << point << " is near " << target <<
|
|
" (distance " << vSize(point - target) <<
|
|
"), but getNearby didn't report it as such. Grid size: " <<
|
|
grid_size;
|
|
//Must be in result.
|
|
CPPUNIT_ASSERT_MESSAGE(
|
|
ss.str(),
|
|
std::find_if(result.begin(), result.end(),
|
|
[&point](const typename SparsePointGridInclusive<Point>::Elem &elem)
|
|
{
|
|
return elem.val == point;
|
|
}) !=
|
|
result.end());
|
|
}
|
|
//Are all far points NOT reported as near?
|
|
for (const Point point : expected_far)
|
|
{
|
|
std::stringstream ss;
|
|
ss << "Point " << point << " is far from " << target <<
|
|
" (distance " << vSize(point - target) <<
|
|
"), but getNearby thought it was near. Grid size: " << grid_size;
|
|
//Must not be in result.
|
|
CPPUNIT_ASSERT_MESSAGE(
|
|
ss.str(),
|
|
std::find_if(result.begin(), result.end(),
|
|
[&point](const typename SparsePointGridInclusive<Point>::Elem &elem)
|
|
{
|
|
return elem.val == point;
|
|
}) ==
|
|
result.end());
|
|
}
|
|
}
|
|
|
|
void SparseGridTest::getNearestAssert(
|
|
const std::vector<Point>& registered_points,
|
|
Point target, const coord_t grid_size,
|
|
Point* expected,
|
|
const std::function<bool(const typename SparsePointGridInclusive<Point>::Elem& elem)> &precondition)
|
|
{
|
|
SparsePointGridInclusive<Point> grid(grid_size);
|
|
for (Point point : registered_points)
|
|
{
|
|
grid.insert(point, point);
|
|
}
|
|
|
|
typename SparsePointGridInclusive<Point>::Elem result;
|
|
//The actual call to test.
|
|
const bool success = grid.getNearest(target, grid_size,
|
|
result, precondition);
|
|
|
|
{
|
|
std::stringstream ss;
|
|
ss << "getNearest returned " << success <<
|
|
" but should've returned " << (expected != nullptr) << ".";
|
|
CPPUNIT_ASSERT_MESSAGE(ss.str(), success == (expected != nullptr));
|
|
}
|
|
if (expected)
|
|
{
|
|
std::stringstream ss;
|
|
ss << "getNearest reported the nearest point to be " << result.val <<
|
|
" (distance " << vSize(target - result.val) <<
|
|
"), but it was " << *expected <<
|
|
" (distance " << vSize(*expected - target) << ").";
|
|
CPPUNIT_ASSERT_MESSAGE(ss.str(), result.val == *expected);
|
|
}
|
|
}
|
|
|
|
}
|