00001
00002
00003
00004
00005
00006
00007
00008 #include <boost/test/unit_test.hpp>
00009 #include <boost/test/floating_point_comparison.hpp>
00010 #include "../projection/projection.h"
00011
00012 BOOST_AUTO_TEST_SUITE(projection)
00013
00014 BOOST_AUTO_TEST_CASE(some)
00015 {
00016 proj::OrthoProjection proj(geo::Point(36, 50), 1);
00017 auto res = proj.project(36, 48);
00018 BOOST_CHECK_LT(res.x, 0);
00019 BOOST_CHECK_GT(res.y, 0);
00020 res = proj.project(37, 50);
00021 BOOST_CHECK(abs(res.x) < 0.0000001);
00022 BOOST_CHECK_GT(res.y, 0);
00023 proj = proj::OrthoProjection(geo::Point(-36, 50), 1);
00024 res = proj.project(-36, 48);
00025 BOOST_CHECK_LT(res.x, 0);
00026 BOOST_CHECK_LT(res.y, 0);
00027 res = proj.project(-37, 50);
00028 BOOST_CHECK(abs(res.x) < 0.0000001);
00029 BOOST_CHECK_LT(res.y, 0);
00030 proj = proj::OrthoProjection(geo::Point(-36, -50), 1);
00031 res = proj.project(-36, -48);
00032 BOOST_CHECK_GT(res.x, 0);
00033 BOOST_CHECK_LT(res.y, 0);
00034 res = proj.project(-37, -50);
00035 BOOST_CHECK(abs(res.x) < 0.0000001);
00036 BOOST_CHECK_LT(res.y, 0);
00037 proj = proj::OrthoProjection(geo::Point(36, -50), 1);
00038 res = proj.project(36, -48);
00039 BOOST_CHECK_GT(res.x, 0);
00040 BOOST_CHECK_GT(res.y, 0);
00041 res = proj.project(37, -50);
00042 BOOST_CHECK(abs(res.x) < 0.0000001);
00043 BOOST_CHECK_GT(res.y, 0);
00044 }
00045
00046 BOOST_AUTO_TEST_CASE(border)
00047 {
00048 proj::OrthoProjection proj(geo::Point(0, 0), 1);
00049 auto res = proj.project(90, 0);
00050 BOOST_CHECK(abs(res.x) < 0.0000001);
00051 BOOST_CHECK(abs(res.y - 1) < 0.0000001);
00052 res = proj.project(0, 90);
00053 BOOST_CHECK(abs(res.x - 1) < 0.0000001);
00054 BOOST_CHECK(abs(res.y) < 0.0000001);
00055 res = proj.project(-90, 0);
00056 BOOST_CHECK(abs(res.x) < 0.0000001);
00057 BOOST_CHECK(abs(res.y + 1) < 0.0000001);
00058 res = proj.project(0, -90);
00059 BOOST_CHECK(abs(res.x + 1) < 0.0000001);
00060 BOOST_CHECK(abs(res.y) < 0.0000001);
00061 }
00062
00063 BOOST_AUTO_TEST_CASE(zero)
00064 {
00065 proj::OrthoProjection proj(geo::Point(0, 0), 1);
00066 auto res = proj.project(0, 0);
00067 BOOST_CHECK(abs(res.x) < 0.0000001);
00068 BOOST_CHECK(abs(res.y) < 0.0000001);
00069 auto res2 = proj.unproject(0, 0);
00070 BOOST_CHECK(abs(res2.lat) < 0.0000001);
00071 BOOST_CHECK(abs(res2.lon) < 0.0000001);
00072 proj = proj::OrthoProjection(geo::Point(90, 0), 1);
00073 res = proj.project(90, 0);
00074 BOOST_CHECK(abs(res.x) < 0.0000001);
00075 BOOST_CHECK(abs(res.y) < 0.0000001);
00076 proj = proj::OrthoProjection(geo::Point(45, 100), 1);
00077 res = proj.project(45, 100);
00078 BOOST_CHECK(abs(res.x) < 0.0000001);
00079 BOOST_CHECK(abs(res.y) < 0.0000001);
00080 }
00081
00082 BOOST_AUTO_TEST_CASE(inverse)
00083 {
00084
00085 proj::OrthoProjection proj(geo::Point(-43, 65), 100);
00086 for (int i = -10; i <= 10; ++i)
00087 {
00088 for (int j = -10; j <= 10; ++j)
00089 {
00090 proj::FlatPoint p2 = proj.project(-43 + i, 65 + j);
00091 geo::Point p = proj.unproject(p2);
00092 BOOST_CHECK(abs(p.lat - (-43.0 + i)) <= 0.0000001);
00093 BOOST_CHECK(abs(p.lon - (65.0 + j)) <= 0.0000001);
00094 p = proj.unproject(i, j);
00095 p2 = proj.project(p);
00096 if (abs(p2.y - j) > 0)
00097 {
00098 std::cout << abs(p2.y - j) << std::endl;
00099 }
00100 BOOST_CHECK(abs(p2.x - i) <= 0.0000001);
00101 BOOST_CHECK(abs(p2.y - j) <= 0.0000001);
00102 }
00103 }
00104 }
00105
00106 BOOST_AUTO_TEST_SUITE_END()