1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
6
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 //
11 // Custom pointer-to-point example
12
13 #include <iostream>
14
15 #include <boost/foreach.hpp>
16
17 #include <boost/geometry/algorithms/distance.hpp>
18 #include <boost/geometry/algorithms/length.hpp>
19 #include <boost/geometry/algorithms/make.hpp>
20 #include <boost/geometry/algorithms/intersection.hpp>
21 #include <boost/geometry/geometries/geometries.hpp>
22 #include <boost/geometry/geometries/point_xy.hpp>
23 #include <boost/geometry/geometries/register/linestring.hpp>
24 #include <boost/geometry/strategies/strategies.hpp>
25
26 BOOST_GEOMETRY_REGISTER_LINESTRING_TEMPLATED(std::vector)
27 BOOST_GEOMETRY_REGISTER_LINESTRING_TEMPLATED(std::deque)
28
29 // Sample point, having x/y
30 struct my_point
31 {
32 double x,y;
33 };
34
35
36 namespace boost { namespace geometry { namespace traits {
37
38 template<> struct tag<my_point>
39 { typedef point_tag type; };
40
41 template<> struct coordinate_type<my_point>
42 { typedef double type; };
43
44 template<> struct coordinate_system<my_point>
45 { typedef cs::cartesian type; };
46
47 template<> struct dimension<my_point> : boost::mpl::int_<2> {};
48
49 template<>
50 struct access<my_point, 0>
51 {
getboost::geometry::traits::access52 static double get(my_point const& p)
53 {
54 return p.x;
55 }
56
setboost::geometry::traits::access57 static void set(my_point& p, double const& value)
58 {
59 p.x = value;
60 }
61 };
62
63 template<>
64 struct access<my_point, 1>
65 {
getboost::geometry::traits::access66 static double get(my_point const& p)
67 {
68 return p.y;
69 }
70
setboost::geometry::traits::access71 static void set(my_point& p, double const& value)
72 {
73 p.y = value;
74 }
75 };
76
77 }}} // namespace boost::geometry::traits
78
79
80
main()81 int main()
82 {
83 typedef std::vector<my_point*> ln;
84 ln myline;
85 for (float i = 0.0; i < 10.0; i++)
86 {
87 my_point* p = new my_point;
88 p->x = i;
89 p->y = i + 1;
90 myline.push_back(p);
91 }
92
93 std::cout << boost::geometry::length(myline) << std::endl;
94
95 typedef boost::geometry::model::d2::point_xy<double> point_2d;
96 typedef boost::geometry::model::box<point_2d> box_2d;
97 box_2d cb(point_2d(1.5, 1.5), point_2d(4.5, 4.5));
98
99 // This will NOT work because would need dynamicly allocating memory for point* in algorithms:
100 // std::vector<ln> clipped;
101 //boost::geometry::intersection(cb, myline, clipped);
102
103 // This works because outputs to a normal struct point, no point*
104 typedef boost::geometry::model::linestring<point_2d> linestring_2d;
105 std::vector<linestring_2d> clipped;
106 boost::geometry::strategy::intersection::liang_barsky<box_2d, point_2d> strategy;
107 boost::geometry::detail::intersection::clip_range_with_box<linestring_2d>(cb,
108 myline, std::back_inserter(clipped), strategy);
109
110
111 std::cout << boost::geometry::length(clipped.front()) << std::endl;
112
113 // free
114 BOOST_FOREACH(my_point* p, myline)
115 {
116 delete p;
117 }
118
119 return 0;
120 }
121