// Copyright (C) 2008 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#include <dlib/geometry.h>
#include <sstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <dlib/string.h>
#include <dlib/matrix.h>
#include <dlib/rand.h>
#include "tester.h"
namespace
{
using namespace test;
using namespace dlib;
using namespace std;
logger dlog("test.geometry");
void geometry_test (
)
/*!
ensures
- runs tests on the geometry stuff compliance with the specs
!*/
{
print_spinner();
point p1;
point p2(2,3);
DLIB_TEST(p1.x() == 0);
DLIB_TEST(p1.y() == 0);
DLIB_TEST(p2.x() == 2);
DLIB_TEST(p2.y() == 3);
DLIB_TEST((-p2).x() == -2);
DLIB_TEST((-p2).y() == -3);
p2 += p2;
DLIB_TEST(p2.x() == 4);
DLIB_TEST(p2.y() == 6);
dlib::vector<double> v1 = point(1,0);
dlib::vector<double> v2(0,0,1);
p1 = v2.cross(v1);
DLIB_TEST(p1 == point(0,1));
DLIB_TEST(p1 != point(1,1));
DLIB_TEST(p1 != point(1,0));
p1 = point(2,3);
rectangle rect1 = p1;
DLIB_TEST(rect1.width() == 1);
DLIB_TEST(rect1.height() == 1);
p2 = point(1,1);
rect1 += p2;
DLIB_TEST(rect1.left() == 1);
DLIB_TEST(rect1.top() == 1);
DLIB_TEST(rect1.right() == 2);
DLIB_TEST(rect1.bottom() == 3);
DLIB_TEST(rect1.width() == 2);
DLIB_TEST(rect1.height() == 3);
// test the iostream << and >> operators (via string_cast and cast_to_string)
DLIB_TEST(string_cast<point>(" (1, 2 )") == point(1,2));
DLIB_TEST(string_cast<point>(" ( -1, 2 )") == point(-1,2));
DLIB_TEST(string_cast<rectangle>(" [(1, 2 )(3,4)]") == rectangle(1,2,3,4));
DLIB_TEST(string_cast<dlib::vector<double> >(" (1, 2 , 3.5)") == dlib::vector<double>(1,2,3.5));
DLIB_TEST(string_cast<rectangle>(cast_to_string(rect1)) == rect1);
DLIB_TEST(string_cast<point>(cast_to_string(p1)) == p1);
DLIB_TEST(string_cast<dlib::vector<double> >(cast_to_string(v1)) == v1);
rectangle rect2;
// test the serialization code
ostringstream sout;
serialize(rect1,sout);
serialize(p1,sout);
serialize(v1,sout);
serialize(rect1,sout);
serialize(p1,sout);
serialize(v1,sout);
istringstream sin(sout.str());
deserialize(rect2,sin);
deserialize(p2,sin);
deserialize(v2,sin);
DLIB_TEST(rect2 == rect1);
DLIB_TEST(p2 == p1);
DLIB_TEST(v2 == v1);
deserialize(rect2,sin);
deserialize(p2,sin);
deserialize(v2,sin);
DLIB_TEST(rect2 == rect1);
DLIB_TEST(p2 == p1);
DLIB_TEST(v2 == v1);
DLIB_TEST(sin);
DLIB_TEST(sin.get() == EOF);
v1.x() = 1;
v1.y() = 2;
v1.z() = 3;
matrix<double> mv = v1;
DLIB_TEST(mv.nr() == 3);
DLIB_TEST(mv.nc() == 1);
DLIB_TEST(mv(0) == 1);
DLIB_TEST(mv(1) == 2);
DLIB_TEST(mv(2) == 3);
set_all_elements(mv,0);
DLIB_TEST(mv(0) == 0);
DLIB_TEST(mv(1) == 0);
DLIB_TEST(mv(2) == 0);
mv(0) = 5;
mv(1) = 6;
mv(2) = 7;
v1 = mv;
DLIB_TEST(v1.x() == 5);
DLIB_TEST(v1.y() == 6);
DLIB_TEST(v1.z() == 7);
{
dlib::vector<double,2> vd2;
dlib::vector<double,3> vd3;
dlib::vector<long,2> vl2;
dlib::vector<long,3> vl3;
vd2.x() = 2.3;
vd2.y() = 4.7;
vd3.z() = 9;
vd3 = vd2;
vl2 = vd3;
vl3 = vd3;
DLIB_TEST(vd2.z() == 0);
DLIB_TEST(vd3.z() == 0);
DLIB_TEST(vl2.z() == 0);
DLIB_TEST(vl3.z() == 0);
DLIB_TEST(vl2.x() == 2);
DLIB_TEST(vl3.x() == 2);
DLIB_TEST(vl2.y() == 5);
DLIB_TEST(vl3.y() == 5);
DLIB_TEST(abs(vd2.cross(vd3).dot(vd2)) < 1e-7);
DLIB_TEST(abs(vd3.cross(vd2).dot(vd2)) < 1e-7);
DLIB_TEST(abs(vd2.cross(vd3).dot(vd3)) < 1e-7);
DLIB_TEST(abs(vd3.cross(vd2).dot(vd3)) < 1e-7);
DLIB_TEST(abs(vl2.cross(vl3).dot(vl2)) == 0);
DLIB_TEST(abs(vl3.cross(vl2).dot(vl2)) == 0);
DLIB_TEST(abs(vl2.cross(vl3).dot(vl3)) == 0);
DLIB_TEST(abs(vl3.cross(vl2).dot(vl3)) == 0);
DLIB_TEST((vd2-vd3).length() < 1e-7);
DLIB_TEST(vl2 == vl3);
vl2.x() = 0;
vl2.y() = 0;
vl3 = vl2;
vl2.x() = 4;
vl3.y() = 3;
DLIB_TEST(vl2.cross(vl3).length() == 12);
DLIB_TEST(vl3.cross(vl2).length() == 12);
matrix<double> m(3,3);
m = 1,2,3,
4,5,6,
7,8,9;
vd3.x() = 2;
vd3.y() = 3;
vd3.z() = 4;
vd3 = m*vd3;
DLIB_TEST_MSG(vd3.x() == 1*2 + 2*3 + 3*4,vd3.x() << " == " << (1*2 + 2*3 + 3*4));
DLIB_TEST(vd3.y() == 4*2 + 5*3 + 6*4);
DLIB_TEST(vd3.z() == 7*2 + 8*3 + 9*4);
(vd3*2).dot(vd3);
(vd2*2).dot(vd3);
(vd3*2).dot(vd2);
(vd2*2).dot(vd2);
(2*vd3*2).dot(vd3);
(2*vd2*2).dot(vd3);
(2*vd3*2).dot(vd2);
(2*vd2*2).dot(vd2);
(vd2 + vd3).dot(vd2);
(vd2 - vd3).dot(vd2);
(vd2/2).dot(vd2);
(vd3/2).dot(vd2);
}
{
dlib::vector<double,2> vd2;
dlib::vector<long,3> vl3;
vl3.x() = 1;
vl3.y() = 2;
vl3.z() = 3;
vd2.x() = 6.5;
vd2.y() = 7.5;
DLIB_TEST((vl3 + vd2).x() == 1+6.5);
DLIB_TEST((vl3 + vd2).y() == 2+7.5);
DLIB_TEST((vl3 + vd2).z() == 3+0);
DLIB_TEST((vl3 - vd2).x() == 1-6.5);
DLIB_TEST((vl3 - vd2).y() == 2-7.5);
DLIB_TEST((vl3 - vd2).z() == 3-0);
}
{
dlib::vector<double> v(3,4,5);
DLIB_TEST((-v).x() == -3.0);
DLIB_TEST((-v).y() == -4.0);
DLIB_TEST((-v).z() == -5.0);
}
{
rectangle rect;
point tl(2,3);
point tr(8,3);
point bl(2,9);
point br(8,9);
rect += tl;
rect += tr;
rect += bl;
rect += br;
DLIB_TEST(rect.tl_corner() == tl);
DLIB_TEST(rect.tr_corner() == tr);
DLIB_TEST(rect.bl_corner() == bl);
DLIB_TEST(rect.br_corner() == br);
}
{
const double pi = 3.1415926535898;
point p1, center;
center = point(3,4);
p1 = point(10,4);
DLIB_TEST(rotate_point(center, p1, pi/2) == point(3,7+4));
center = point(3,3);
p1 = point(10,3);
DLIB_TEST(rotate_point(center, p1, pi/4) == point(8,8));
DLIB_TEST(rotate_point(center, p1, -pi/4) == point(8,-2));
DLIB_TEST(rotate_point(center, p1, pi/4 + 10*pi) == point(8,8));
DLIB_TEST(rotate_point(center, p1, -pi/4 + 10*pi) == point(8,-2));
DLIB_TEST(rotate_point(center, p1, pi/4 - 10*pi) == point(8,8));
DLIB_TEST(rotate_point(center, p1, -pi/4 - 10*pi) == point(8,-2));
point_rotator rot(pi/2);
DLIB_TEST(rot(point(1,0)) == point(0,1));
DLIB_TEST(rot(point(0,1)) == point(-1,0));
}
{
rectangle rect;
rect = grow_rect(rect,1);
DLIB_TEST(rect.width() == 2);
DLIB_TEST(rect.height() == 2);
DLIB_TEST(rect.left() == -1);
DLIB_TEST(rect.top() == -1);
DLIB_TEST(rect.right() == 0);
DLIB_TEST(rect.bottom() == 0);
}
{
rectangle rect;
rect = grow_rect(rect,2);
DLIB_TEST(rect.width() == 4);
DLIB_TEST(rect.height() == 4);
DLIB_TEST(rect.left() == -2);
DLIB_TEST(rect.top() == -2);
DLIB_TEST(rect.right() == 1);
DLIB_TEST(rect.bottom() == 1);
rect = shrink_rect(rect,1);
DLIB_TEST(rect.width() == 2);
DLIB_TEST(rect.height() == 2);
DLIB_TEST(rect.left() == -1);
DLIB_TEST(rect.top() == -1);
DLIB_TEST(rect.right() == 0);
DLIB_TEST(rect.bottom() == 0);
}
{
std::vector< dlib::vector<double> > a;
dlib::vector<double> v;
dlib::rand::float_1a rnd;
for (int i = 0; i < 10; ++i)
{
v.x() = rnd.get_random_double();
v.y() = rnd.get_random_double();
v.z() = rnd.get_random_double();
a.push_back(v);
}
// This test is just to make sure the covariance function can compile when used
// on a dlib::vector. The actual test doesn't matter.
DLIB_TEST(sum(covariance(vector_to_matrix(a))) < 10);
}
}
class geometry_tester : public tester
{
public:
geometry_tester (
) :
tester ("test_geometry",
"Runs tests on the geometry stuff.")
{}
void perform_test (
)
{
geometry_test();
}
} a;
}