]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/overlay/traverse_gmp.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
4 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
5 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
6 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
8 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
9 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
11 // Use, modification and distribution is subject to the Boost Software License,
12 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
13 // http://www.boost.org/LICENSE_1_0.txt)
15 #error This unit test is not updated for several years
19 #pragma warning( disable : 4244 )
20 #pragma warning( disable : 4267 )
23 //#define GEOMETRY_DEBUG_INTERSECTION
31 #include <boost/numeric_adaptor/numeric_adaptor.hpp>
32 #include <boost/numeric_adaptor/gmp_value_type.hpp>
34 #include <boost/geometry/geometry.hpp>
35 #include <boost/geometry/geometries/geometries.hpp>
36 #include <boost/geometry/geometries/point_xy.hpp>
38 #include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
39 #include <boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>
40 #include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
41 #include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
42 #include <boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>
43 #include <boost/geometry/algorithms/detail/overlay/traverse.hpp>
47 #include <boost/geometry/io/wkt/wkt.hpp>
49 #if defined(TEST_WITH_SVG)
50 # include <boost/geometry/io/svg/svg_mapper.hpp>
55 template <typename OutputType
, typename G1
, typename G2
>
56 void test_traverse(std::string
const& caseid
, G1
const& g1
, G2
const& g2
)
58 typedef bg::detail::intersection::intersection_point
59 <typename
bg::point_type
<G2
>::type
> ip
;
60 typedef typename
boost::range_const_iterator
<std::vector
<ip
> >::type iterator
;
61 typedef std::vector
<ip
> ip_vector
;
64 typedef typename
bg::strategy::side::services::default_strategy
66 typename
bg::cs_tag
<G1
>::type
67 >::type strategy_type
;
70 typedef bg::detail::overlay::traversal_turn_info
72 typename
bg::point_type
<G2
>::type
74 typedef typename
boost::range_iterator
<const std::vector
<turn_info
> >::type iterator
;
75 std::vector
<turn_info
> ips
;
77 bg::get_turns
<false, false, bg::detail::overlay::assign_null_policy
>(g1
, g2
, ips
);
78 bg::enrich_intersection_points(ips
, g1
, g2
, strategy_type());
80 typedef bg::model::ring
<typename
bg::point_type
<G2
>::type
> ring_type
;
81 typedef std::vector
<ring_type
> out_vector
;
92 g1
, g2
, -1, ips
, std::back_inserter(v
)
97 #if defined(TEST_WITH_SVG)
99 std::ostringstream filename
;
100 filename
<< "intersection_" << caseid
<< ".svg";
102 std::ofstream
svg(filename
.str().c_str());
104 // Trick to have this always LongDouble
105 //typedef bg::model::d2::point_xy<long double> P;
106 typedef typename
bg::point_type
<G1
>::type P
;
107 //typename bg::replace_point_type<G1, P>::type rg1;
108 //typename bg::replace_point_type<G2, P>::type rg2;
110 bg::svg_mapper
<P
> mapper(svg
, 1000, 800);
115 // Input shapes in green/blue
116 mapper
.map(g1
, "opacity:0.8;fill:rgb(0,255,0);"
117 "stroke:rgb(0,0,0);stroke-width:1");
118 mapper
.map(g2
, "opacity:0.8;fill:rgb(0,0,255);"
119 "stroke:rgb(0,0,0);stroke-width:1");
121 // Traversal rings in red
122 for (typename
out_vector::const_iterator it
= boost::begin(v
);
126 mapper
.map(*it
, "fill-opacity:0.1;stroke-opacity:0.9;"
127 "fill:rgb(255,0,0);stroke:rgb(255,0,0);stroke-width:5");
129 std::cout
<< bg::wkt(*it
) << std::endl
;
130 std::cout
<< bg::area(*it
) << std::endl
;
134 for (iterator it
= boost::begin(ips
); it
!= boost::end(ips
); ++it
)
136 mapper
.map(it
->point
, "fill:rgb(255,128,0);"
137 "stroke:rgb(0,0,100);stroke-width:1");
143 template <typename OutputType
, typename G1
, typename G2
>
144 void test_one(std::string
const& caseid
, std::string
const& wkt1
, std::string
const& wkt2
)
147 bg::read_wkt(wkt1
, g1
);
150 bg::read_wkt(wkt2
, g2
);
154 std::cout
<< "area1 " << bg::area(g1
) << " " << " area2: " << bg::area(g2
) << std::endl
;
156 test_traverse
<OutputType
>(caseid
, g1
, g2
);
160 #if ! defined(GEOMETRY_TEST_MULTI)
162 template <typename P
>
163 void test_traverse_gmp(std::string
const& caseid
)
165 typedef bg::model::polygon
<P
> polygon
;
166 std::cout
<< typeid(typename
bg::coordinate_type
<P
>::type
).name() << std::endl
;
167 std::cout
<< std::setprecision(30) << std::numeric_limits
<float>::epsilon() << std::endl
;
168 std::cout
<< std::setprecision(30) << std::numeric_limits
<double>::epsilon() << std::endl
;
169 std::cout
<< std::setprecision(30) << std::numeric_limits
<long double>::epsilon() << std::endl
;
171 static std::string brandon
[3] =
173 //37.43402099609375 1.470055103302002,
174 "POLYGON((37.29449462890625 1.7902572154998779,37.000419616699219 1.664225697517395,37.140213012695313 1.3446992635726929,50.974888957147442 -30.277285722290763,57.297810222148939 -37.546793343968417,41.590042114257813 -7.2021245956420898,40.6978759765625 -5.4500408172607422,40.758884429931641 -5.418975830078125,42.577911376953125 -4.4901103973388672,42.577877044677734 -4.4900407791137695,42.699958801269531 -4.4278755187988281,46.523914387974358 -8.5152102535033496,47.585065917176543 -6.1314922196594779,45.389434814453125 -4.5143837928771973,46.296027072709599 -2.4984308554828116,37.29449462890625 1.7902572154998779))",
175 "POLYGON((42.399410247802734 1.4956772327423096,42.721500396728516 2.2342472076416016,42.721500396728516 3.6584999561309814,51.20102152843122 7.1738039562841562,51.370888500897557 7.4163459734570729,37.43402099609375 1.470055103302002,37.29449462890625 1.7902572154998779,37.000419616699219 1.664225697517395,37.140213012695313 1.3446992635726929,36.954700469970703 1.2597870826721191,26.472516656201325 -3.5380830513658776,27.069889344709196 -4.2926591211028242,30.501169204711914 -2.3718316555023193,32.708126068115234 -2.3611266613006592,32.708126068115234 -2.3611700534820557,32.708168029785156 -2.3611698150634766,32.718830108642578 -4.3281683921813965,29.135100397190627 -8.9262827849488211,29.619997024536133 -9.5368013381958008,30.339155197143555 -8.9838371276855469,30.670633316040039 -8.8180980682373047,30.896280288696289 -9.1206979751586914,30.207040612748258 -10.275926149505661,30.947774887084961 -11.208560943603516,31.669155120849609 -10.653837203979492,32.000633239746094 -10.488097190856934,32.226280212402344 -10.790698051452637,31.682494778186321 -12.133624901803865,32.274600982666016 -12.879127502441406,32.998821258544922 -12.323249816894531,33.339523315429688 -12.147735595703125,33.566280364990234 -12.450697898864746,33.164891643669634 -14.000060288415174,33.598796844482422 -14.546377182006836,34.328716278076172 -13.992490768432617,34.658355712890625 -13.81736946105957,34.886280059814453 -14.120697975158691,34.634240447128811 -15.85007183479255,34.931102752685547 -16.223842620849609,35.656356811523438 -15.66030216217041,35.963497161865234 -15.476018905639648,37.326129913330078 -17.190576553344727,38.823680877685547 -16.296066284179688,39.966808319091797 -17.625011444091797,40.800632476806641 -17.208097457885742,41.821544647216797 -19.211688995361328,41.988733475572282 -19.945838749437218,57.524304765518266 -37.807195733984784,41.590042114257813 -7.2021245956420898,40.6978759765625 -5.4500408172607422,40.758884429931641 -5.418975830078125,42.577911376953125 -4.4901103973388672,42.577877044677734 -4.4900407791137695,42.699958801269531 -4.4278755187988281,46.559533858616469 -8.435196445683264,47.604561877161387 -6.087697464505224,45.389434814453125 -4.5143837928771973,46.695858001708984 -1.6093428134918213,47.263670054709685 -1.784876824891044,47.830955505371094 -0.69758313894271851,48.43512638981781 -0.81299959072453376,49.071769542946825 0.61489892713413252,43.764598846435547 0.93951499462127686,43.644271850585938 0.96149998903274536,42.399410247802734 1.4956772327423096))",
176 "POLYGON((43.644271850585938 0.96149998903274536,43.764598846435547 0.93951499462127686,49.071769542946825 0.61489892713413252,48.43512638981781 -0.81299959072453376,47.830955505371094 -0.69758313894271851,47.263670054709685 -1.784876824891044,46.695858001708984 -1.6093428134918213,45.389434814453125 -4.5143837928771973,47.604561877161387 -6.087697464505224,46.559533858616469 -8.435196445683264,42.699958801269531 -4.4278755187988281,42.577877044677734 -4.4900407791137695,42.577911376953125 -4.4901103973388672,40.758884429931641 -5.418975830078125,40.6978759765625 -5.4500408172607422,41.590042114257813 -7.2021245956420898,57.524304765518266 -37.807195733984784,41.988733475572282 -19.945838749437218,41.821544647216797 -19.211688995361328,40.800632476806641 -17.208097457885742,39.966808319091797 -17.625011444091797,38.823680877685547 -16.296066284179688,37.326129913330078 -17.190576553344727,35.963497161865234 -15.476018905639648,35.656356811523438 -15.66030216217041,34.931102752685547 -16.223842620849609,34.634240447128811 -15.85007183479255,34.886280059814453 -14.120697975158691,34.658355712890625 -13.81736946105957,34.328716278076172 -13.992490768432617,33.598796844482422 -14.546377182006836,33.164891643669634 -14.000060288415174,33.566280364990234 -12.450697898864746,33.339523315429688 -12.147735595703125,32.998821258544922 -12.323249816894531,32.274600982666016 -12.879127502441406,31.682494778186321 -12.133624901803865,32.226280212402344 -10.790698051452637,32.000633239746094 -10.488097190856934,31.669155120849609 -10.653837203979492,30.947774887084961 -11.208560943603516,30.207040612748258 -10.275926149505661,30.896280288696289 -9.1206979751586914,30.670633316040039 -8.8180980682373047,30.339155197143555 -8.9838371276855469,29.619997024536133 -9.5368013381958008,29.135100397190627 -8.9262827849488211,32.718830108642578 -4.3281683921813965,32.708168029785156 -2.3611698150634766,32.708126068115234 -2.3611700534820557,32.708126068115234 -2.3611266613006592,30.501169204711914 -2.3718316555023193,27.069889344709196 -4.2926591211028242,26.472516656201325 -3.5380830513658776,36.954700469970703 1.2597870826721191,37.140213012695313 1.3446992635726929,37.000419616699219 1.664225697517395,37.29449462890625 1.7902572154998779,37.43402099609375 1.470055103302002,51.370888500897557 7.4163459734570729,51.20102152843122 7.1738039562841562,42.721500396728516 3.6584999561309814,42.721500396728516 2.2342472076416016,42.399410247802734 1.4956772327423096,43.644271850585938 0.96149998903274536))"
180 // Test the FORWARD case
181 test_one
<polygon
, polygon
, polygon
>(caseid
, brandon
[0], brandon
[1]);
187 int main(int argc
, char** argv
)
189 int mode
= (argc
> 1) ? atol(argv
[1]) : 1;
193 test_traverse_gmp
<bg::model::d2::point_xy
<float> >("float");
196 test_traverse_gmp
<bg::model::d2::point_xy
<double> >("double");
199 test_traverse_gmp
<bg::model::d2::point_xy
<long double> >("long double");
202 #if defined(HAVE_TTMATH)
203 test_traverse_gmp
<bg::model::d2::point_xy
<ttmath_big
> >("ttmath_big");