94 lines
2.3 KiB
C++
94 lines
2.3 KiB
C++
// Boost.Geometry (aka GGL, Generic Geometry Library)
|
|
|
|
// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands.
|
|
// Copyright (c) 2008-2011 Bruno Lalande, Paris, France.
|
|
// Copyright (c) 2009-2011 Mateusz Loskot, London, UK.
|
|
|
|
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
|
|
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
|
|
|
|
// Use, modification and distribution is subject to the Boost Software License,
|
|
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#ifndef BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
|
|
#define BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
|
|
|
|
|
|
#include <utility>
|
|
|
|
|
|
namespace boost { namespace geometry
|
|
{
|
|
|
|
|
|
/*!
|
|
\brief Class side_info: small class wrapping for sides (-1,0,1)
|
|
*/
|
|
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 int get() const
|
|
{
|
|
return Index == 0 ? sides[Which].first : sides[Which].second;
|
|
}
|
|
|
|
|
|
// Returns true if both lying on the same side WRT the other
|
|
// (so either 1,1 or -1-1)
|
|
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;
|
|
}
|
|
|
|
// If one of the segments is collinear, the other must be as well.
|
|
// So handle it as collinear.
|
|
// (In floating point margins it can occur that one of them is 1!)
|
|
inline bool as_collinear() const
|
|
{
|
|
return sides[0].first * sides[0].second == 0
|
|
|| sides[1].first * sides[1].second == 0;
|
|
}
|
|
|
|
inline void reverse()
|
|
{
|
|
std::swap(sides[0], sides[1]);
|
|
}
|
|
|
|
private :
|
|
std::pair<int, int> sides[2];
|
|
|
|
};
|
|
|
|
|
|
}} // namespace boost::geometry
|
|
|
|
|
|
#endif // BOOST_GEOMETRY_STRATEGIES_SIDE_INFO_HPP
|