annotate DEPENDENCIES/generic/include/boost/geometry/strategies/side_info.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@16 2
Chris@16 3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
Chris@16 4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
Chris@16 5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
Chris@16 6
Chris@16 7 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
Chris@16 8 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
Chris@16 9
Chris@16 10 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 12 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 13
Chris@16 14 #ifndef BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
Chris@16 15 #define BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
Chris@16 16
Chris@16 17 #include <cmath>
Chris@16 18 #include <utility>
Chris@16 19 #ifdef BOOST_GEOMETRY_DEBUG_INTERSECTION
Chris@16 20 #include <iostream>
Chris@16 21 #endif
Chris@16 22
Chris@16 23 namespace boost { namespace geometry
Chris@16 24 {
Chris@16 25
Chris@16 26 // Silence warning C4127: conditional expression is constant
Chris@16 27 #if defined(_MSC_VER)
Chris@16 28 #pragma warning(push)
Chris@16 29 #pragma warning(disable : 4127)
Chris@16 30 #endif
Chris@16 31
Chris@16 32 /*!
Chris@16 33 \brief Class side_info: small class wrapping for sides (-1,0,1)
Chris@16 34 */
Chris@16 35 class side_info
Chris@16 36 {
Chris@16 37 public :
Chris@16 38 inline side_info(int side_a1 = 0, int side_a2 = 0,
Chris@16 39 int side_b1 = 0, int side_b2 = 0)
Chris@16 40 {
Chris@16 41 sides[0].first = side_a1;
Chris@16 42 sides[0].second = side_a2;
Chris@16 43 sides[1].first = side_b1;
Chris@16 44 sides[1].second = side_b2;
Chris@16 45 }
Chris@16 46
Chris@16 47 template <int Which>
Chris@16 48 inline void set(int first, int second)
Chris@16 49 {
Chris@16 50 sides[Which].first = first;
Chris@16 51 sides[Which].second = second;
Chris@16 52 }
Chris@16 53
Chris@16 54 template <int Which, int Index>
Chris@16 55 inline void correct_to_zero()
Chris@16 56 {
Chris@16 57 if (Index == 0)
Chris@16 58 {
Chris@16 59 sides[Which].first = 0;
Chris@16 60 }
Chris@16 61 else
Chris@16 62 {
Chris@16 63 sides[Which].second = 0;
Chris@16 64 }
Chris@16 65 }
Chris@16 66
Chris@16 67 template <int Which, int Index>
Chris@16 68 inline int get() const
Chris@16 69 {
Chris@16 70 return Index == 0 ? sides[Which].first : sides[Which].second;
Chris@16 71 }
Chris@16 72
Chris@16 73
Chris@16 74 // Returns true if both lying on the same side WRT the other
Chris@16 75 // (so either 1,1 or -1-1)
Chris@16 76 template <int Which>
Chris@16 77 inline bool same() const
Chris@16 78 {
Chris@16 79 return sides[Which].first * sides[Which].second == 1;
Chris@16 80 }
Chris@16 81
Chris@16 82 inline bool collinear() const
Chris@16 83 {
Chris@16 84 return sides[0].first == 0
Chris@16 85 && sides[0].second == 0
Chris@16 86 && sides[1].first == 0
Chris@16 87 && sides[1].second == 0;
Chris@16 88 }
Chris@16 89
Chris@16 90 inline bool crossing() const
Chris@16 91 {
Chris@16 92 return sides[0].first * sides[0].second == -1
Chris@16 93 && sides[1].first * sides[1].second == -1;
Chris@16 94 }
Chris@16 95
Chris@16 96 inline bool touching() const
Chris@16 97 {
Chris@16 98 return (sides[0].first * sides[1].first == -1
Chris@16 99 && sides[0].second == 0 && sides[1].second == 0)
Chris@16 100 || (sides[1].first * sides[0].first == -1
Chris@16 101 && sides[1].second == 0 && sides[0].second == 0);
Chris@16 102 }
Chris@16 103
Chris@16 104 template <int Which>
Chris@16 105 inline bool one_touching() const
Chris@16 106 {
Chris@16 107 // This is normally a situation which can't occur:
Chris@16 108 // If one is completely left or right, the other cannot touch
Chris@16 109 return one_zero<Which>()
Chris@16 110 && sides[1 - Which].first * sides[1 - Which].second == 1;
Chris@16 111 }
Chris@16 112
Chris@16 113 inline bool meeting() const
Chris@16 114 {
Chris@16 115 // Two of them (in each segment) zero, two not
Chris@16 116 return one_zero<0>() && one_zero<1>();
Chris@16 117 }
Chris@16 118
Chris@16 119 template <int Which>
Chris@16 120 inline bool zero() const
Chris@16 121 {
Chris@16 122 return sides[Which].first == 0 && sides[Which].second == 0;
Chris@16 123 }
Chris@16 124
Chris@16 125 template <int Which>
Chris@16 126 inline bool one_zero() const
Chris@16 127 {
Chris@16 128 return (sides[Which].first == 0 && sides[Which].second != 0)
Chris@16 129 || (sides[Which].first != 0 && sides[Which].second == 0);
Chris@16 130 }
Chris@16 131
Chris@16 132 inline bool one_of_all_zero() const
Chris@16 133 {
Chris@16 134 int const sum = std::abs(sides[0].first)
Chris@16 135 + std::abs(sides[0].second)
Chris@16 136 + std::abs(sides[1].first)
Chris@16 137 + std::abs(sides[1].second);
Chris@16 138 return sum == 3;
Chris@16 139 }
Chris@16 140
Chris@16 141
Chris@16 142 template <int Which>
Chris@16 143 inline int zero_index() const
Chris@16 144 {
Chris@16 145 return sides[Which].first == 0 ? 0 : 1;
Chris@16 146 }
Chris@16 147
Chris@16 148 #ifdef BOOST_GEOMETRY_DEBUG_INTERSECTION
Chris@16 149 inline void debug() const
Chris@16 150 {
Chris@16 151 std::cout << sides[0].first << " "
Chris@16 152 << sides[0].second << " "
Chris@16 153 << sides[1].first << " "
Chris@16 154 << sides[1].second
Chris@16 155 << std::endl;
Chris@16 156 }
Chris@16 157 #endif
Chris@16 158
Chris@16 159 inline void reverse()
Chris@16 160 {
Chris@16 161 std::swap(sides[0], sides[1]);
Chris@16 162 }
Chris@16 163
Chris@16 164 //private :
Chris@16 165 std::pair<int, int> sides[2];
Chris@16 166
Chris@16 167 };
Chris@16 168
Chris@16 169 #if defined(_MSC_VER)
Chris@16 170 #pragma warning(pop)
Chris@16 171 #endif
Chris@16 172
Chris@16 173 }} // namespace boost::geometry
Chris@16 174
Chris@16 175
Chris@16 176 #endif // BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP