boost_polygon.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
  4. // Use, modification and distribution is subject to the Boost Software License,
  5. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // geometry::num_points does not accept the ring_proxy for adaptation, like
  8. // centroid and probably many more algorithms. TODO: fix that. Until then we
  9. // define it such that num_points is not called.
  10. #define BOOST_GEOMETRY_EMPTY_INPUT_NO_THROW
  11. #include <geometry_test_common.hpp>
  12. #include <boost/geometry/geometry.hpp>
  13. #include <boost/geometry/geometries/box.hpp>
  14. #include <boost/geometry/geometries/point.hpp>
  15. #include <boost/geometry/geometries/polygon.hpp>
  16. #include <boost/geometry/geometries/ring.hpp>
  17. #include <boost/geometry/geometries/adapted/boost_polygon/point.hpp>
  18. #include <boost/geometry/geometries/adapted/boost_polygon/box.hpp>
  19. #include <boost/geometry/geometries/adapted/boost_polygon/ring.hpp>
  20. #include <boost/geometry/geometries/adapted/boost_polygon/polygon.hpp>
  21. #include <boost/geometry/io/wkt/wkt.hpp>
  22. #include <iostream>
  23. template <typename T>
  24. void fill_polygon_with_two_holes(boost::polygon::polygon_with_holes_data<T>& boost_polygon_polygon)
  25. {
  26. std::vector<boost::polygon::point_data<T> > point_vector;
  27. point_vector.push_back(boost::polygon::point_data<T>(0, 0));
  28. point_vector.push_back(boost::polygon::point_data<T>(0, 10));
  29. point_vector.push_back(boost::polygon::point_data<T>(10, 10));
  30. point_vector.push_back(boost::polygon::point_data<T>(10, 0));
  31. point_vector.push_back(boost::polygon::point_data<T>(0, 0));
  32. boost_polygon_polygon.set(point_vector.begin(), point_vector.end());
  33. std::vector<boost::polygon::polygon_data<T> > holes;
  34. holes.resize(2);
  35. {
  36. std::vector<boost::polygon::point_data<T> > point_vector;
  37. point_vector.push_back(boost::polygon::point_data<T>(1, 1));
  38. point_vector.push_back(boost::polygon::point_data<T>(2, 1));
  39. point_vector.push_back(boost::polygon::point_data<T>(2, 2));
  40. point_vector.push_back(boost::polygon::point_data<T>(1, 2));
  41. point_vector.push_back(boost::polygon::point_data<T>(1, 1));
  42. holes[0].set(point_vector.begin(), point_vector.end());
  43. }
  44. {
  45. std::vector<boost::polygon::point_data<T> > point_vector;
  46. point_vector.push_back(boost::polygon::point_data<T>(3, 3));
  47. point_vector.push_back(boost::polygon::point_data<T>(4, 3));
  48. point_vector.push_back(boost::polygon::point_data<T>(4, 4));
  49. point_vector.push_back(boost::polygon::point_data<T>(3, 4));
  50. point_vector.push_back(boost::polygon::point_data<T>(3, 3));
  51. holes[1].set(point_vector.begin(), point_vector.end());
  52. }
  53. boost_polygon_polygon.set_holes(holes.begin(), holes.end());
  54. }
  55. template <typename T>
  56. void test_coordinate_type()
  57. {
  58. // 1a: Check if Boost.Polygon's point fulfills Boost.Geometry's point concept
  59. bg::concepts::check<boost::polygon::point_data<T> >();
  60. // 1b: use a Boost.Polygon point in Boost.Geometry, calc. distance with two point types
  61. boost::polygon::point_data<T> boost_polygon_point(1, 2);
  62. typedef bg::model::point<T, 2, bg::cs::cartesian> bg_point_type;
  63. bg_point_type boost_geometry_point(3, 4);
  64. BOOST_CHECK_EQUAL(bg::distance(boost_polygon_point, boost_geometry_point),
  65. 2 * std::sqrt(2.0));
  66. // 2a: Check if Boost.Polygon's box fulfills Boost.Geometry's box concept
  67. bg::concepts::check<boost::polygon::rectangle_data<T> >();
  68. // 2b: use a Boost.Polygon rectangle in Boost.Geometry, compare with boxes
  69. boost::polygon::rectangle_data<T> boost_polygon_box;
  70. bg::model::box<bg_point_type> boost_geometry_box;
  71. bg::assign_values(boost_polygon_box, 0, 1, 5, 6);
  72. bg::assign_values(boost_geometry_box, 0, 1, 5, 6);
  73. T boost_polygon_area = bg::area(boost_polygon_box);
  74. T boost_geometry_area = bg::area(boost_geometry_box);
  75. T boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_box);
  76. BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
  77. BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
  78. // 3a: Check if Boost.Polygon's polygon fulfills Boost.Geometry's ring concept
  79. bg::concepts::check<boost::polygon::polygon_data<T> >();
  80. // 3b: use a Boost.Polygon polygon (ring)
  81. boost::polygon::polygon_data<T> boost_polygon_ring;
  82. {
  83. // Filling it is a two-step process using Boost.Polygon
  84. std::vector<boost::polygon::point_data<T> > point_vector;
  85. point_vector.push_back(boost::polygon::point_data<T>(0, 0));
  86. point_vector.push_back(boost::polygon::point_data<T>(0, 3));
  87. point_vector.push_back(boost::polygon::point_data<T>(4, 0));
  88. point_vector.push_back(boost::polygon::point_data<T>(0, 0));
  89. boost_polygon_ring.set(point_vector.begin(), point_vector.end());
  90. }
  91. // Boost-geometry ring
  92. bg::model::ring<bg_point_type> boost_geometry_ring;
  93. {
  94. boost_geometry_ring.push_back(bg_point_type(0, 0));
  95. boost_geometry_ring.push_back(bg_point_type(0, 3));
  96. boost_geometry_ring.push_back(bg_point_type(4, 0));
  97. boost_geometry_ring.push_back(bg_point_type(0, 0));
  98. }
  99. boost_polygon_area = bg::area(boost_polygon_ring);
  100. boost_geometry_area = bg::area(boost_geometry_ring);
  101. boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_ring);
  102. BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
  103. BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
  104. // Check mutable ring
  105. std::string wkt = "POLYGON((0 0,0 10,10 10,10 0,0 0))";
  106. bg::read_wkt(wkt, boost_polygon_ring);
  107. bg::read_wkt(wkt, boost_geometry_ring);
  108. boost_polygon_area = bg::area(boost_polygon_ring);
  109. boost_geometry_area = bg::area(boost_geometry_ring);
  110. boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_ring);
  111. BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
  112. BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
  113. // 4a: Boost.Polygon's polygon with holes
  114. boost::polygon::polygon_with_holes_data<T> boost_polygon_polygon;
  115. fill_polygon_with_two_holes(boost_polygon_polygon);
  116. // Using Boost.Polygon
  117. boost_polygon_area = bg::area(boost_polygon_polygon);
  118. boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_polygon);
  119. BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
  120. wkt = "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,2 1,2 2,1 2,1 1),(3 3,4 3,4 4,3 4,3 3))";
  121. bg::model::polygon<bg_point_type> boost_geometry_polygon;
  122. bg::read_wkt(wkt, boost_geometry_polygon);
  123. boost_geometry_area = bg::area(boost_geometry_polygon);
  124. BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
  125. bg::clear(boost_polygon_polygon);
  126. bg::read_wkt(wkt, boost_polygon_polygon);
  127. boost_geometry_area = bg::area(boost_polygon_polygon);
  128. BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
  129. std::ostringstream out;
  130. out << bg::wkt(boost_polygon_polygon);
  131. BOOST_CHECK_EQUAL(wkt, out.str());
  132. }
  133. int test_main(int, char* [])
  134. {
  135. test_coordinate_type<int>();
  136. //test_coordinate_type<float>(); // compiles, but "BOOST_CHECK_EQUAL" fails
  137. test_coordinate_type<double>();
  138. return 0;
  139. }