123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #ifndef BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
- #define BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
- #include <cmath>
- #include <utility>
- #if defined(BOOST_GEOMETRY_DEBUG_INTERSECTION) || defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
- # include <iostream>
- #endif
- namespace boost { namespace geometry
- {
- #if defined(_MSC_VER)
- #pragma warning(push)
- #pragma warning(disable : 4127)
- #endif
- class side_info
- {
- public :
- inline side_info(int side_a1 = 0, int side_a2 = 0,
- int side_b1 = 0, int side_b2 = 0)
- {
- sides[0].first = side_a1;
- sides[0].second = side_a2;
- sides[1].first = side_b1;
- sides[1].second = side_b2;
- }
- template <int Which>
- inline void set(int first, int second)
- {
- sides[Which].first = first;
- sides[Which].second = second;
- }
- template <int Which, int Index>
- inline void correct_to_zero()
- {
- if (Index == 0)
- {
- sides[Which].first = 0;
- }
- else
- {
- sides[Which].second = 0;
- }
- }
- template <int Which, int Index>
- inline int get() const
- {
- return Index == 0 ? sides[Which].first : sides[Which].second;
- }
-
-
- template <int Which>
- inline bool same() const
- {
- return sides[Which].first * sides[Which].second == 1;
- }
- inline bool collinear() const
- {
- return sides[0].first == 0
- && sides[0].second == 0
- && sides[1].first == 0
- && sides[1].second == 0;
- }
- inline bool crossing() const
- {
- return sides[0].first * sides[0].second == -1
- && sides[1].first * sides[1].second == -1;
- }
- inline bool touching() const
- {
- return (sides[0].first * sides[1].first == -1
- && sides[0].second == 0 && sides[1].second == 0)
- || (sides[1].first * sides[0].first == -1
- && sides[1].second == 0 && sides[0].second == 0);
- }
- template <int Which>
- inline bool one_touching() const
- {
-
-
- return one_zero<Which>()
- && sides[1 - Which].first * sides[1 - Which].second == 1;
- }
- inline bool meeting() const
- {
-
- return one_zero<0>() && one_zero<1>();
- }
- template <int Which>
- inline bool zero() const
- {
- return sides[Which].first == 0 && sides[Which].second == 0;
- }
- template <int Which>
- inline bool one_zero() const
- {
- return (sides[Which].first == 0 && sides[Which].second != 0)
- || (sides[Which].first != 0 && sides[Which].second == 0);
- }
- inline bool one_of_all_zero() const
- {
- int const sum = std::abs(sides[0].first)
- + std::abs(sides[0].second)
- + std::abs(sides[1].first)
- + std::abs(sides[1].second);
- return sum == 3;
- }
- template <int Which>
- inline int zero_index() const
- {
- return sides[Which].first == 0 ? 0 : 1;
- }
- #if defined(BOOST_GEOMETRY_DEBUG_INTERSECTION) || defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
- inline void debug() const
- {
- std::cout << sides[0].first << " "
- << sides[0].second << " "
- << sides[1].first << " "
- << sides[1].second
- << std::endl;
- }
- #endif
- inline void reverse()
- {
- std::swap(sides[0], sides[1]);
- }
- std::pair<int, int> sides[2];
- };
- #if defined(_MSC_VER)
- #pragma warning(pop)
- #endif
- }}
- #endif
|