Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP Chris@16: #define BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP Chris@16: Chris@16: #if defined(HAVE_MATRIX_AS_STRING) Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@101: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: /*! Chris@16: \brief Dimensionally Extended 9 Intersection Matrix Chris@16: \details Chris@16: \ingroup overlay Chris@16: \see http://gis.hsr.ch/wiki/images/3/3d/9dem_springer.pdf Chris@16: */ Chris@16: struct de9im Chris@16: { Chris@16: int ii, ib, ie, Chris@16: bi, bb, be, Chris@16: ei, eb, ee; Chris@16: Chris@16: inline de9im() Chris@16: : ii(-1), ib(-1), ie(-1) Chris@16: , bi(-1), bb(-1), be(-1) Chris@16: , ei(-1), eb(-1), ee(-1) Chris@16: { Chris@16: } Chris@16: Chris@16: inline de9im(int ii0, int ib0, int ie0, Chris@16: int bi0, int bb0, int be0, Chris@16: int ei0, int eb0, int ee0) Chris@16: : ii(ii0), ib(ib0), ie(ie0) Chris@16: , bi(bi0), bb(bb0), be(be0) Chris@16: , ei(ei0), eb(eb0), ee(ee0) Chris@16: {} Chris@16: Chris@16: inline bool equals() const Chris@16: { Chris@16: return ii >= 0 && ie < 0 && be < 0 && ei < 0 && eb < 0; Chris@16: } Chris@16: Chris@16: inline bool disjoint() const Chris@16: { Chris@16: return ii < 0 && ib < 0 && bi < 0 && bb < 0; Chris@16: } Chris@16: Chris@16: inline bool intersects() const Chris@16: { Chris@16: return ii >= 0 || bb >= 0 || bi >= 0 || ib >= 0; Chris@16: } Chris@16: Chris@16: inline bool touches() const Chris@16: { Chris@16: return ii < 0 && (bb >= 0 || bi >= 0 || ib >= 0); Chris@16: } Chris@16: Chris@16: inline bool crosses() const Chris@16: { Chris@16: return (ii >= 0 && ie >= 0) || (ii == 0); Chris@16: } Chris@16: Chris@16: inline bool overlaps() const Chris@16: { Chris@16: return ii >= 0 && ie >= 0 && ei >= 0; Chris@16: } Chris@16: Chris@16: inline bool within() const Chris@16: { Chris@16: return ii >= 0 && ie < 0 && be < 0; Chris@16: } Chris@16: Chris@16: inline bool contains() const Chris@16: { Chris@16: return ii >= 0 && ei < 0 && eb < 0; Chris@16: } Chris@16: Chris@16: Chris@16: static inline char as_char(int v) Chris@16: { Chris@101: return v >= 0 && v < 10 ? static_cast('0' + v) : '-'; Chris@16: } Chris@16: Chris@16: #if defined(HAVE_MATRIX_AS_STRING) Chris@16: inline std::string matrix_as_string(std::string const& tab, std::string const& nl) const Chris@16: { Chris@16: std::string ret; Chris@16: ret.reserve(9 + tab.length() * 3 + nl.length() * 3); Chris@16: ret += tab; ret += as_char(ii); ret += as_char(ib); ret += as_char(ie); ret += nl; Chris@16: ret += tab; ret += as_char(bi); ret += as_char(bb); ret += as_char(be); ret += nl; Chris@16: ret += tab; ret += as_char(ei); ret += as_char(eb); ret += as_char(ee); Chris@16: return ret; Chris@16: } Chris@16: Chris@16: inline std::string matrix_as_string() const Chris@16: { Chris@16: return matrix_as_string("", ""); Chris@16: } Chris@16: #endif Chris@16: Chris@16: }; Chris@16: Chris@16: struct de9im_segment : public de9im Chris@16: { Chris@16: bool collinear; // true if segments are aligned (for equal,overlap,touch) Chris@16: bool opposite; // true if direction is reversed (for equal,overlap,touch) Chris@16: bool parallel; // true if disjoint but parallel Chris@16: bool degenerate; // true for segment(s) of zero length Chris@16: Chris@16: double ra, rb; // temp Chris@16: Chris@16: inline de9im_segment() Chris@16: : de9im() Chris@16: , collinear(false) Chris@16: , opposite(false) Chris@16: , parallel(false) Chris@16: , degenerate(false) Chris@16: {} Chris@16: Chris@16: inline de9im_segment(double a, double b, Chris@16: int ii0, int ib0, int ie0, Chris@16: int bi0, int bb0, int be0, Chris@16: int ei0, int eb0, int ee0, Chris@16: bool c = false, bool o = false, bool p = false, bool d = false) Chris@16: : de9im(ii0, ib0, ie0, bi0, bb0, be0, ei0, eb0, ee0) Chris@16: , collinear(c) Chris@16: , opposite(o) Chris@16: , parallel(p) Chris@16: , degenerate(d) Chris@16: , ra(a), rb(b) Chris@16: {} Chris@16: Chris@16: Chris@16: #if defined(HAVE_MATRIX_AS_STRING) Chris@16: inline std::string as_string() const Chris@16: { Chris@16: std::string ret = matrix_as_string(); Chris@16: ret += collinear ? "c" : "-"; Chris@16: ret += opposite ? "o" : "-"; Chris@16: return ret; Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@101: template Chris@101: struct fraction_type Chris@101: { Chris@101: SegmentRatio robust_ra; // TODO this can be renamed now to "ra" Chris@101: SegmentRatio robust_rb; Chris@16: Chris@101: bool initialized; Chris@101: inline fraction_type() Chris@101: : initialized(false) Chris@101: {} Chris@16: Chris@101: template Chris@101: inline void assign(Info const& info) Chris@101: { Chris@101: initialized = true; Chris@101: robust_ra = info.robust_ra; Chris@101: robust_rb = info.robust_rb; Chris@101: } Chris@101: Chris@101: inline void assign(SegmentRatio const& a, SegmentRatio const& b) Chris@101: { Chris@101: initialized = true; Chris@101: robust_ra = a; Chris@101: robust_rb = b; Chris@101: } Chris@101: Chris@101: }; Chris@101: Chris@101: // Chris@101: /*! Chris@101: \brief return-type for segment-intersection Chris@101: \note Set in intersection_points.hpp, from segment_intersection_info Chris@101: */ Chris@101: template Chris@16: struct segment_intersection_points Chris@16: { Chris@101: std::size_t count; // The number of intersection points Chris@101: Chris@101: // TODO: combine intersections and fractions in one struct Chris@16: Point intersections[2]; Chris@101: fraction_type fractions[2]; Chris@16: typedef Point point_type; Chris@16: Chris@16: segment_intersection_points() Chris@16: : count(0) Chris@16: {} Chris@16: }; Chris@16: Chris@101: // All assigned in cart_intersect, passed to intersection_points Chris@101: template Chris@101: struct segment_intersection_info Chris@101: { Chris@101: typedef PromotedType promoted_type; Chris@101: Chris@101: CoordinateType dx_a, dy_a; Chris@101: CoordinateType dx_b, dy_b; // TODO b can be removed Chris@101: SegmentRatio robust_ra; Chris@101: SegmentRatio robust_rb; Chris@101: }; Chris@101: Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_STRATEGIES_INTERSECTION_RESULT_HPP