• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 
5 // Use, modification and distribution is subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TURN_INFO_HPP
10 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TURN_INFO_HPP
11 
12 
13 #include <boost/array.hpp>
14 
15 #include <boost/geometry/core/coordinate_type.hpp>
16 #include <boost/geometry/algorithms/detail/signed_size_type.hpp>
17 #include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
18 #include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
19 #include <boost/geometry/policies/robustness/segment_ratio.hpp>
20 
21 namespace boost { namespace geometry
22 {
23 
24 #ifndef DOXYGEN_NO_DETAIL
25 namespace detail { namespace overlay
26 {
27 
28 enum method_type
29 {
30     method_none,
31     method_disjoint,
32     method_crosses,
33     method_touch,
34     method_touch_interior,
35     method_collinear,
36     method_equal,
37     method_error
38 };
39 
40 
41 /*!
42     \brief Turn operation: operation
43     \details Information necessary for traversal phase (a phase
44         of the overlay process). The information is gathered during the
45         get_turns (segment intersection) phase.
46         The class is to be included in the turn_info class, either direct
47         or a derived or similar class with more (e.g. enrichment) information.
48  */
49 template <typename Point, typename SegmentRatio>
50 struct turn_operation
51 {
52     typedef SegmentRatio segment_ratio_type;
53 
54     operation_type operation;
55     segment_identifier seg_id;
56     SegmentRatio fraction;
57 
58     typedef typename coordinate_type<Point>::type comparable_distance_type;
59     comparable_distance_type remaining_distance;
60 
turn_operationboost::geometry::detail::overlay::turn_operation61     inline turn_operation()
62         : operation(operation_none)
63         , remaining_distance(0)
64     {}
65 };
66 
67 
68 /*!
69     \brief Turn information: intersection point, method, and turn information
70     \details Information necessary for traversal phase (a phase
71         of the overlay process). The information is gathered during the
72         get_turns (segment intersection) phase.
73     \tparam Point point type of intersection point
74     \tparam Operation gives classes opportunity to add additional info
75     \tparam Container gives classes opportunity to define how operations are stored
76  */
77 template
78 <
79     typename Point,
80     typename SegmentRatio = geometry::segment_ratio<typename coordinate_type<Point>::type>,
81     typename Operation = turn_operation<Point, SegmentRatio>,
82     typename Container = boost::array<Operation, 2>
83 >
84 struct turn_info
85 {
86     typedef Point point_type;
87     typedef SegmentRatio segment_ratio_type;
88     typedef Operation turn_operation_type;
89     typedef Container container_type;
90 
91     Point point;
92     method_type method;
93     bool touch_only; // True in case of method touch(interior) and lines do not cross
94     signed_size_type cluster_id; // For multiple turns on same location, > 0. Else -1. 0 is unused.
95     bool discarded;
96     bool has_colocated_both; // Colocated with a uu turn (for union) or ii (other)
97 
98     Container operations;
99 
turn_infoboost::geometry::detail::overlay::turn_info100     inline turn_info()
101         : method(method_none)
102         , touch_only(false)
103         , cluster_id(-1)
104         , discarded(false)
105         , has_colocated_both(false)
106     {}
107 
bothboost::geometry::detail::overlay::turn_info108     inline bool both(operation_type type) const
109     {
110         return has12(type, type);
111     }
112 
hasboost::geometry::detail::overlay::turn_info113     inline bool has(operation_type type) const
114     {
115         return this->operations[0].operation == type
116             || this->operations[1].operation == type;
117     }
118 
combinationboost::geometry::detail::overlay::turn_info119     inline bool combination(operation_type type1, operation_type type2) const
120     {
121         return has12(type1, type2) || has12(type2, type1);
122     }
123 
blockedboost::geometry::detail::overlay::turn_info124     inline bool blocked() const
125     {
126         return both(operation_blocked);
127     }
oppositeboost::geometry::detail::overlay::turn_info128     inline bool opposite() const
129     {
130         return both(operation_opposite);
131     }
any_blockedboost::geometry::detail::overlay::turn_info132     inline bool any_blocked() const
133     {
134         return has(operation_blocked);
135     }
is_clusteredboost::geometry::detail::overlay::turn_info136     inline bool is_clustered() const
137     {
138         return cluster_id > 0;
139     }
140 
141 private :
has12boost::geometry::detail::overlay::turn_info142     inline bool has12(operation_type type1, operation_type type2) const
143     {
144         return this->operations[0].operation == type1
145             && this->operations[1].operation == type2
146             ;
147     }
148 
149 };
150 
151 
152 }} // namespace detail::overlay
153 #endif //DOXYGEN_NO_DETAIL
154 
155 
156 }} // namespace boost::geometry
157 
158 
159 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TURN_INFO_HPP
160