matrix_transformer.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2019 Tinko Bartels
  4. // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
  5. // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
  6. // Use, modification and distribution is subject to the Boost Software License,
  7. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include <geometry_test_common.hpp>
  10. #include <boost/geometry/strategies/transform/matrix_transformers.hpp>
  11. #include <boost/geometry/algorithms/transform.hpp>
  12. #include <boost/geometry/geometries/point.hpp>
  13. template <typename coordinate_type>
  14. void test_all()
  15. {
  16. typedef bg::model::point<coordinate_type, 2, bg::cs::cartesian> point_2d;
  17. typedef bg::model::point<coordinate_type, 3, bg::cs::cartesian> point_3d;
  18. typedef bg::model::point<coordinate_type, 4, bg::cs::cartesian> point_4d;
  19. point_2d p2d;
  20. point_3d p3d;
  21. point_4d p4d;
  22. bg::assign_values(p2d, 3, 5);
  23. boost::qvm::mat<coordinate_type, 5, 3> mat24;
  24. boost::qvm::A<0, 0>(mat24) = 1; boost::qvm::A<0, 1>(mat24) = 0; boost::qvm::A<0, 2>(mat24) = 0;
  25. boost::qvm::A<1, 0>(mat24) = 0; boost::qvm::A<1, 1>(mat24) = 1; boost::qvm::A<1, 2>(mat24) = 0;
  26. boost::qvm::A<2, 0>(mat24) = 1; boost::qvm::A<2, 1>(mat24) = -1; boost::qvm::A<2, 2>(mat24) = 0;
  27. boost::qvm::A<3, 0>(mat24) = -1; boost::qvm::A<3, 1>(mat24) = 1; boost::qvm::A<3, 2>(mat24) = 0;
  28. boost::qvm::A<4, 0>(mat24) = 0; boost::qvm::A<4, 1>(mat24) = 0; boost::qvm::A<4, 2>(mat24) = 1;
  29. bg::strategy::transform::matrix_transformer<coordinate_type, 2, 4> trans24(mat24);
  30. bg::transform(p2d, p4d, trans24);
  31. BOOST_CHECK_CLOSE(double(bg::get<0>(p4d)), 3.0, 0.001);
  32. BOOST_CHECK_CLOSE(double(bg::get<1>(p4d)), 5.0, 0.001);
  33. BOOST_CHECK_CLOSE(double(bg::get<2>(p4d)), -2.0, 0.001);
  34. BOOST_CHECK_CLOSE(double(bg::get<3>(p4d)), 2.0, 0.001);
  35. bg::strategy::transform::scale_transformer<coordinate_type, 4, 4> scale44(2);
  36. bg::transform(p4d, p4d, scale44);
  37. BOOST_CHECK_CLOSE(double(bg::get<0>(p4d)), 6.0, 0.001);
  38. BOOST_CHECK_CLOSE(double(bg::get<1>(p4d)), 10.0, 0.001);
  39. BOOST_CHECK_CLOSE(double(bg::get<2>(p4d)), -4.0, 0.001);
  40. BOOST_CHECK_CLOSE(double(bg::get<3>(p4d)), 4.0, 0.001);
  41. boost::qvm::mat<coordinate_type, 4, 5> mat43;
  42. boost::qvm::A<0, 0>(mat43) = 0 ; boost::qvm::A<0, 1>(mat43) = 0; boost::qvm::A<0, 2>(mat43) = 0.5; boost::qvm::A<0, 3>(mat43) = 0 ; boost::qvm::A<0, 4>(mat43) = 0;
  43. boost::qvm::A<1, 0>(mat43) = 0.5; boost::qvm::A<1, 1>(mat43) = 0; boost::qvm::A<1, 2>(mat43) = 0 ; boost::qvm::A<1, 3>(mat43) = 0 ; boost::qvm::A<1, 4>(mat43) = 0;
  44. boost::qvm::A<2, 0>(mat43) = 0 ; boost::qvm::A<2, 1>(mat43) = 0; boost::qvm::A<2, 2>(mat43) = 0 ; boost::qvm::A<2, 3>(mat43) = 0.5; boost::qvm::A<2, 4>(mat43) = 0;
  45. boost::qvm::A<3, 0>(mat43) = 0 ; boost::qvm::A<3, 1>(mat43) = 0; boost::qvm::A<3, 2>(mat43) = 0 ; boost::qvm::A<3, 3>(mat43) = 0 ; boost::qvm::A<3, 4>(mat43) = 1;
  46. bg::strategy::transform::matrix_transformer<coordinate_type, 4, 3> trans43(mat43);
  47. bg::transform(p4d, p3d, trans43);
  48. BOOST_CHECK_CLOSE(double(bg::get<0>(p3d)), -2.0, 0.001);
  49. BOOST_CHECK_CLOSE(double(bg::get<1>(p3d)), 3.0, 0.001);
  50. BOOST_CHECK_CLOSE(double(bg::get<2>(p3d)), 2.0, 0.001);
  51. bg::strategy::transform::matrix_transformer<coordinate_type, 3, 3> trans33(1, 0, 0, 0,
  52. 0, 0, 1, 0,
  53. 0, 1, 0, 0,
  54. 0, 0, 0, 1);
  55. bg::transform(p3d, p3d, trans33);
  56. BOOST_CHECK_CLOSE(double(bg::get<0>(p3d)), -2.0, 0.001);
  57. BOOST_CHECK_CLOSE(double(bg::get<1>(p3d)), 2.0, 0.001);
  58. BOOST_CHECK_CLOSE(double(bg::get<2>(p3d)), 3.0, 0.001);
  59. boost::qvm::mat<coordinate_type, 3, 4> mat32;
  60. boost::qvm::A<0, 0>(mat32) = 1; boost::qvm::A<0, 1>(mat32) = 1; boost::qvm::A<0, 2>(mat32) = 1; boost::qvm::A<0, 3>(mat32) = 0;
  61. boost::qvm::A<1, 0>(mat32) = -1; boost::qvm::A<1, 1>(mat32) = 0; boost::qvm::A<1, 2>(mat32) = 1; boost::qvm::A<1, 3>(mat32) = 0;
  62. boost::qvm::A<2, 0>(mat32) = 0; boost::qvm::A<2, 1>(mat32) = 0; boost::qvm::A<2, 2>(mat32) = 0; boost::qvm::A<2, 3>(mat32) = 1;
  63. bg::strategy::transform::matrix_transformer<coordinate_type, 3, 2> trans32(mat32);
  64. bg::transform(p3d, p2d, trans32);
  65. BOOST_CHECK_CLOSE(double(bg::get<0>(p2d)), 3.0, 0.001);
  66. BOOST_CHECK_CLOSE(double(bg::get<1>(p2d)), 5.0, 0.001);
  67. bg::strategy::transform::matrix_transformer<coordinate_type, 2, 2>
  68. trans_composed(
  69. trans32.matrix() * trans33.matrix() * trans43.matrix() * scale44.matrix() * trans24.matrix());
  70. bg::transform(p2d, p2d, trans_composed);
  71. BOOST_CHECK_CLOSE(double(bg::get<0>(p2d)), 3.0, 0.001);
  72. BOOST_CHECK_CLOSE(double(bg::get<1>(p2d)), 5.0, 0.001);
  73. }
  74. int test_main(int, char* [])
  75. {
  76. test_all<float>();
  77. test_all<double>();
  78. return 0;
  79. }