annotate DEPENDENCIES/generic/include/boost/geometry/strategies/side_info.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
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@101 19
Chris@101 20 #if defined(BOOST_GEOMETRY_DEBUG_INTERSECTION) || defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
Chris@101 21 # include <iostream>
Chris@16 22 #endif
Chris@16 23
Chris@16 24 namespace boost { namespace geometry
Chris@16 25 {
Chris@16 26
Chris@16 27 // Silence warning C4127: conditional expression is constant
Chris@16 28 #if defined(_MSC_VER)
Chris@101 29 #pragma warning(push)
Chris@101 30 #pragma warning(disable : 4127)
Chris@16 31 #endif
Chris@16 32
Chris@16 33 /*!
Chris@16 34 \brief Class side_info: small class wrapping for sides (-1,0,1)
Chris@16 35 */
Chris@16 36 class side_info
Chris@16 37 {
Chris@16 38 public :
Chris@16 39 inline side_info(int side_a1 = 0, int side_a2 = 0,
Chris@16 40 int side_b1 = 0, int side_b2 = 0)
Chris@16 41 {
Chris@16 42 sides[0].first = side_a1;
Chris@16 43 sides[0].second = side_a2;
Chris@16 44 sides[1].first = side_b1;
Chris@16 45 sides[1].second = side_b2;
Chris@16 46 }
Chris@16 47
Chris@16 48 template <int Which>
Chris@16 49 inline void set(int first, int second)
Chris@16 50 {
Chris@16 51 sides[Which].first = first;
Chris@16 52 sides[Which].second = second;
Chris@16 53 }
Chris@16 54
Chris@16 55 template <int Which, int Index>
Chris@16 56 inline void correct_to_zero()
Chris@16 57 {
Chris@16 58 if (Index == 0)
Chris@16 59 {
Chris@16 60 sides[Which].first = 0;
Chris@16 61 }
Chris@16 62 else
Chris@16 63 {
Chris@16 64 sides[Which].second = 0;
Chris@16 65 }
Chris@16 66 }
Chris@16 67
Chris@16 68 template <int Which, int Index>
Chris@16 69 inline int get() const
Chris@16 70 {
Chris@16 71 return Index == 0 ? sides[Which].first : sides[Which].second;
Chris@16 72 }
Chris@16 73
Chris@16 74
Chris@16 75 // Returns true if both lying on the same side WRT the other
Chris@16 76 // (so either 1,1 or -1-1)
Chris@16 77 template <int Which>
Chris@16 78 inline bool same() const
Chris@16 79 {
Chris@16 80 return sides[Which].first * sides[Which].second == 1;
Chris@16 81 }
Chris@16 82
Chris@16 83 inline bool collinear() const
Chris@16 84 {
Chris@16 85 return sides[0].first == 0
Chris@16 86 && sides[0].second == 0
Chris@16 87 && sides[1].first == 0
Chris@16 88 && sides[1].second == 0;
Chris@16 89 }
Chris@16 90
Chris@16 91 inline bool crossing() const
Chris@16 92 {
Chris@16 93 return sides[0].first * sides[0].second == -1
Chris@16 94 && sides[1].first * sides[1].second == -1;
Chris@16 95 }
Chris@16 96
Chris@16 97 inline bool touching() const
Chris@16 98 {
Chris@16 99 return (sides[0].first * sides[1].first == -1
Chris@16 100 && sides[0].second == 0 && sides[1].second == 0)
Chris@16 101 || (sides[1].first * sides[0].first == -1
Chris@16 102 && sides[1].second == 0 && sides[0].second == 0);
Chris@16 103 }
Chris@16 104
Chris@16 105 template <int Which>
Chris@16 106 inline bool one_touching() const
Chris@16 107 {
Chris@16 108 // This is normally a situation which can't occur:
Chris@16 109 // If one is completely left or right, the other cannot touch
Chris@16 110 return one_zero<Which>()
Chris@16 111 && sides[1 - Which].first * sides[1 - Which].second == 1;
Chris@16 112 }
Chris@16 113
Chris@16 114 inline bool meeting() const
Chris@16 115 {
Chris@16 116 // Two of them (in each segment) zero, two not
Chris@16 117 return one_zero<0>() && one_zero<1>();
Chris@16 118 }
Chris@16 119
Chris@16 120 template <int Which>
Chris@16 121 inline bool zero() const
Chris@16 122 {
Chris@16 123 return sides[Which].first == 0 && sides[Which].second == 0;
Chris@16 124 }
Chris@16 125
Chris@16 126 template <int Which>
Chris@16 127 inline bool one_zero() const
Chris@16 128 {
Chris@16 129 return (sides[Which].first == 0 && sides[Which].second != 0)
Chris@16 130 || (sides[Which].first != 0 && sides[Which].second == 0);
Chris@16 131 }
Chris@16 132
Chris@16 133 inline bool one_of_all_zero() const
Chris@16 134 {
Chris@16 135 int const sum = std::abs(sides[0].first)
Chris@16 136 + std::abs(sides[0].second)
Chris@16 137 + std::abs(sides[1].first)
Chris@16 138 + std::abs(sides[1].second);
Chris@16 139 return sum == 3;
Chris@16 140 }
Chris@16 141
Chris@16 142
Chris@16 143 template <int Which>
Chris@16 144 inline int zero_index() const
Chris@16 145 {
Chris@16 146 return sides[Which].first == 0 ? 0 : 1;
Chris@16 147 }
Chris@16 148
Chris@101 149 #if defined(BOOST_GEOMETRY_DEBUG_INTERSECTION) || defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
Chris@16 150 inline void debug() const
Chris@16 151 {
Chris@16 152 std::cout << sides[0].first << " "
Chris@16 153 << sides[0].second << " "
Chris@16 154 << sides[1].first << " "
Chris@101 155 << sides[1].second
Chris@16 156 << std::endl;
Chris@16 157 }
Chris@16 158 #endif
Chris@16 159
Chris@16 160 inline void reverse()
Chris@16 161 {
Chris@16 162 std::swap(sides[0], sides[1]);
Chris@16 163 }
Chris@16 164
Chris@16 165 //private :
Chris@16 166 std::pair<int, int> sides[2];
Chris@16 167
Chris@16 168 };
Chris@16 169
Chris@16 170 #if defined(_MSC_VER)
Chris@101 171 #pragma warning(pop)
Chris@16 172 #endif
Chris@16 173
Chris@16 174 }} // namespace boost::geometry
Chris@16 175
Chris@16 176
Chris@16 177 #endif // BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP