diff options
Diffstat (limited to 'libs/geometry/test/algorithms/relational_operations/within')
8 files changed, 996 insertions, 0 deletions
diff --git a/libs/geometry/test/algorithms/relational_operations/within/Jamfile.v2 b/libs/geometry/test/algorithms/relational_operations/within/Jamfile.v2 new file mode 100644 index 000000000..dc33b40cc --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/Jamfile.v2 @@ -0,0 +1,25 @@ +# Boost.Geometry (aka GGL, Generic Geometry Library) +# +# Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. +# Copyright (c) 2008-2014 Bruno Lalande, Paris, France. +# Copyright (c) 2009-2014 Mateusz Loskot, London, UK. +# +# This file was modified by Oracle on 2014. +# Modifications copyright (c) 2014, Oracle and/or its affiliates. +# +# Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle +# Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle +# +# 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) + +test-suite boost-geometry-algorithms-within + : + [ run multi_within.cpp ] + [ run within.cpp ] + [ run within_areal_areal.cpp ] + [ run within_linear_areal.cpp ] + [ run within_linear_linear.cpp ] + [ run within_pointlike_xxx.cpp ] + ; diff --git a/libs/geometry/test/algorithms/relational_operations/within/multi_within.cpp b/libs/geometry/test/algorithms/relational_operations/within/multi_within.cpp new file mode 100644 index 000000000..cf5573aa6 --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/multi_within.cpp @@ -0,0 +1,59 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Copyright (c) 2007-2012 Barend Gehrels, 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) + +#include <geometry_test_common.hpp> + +#include <boost/geometry/io/wkt/wkt.hpp> +#include <boost/geometry/multi/io/wkt/wkt.hpp> + +#include <boost/geometry/algorithms/correct.hpp> +#include <boost/geometry/algorithms/within.hpp> + +#include <boost/geometry/geometries/box.hpp> +#include <boost/geometry/geometries/polygon.hpp> + +#include <boost/geometry/multi/core/point_order.hpp> +#include <boost/geometry/multi/algorithms/within.hpp> + +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/geometries/multi_polygon.hpp> + +#include "test_within.hpp" + + +template <typename P> +void test_all() +{ + typedef bg::model::multi_polygon<bg::model::polygon<P> > mp; + + // test multi-with-one-polygon (trivial case) + test_geometry<P, mp>("POINT(1 1)", "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)))", true); + test_geometry<P, mp>("POINT(3 3)", "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)))", false); + test_geometry<P, mp>("POINT(0 1)", "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)))", false); + test_geometry<P, mp>("POINT(4 4)", "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)))", false); + + // test if it is in one of them + std::string multi("MULTIPOLYGON(" + "((0 0,0 2,2 2,2 0,0 0))" + "((3 3,3 6,6 6,6 3,3 3))" + ")"); + test_geometry<P, mp>("POINT(4 4)", multi, true); + test_geometry<P, mp>("POINT(1 1)", multi, true); + test_geometry<P, mp>("POINT(0 1)", multi, false); +} + +int test_main( int , char* [] ) +{ + //test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); +#endif + + return 0; +} diff --git a/libs/geometry/test/algorithms/relational_operations/within/test_within.hpp b/libs/geometry/test/algorithms/relational_operations/within/test_within.hpp new file mode 100644 index 000000000..c82bdaf7e --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/test_within.hpp @@ -0,0 +1,150 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// 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) + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +#ifndef BOOST_GEOMETRY_TEST_WITHIN_HPP +#define BOOST_GEOMETRY_TEST_WITHIN_HPP + + +#include <boost/variant/variant.hpp> + +#include <geometry_test_common.hpp> + +#include <boost/geometry/core/ring_type.hpp> + +#include <boost/geometry/strategies/strategies.hpp> +#include <boost/geometry/geometries/ring.hpp> +#include <boost/geometry/geometries/polygon.hpp> + +#include <boost/geometry/io/wkt/read.hpp> + +#include <boost/geometry/strategies/cartesian/point_in_box.hpp> +#include <boost/geometry/strategies/cartesian/box_in_box.hpp> +#include <boost/geometry/strategies/agnostic/point_in_point.hpp> +#include <boost/geometry/strategies/agnostic/point_in_box_by_side.hpp> +#include <boost/geometry/strategies/agnostic/point_in_poly_winding.hpp> +#include <boost/geometry/strategies/agnostic/relate.hpp> + +#include <boost/geometry/algorithms/within.hpp> + +#include <boost/geometry/multi/algorithms/covered_by.hpp> +#include <boost/geometry/multi/geometries/multi_linestring.hpp> +#include <boost/geometry/multi/io/wkt/read.hpp> + +template <typename Geometry1, typename Geometry2> +void check_geometry(Geometry1 const& geometry1, + Geometry2 const& geometry2, + std::string const& wkt1, + std::string const& wkt2, + bool expected) +{ + bool detected = bg::within(geometry1, geometry2); + + BOOST_CHECK_MESSAGE(detected == expected, + "within: " << wkt1 + << " in " << wkt2 + << " -> Expected: " << expected + << " detected: " << detected); +} + +template <typename Geometry1, typename Geometry2> +void test_geometry(std::string const& wkt1, + std::string const& wkt2, bool expected) +{ + Geometry1 geometry1; + Geometry2 geometry2; + bg::read_wkt(wkt1, geometry1); + bg::read_wkt(wkt2, geometry2); + boost::variant<Geometry1> v1(geometry1); + boost::variant<Geometry2> v2(geometry2); + + check_geometry(geometry1, geometry2, wkt1, wkt2, expected); + check_geometry(v1, geometry2, wkt1, wkt2, expected); + check_geometry(geometry1, v2, wkt1, wkt2, expected); + check_geometry(v1, v2, wkt1, wkt2, expected); +} + +template <typename Point, bool Clockwise, bool Closed> +void test_ordered_ring(std::string const& wkt_point, + std::string const& wkt_geometry, bool expected, bool on_border) +{ + typedef bg::model::ring<Point, Clockwise, Closed> ring_type; + ring_type ring; + Point point; + + bg::read_wkt(wkt_geometry, ring); + if ( BOOST_GEOMETRY_CONDITION(! Clockwise) ) + { + std::reverse(boost::begin(ring), boost::end(ring)); + } + + bg::read_wkt(wkt_point, point); + + bool detected = bg::within(point, ring); + + BOOST_CHECK_MESSAGE(detected == expected, + "within: " << wkt_point + << " in " << wkt_geometry + << " -> Expected: " << expected + << " detected: " << detected + << " clockwise: " << int(Clockwise) + << " closed: " << int(Closed) + ); + + // other strategy (note that this one cannot detect OnBorder + // (without modifications) + + bg::strategy::within::franklin<Point> franklin; + detected = bg::within(point, ring, franklin); + if (! on_border) + { + BOOST_CHECK_MESSAGE(detected == expected, + "within: " << wkt_point + << " in " << wkt_geometry + << " -> Expected: " << expected + << " detected: " << detected + << " clockwise: " << int(Clockwise) + << " closed: " << int(Closed) + ); + } + + + bg::strategy::within::crossings_multiply<Point> cm; + detected = bg::within(point, ring, cm); + if (! on_border) + { + BOOST_CHECK_MESSAGE(detected == expected, + "within: " << wkt_point + << " in " << wkt_geometry + << " -> Expected: " << expected + << " detected: " << detected + << " clockwise: " << int(Clockwise) + << " closed: " << int(Closed) + ); + } +} + +template <typename Point> +void test_ring(std::string const& wkt_point, + std::string const& wkt_geometry, + bool expected, bool on_border) +{ + test_ordered_ring<Point, true, true>(wkt_point, wkt_geometry, expected, on_border); + test_ordered_ring<Point, false, true>(wkt_point, wkt_geometry, expected, on_border); + test_ordered_ring<Point, true, false>(wkt_point, wkt_geometry, expected, on_border); + test_ordered_ring<Point, false, false>(wkt_point, wkt_geometry, expected, on_border); + test_geometry<Point, bg::model::polygon<Point> >(wkt_point, wkt_geometry, expected); +} + +#endif diff --git a/libs/geometry/test/algorithms/relational_operations/within/within.cpp b/libs/geometry/test/algorithms/relational_operations/within/within.cpp new file mode 100644 index 000000000..2300a4ec5 --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/within.cpp @@ -0,0 +1,193 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// 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) + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +#include "test_within.hpp" + + +#include <boost/geometry/geometries/geometries.hpp> +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/multi.hpp> +#include <boost/geometry/multi/geometries/multi_point.hpp> +#include <boost/geometry/multi/geometries/multi_linestring.hpp> +#include <boost/geometry/multi/geometries/multi_polygon.hpp> + +template <typename P> +void test_all() +{ + typedef bg::model::box<P> box_type; + + test_geometry<P, box_type>("POINT(1 1)", "BOX(0 0,2 2)", true); + test_geometry<P, box_type>("POINT(0 0)", "BOX(0 0,2 2)", false); + test_geometry<P, box_type>("POINT(2 2)", "BOX(0 0,2 2)", false); + test_geometry<P, box_type>("POINT(0 1)", "BOX(0 0,2 2)", false); + test_geometry<P, box_type>("POINT(1 0)", "BOX(0 0,2 2)", false); + + test_geometry<box_type, box_type>("BOX(1 1,2 2)", "BOX(0 0,3 3)", true); + test_geometry<box_type, box_type>("BOX(0 0,3 3)", "BOX(1 1,2 2)", false); + + test_geometry<box_type, box_type>("BOX(1 1,3 3)", "BOX(0 0,3 3)", true); + test_geometry<box_type, box_type>("BOX(3 1,3 3)", "BOX(0 0,3 3)", false); + + /* + test_within_code<P, box_type>("POINT(1 1)", "BOX(0 0,2 2)", 1); + test_within_code<P, box_type>("POINT(1 0)", "BOX(0 0,2 2)", 0); + test_within_code<P, box_type>("POINT(0 1)", "BOX(0 0,2 2)", 0); + test_within_code<P, box_type>("POINT(0 3)", "BOX(0 0,2 2)", -1); + test_within_code<P, box_type>("POINT(3 3)", "BOX(0 0,2 2)", -1); + + test_within_code<box_type, box_type>("BOX(1 1,2 2)", "BOX(0 0,3 3)", 1); + test_within_code<box_type, box_type>("BOX(0 1,2 2)", "BOX(0 0,3 3)", 0); + test_within_code<box_type, box_type>("BOX(1 0,2 2)", "BOX(0 0,3 3)", 0); + test_within_code<box_type, box_type>("BOX(1 1,2 3)", "BOX(0 0,3 3)", 0); + test_within_code<box_type, box_type>("BOX(1 1,3 2)", "BOX(0 0,3 3)", 0); + test_within_code<box_type, box_type>("BOX(1 1,3 4)", "BOX(0 0,3 3)", -1); + */ +} + +template <typename Point> +void test_spherical() +{ + // Test spherical boxes + // See also http://www.gcmap.com/mapui?P=1E45N-19E45N-19E55N-1E55N-1E45N,10E55.1N,10E45.1N + bg::model::box<Point> box; + bg::read_wkt("POLYGON((1 45,19 55))", box); + BOOST_CHECK_EQUAL(bg::within(Point(10, 55.1), box), true); + BOOST_CHECK_EQUAL(bg::within(Point(10, 55.2), box), true); + BOOST_CHECK_EQUAL(bg::within(Point(10, 55.3), box), true); + BOOST_CHECK_EQUAL(bg::within(Point(10, 55.4), box), false); + + BOOST_CHECK_EQUAL(bg::within(Point(10, 45.1), box), false); + BOOST_CHECK_EQUAL(bg::within(Point(10, 45.2), box), false); + BOOST_CHECK_EQUAL(bg::within(Point(10, 45.3), box), false); + BOOST_CHECK_EQUAL(bg::within(Point(10, 45.4), box), true); + + // Crossing the dateline (Near Tuvalu) + // http://www.gcmap.com/mapui?P=178E10S-178W10S-178W6S-178E6S-178E10S,180W5.999S,180E9.999S + // http://en.wikipedia.org/wiki/Tuvalu + + bg::model::box<Point> tuvalu(Point(178, -10), Point(-178, -6)); + BOOST_CHECK_EQUAL(bg::within(Point(180, -8), tuvalu), true); + BOOST_CHECK_EQUAL(bg::within(Point(-180, -8), tuvalu), true); + BOOST_CHECK_EQUAL(bg::within(Point(180, -5.999), tuvalu), false); + BOOST_CHECK_EQUAL(bg::within(Point(180, -10.001), tuvalu), true); +} + +void test_3d() +{ + typedef boost::geometry::model::point<double, 3, boost::geometry::cs::cartesian> point_type; + typedef boost::geometry::model::box<point_type> box_type; + box_type box(point_type(0, 0, 0), point_type(4, 4, 4)); + BOOST_CHECK_EQUAL(bg::within(point_type(2, 2, 2), box), true); + BOOST_CHECK_EQUAL(bg::within(point_type(2, 4, 2), box), false); + BOOST_CHECK_EQUAL(bg::within(point_type(2, 2, 4), box), false); + BOOST_CHECK_EQUAL(bg::within(point_type(2, 2, 5), box), false); + + box_type box2(point_type(2, 2, 2), point_type(3, 3, 3)); + BOOST_CHECK_EQUAL(bg::within(box2, box), true); + +} + +template <typename P1, typename P2> +void test_mixed_of() +{ + typedef boost::geometry::model::polygon<P1> polygon_type1; + typedef boost::geometry::model::polygon<P2> polygon_type2; + typedef boost::geometry::model::box<P1> box_type1; + typedef boost::geometry::model::box<P2> box_type2; + + polygon_type1 poly1; + polygon_type2 poly2; + boost::geometry::read_wkt("POLYGON((0 0,0 5,5 5,5 0,0 0))", poly1); + boost::geometry::read_wkt("POLYGON((0 0,0 5,5 5,5 0,0 0))", poly2); + + box_type1 box1(P1(1, 1), P1(4, 4)); + box_type2 box2(P2(0, 0), P2(5, 5)); + P1 p1(3, 3); + P2 p2(3, 3); + + BOOST_CHECK_EQUAL(bg::within(p1, poly2), true); + BOOST_CHECK_EQUAL(bg::within(p2, poly1), true); + BOOST_CHECK_EQUAL(bg::within(p2, box1), true); + BOOST_CHECK_EQUAL(bg::within(p1, box2), true); + BOOST_CHECK_EQUAL(bg::within(box1, box2), true); + BOOST_CHECK_EQUAL(bg::within(box2, box1), false); +} + + +void test_mixed() +{ + // Mixing point types and coordinate types + test_mixed_of + < + boost::geometry::model::d2::point_xy<double>, + boost::geometry::model::point<double, 2, boost::geometry::cs::cartesian> + >(); + test_mixed_of + < + boost::geometry::model::d2::point_xy<float>, + boost::geometry::model::point<double, 2, boost::geometry::cs::cartesian> + >(); + test_mixed_of + < + boost::geometry::model::d2::point_xy<int>, + boost::geometry::model::d2::point_xy<double> + >(); +} + +void test_strategy() +{ + // Test by explicitly specifying a strategy + typedef bg::model::d2::point_xy<double> point_type; + typedef bg::model::box<point_type> box_type; + point_type p(3, 3); + box_type b(point_type(0, 0), point_type(5, 5)); + box_type b0(point_type(0, 0), point_type(5, 0)); + + bool r = bg::within(p, b, + bg::strategy::within::point_in_box<point_type, box_type>()); + BOOST_CHECK_EQUAL(r, true); + + r = bg::within(b, b, + bg::strategy::within::box_in_box<box_type, box_type>()); + BOOST_CHECK_EQUAL(r, true); + + r = bg::within(b0, b0, + bg::strategy::within::box_in_box<box_type, box_type>()); + BOOST_CHECK_EQUAL(r, false); + + r = bg::within(p, b, + bg::strategy::within::point_in_box_by_side<point_type, box_type>()); + BOOST_CHECK_EQUAL(r, true); +} + + +int test_main( int , char* [] ) +{ + test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + + test_spherical<bg::model::point<double, 2, bg::cs::spherical_equatorial<bg::degree> > >(); + + test_mixed(); + test_3d(); + test_strategy(); + + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); + test_spherical<bg::model::point<ttmath_big, 2, bg::cs::spherical_equatorial<bg::degree> > >(); +#endif + + return 0; +} diff --git a/libs/geometry/test/algorithms/relational_operations/within/within_areal_areal.cpp b/libs/geometry/test/algorithms/relational_operations/within/within_areal_areal.cpp new file mode 100644 index 000000000..a2901ba4b --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/within_areal_areal.cpp @@ -0,0 +1,96 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014, 2015. +// Modifications copyright (c) 2014-2015 Oracle and/or its affiliates. + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// 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) + + +#include "test_within.hpp" + + +#include <boost/geometry/geometries/geometries.hpp> +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/multi.hpp> +#include <boost/geometry/multi/geometries/multi_polygon.hpp> + +template <typename P> +void test_a_a() +{ + typedef bg::model::polygon<P> poly; + typedef bg::model::ring<P> ring; + typedef bg::model::multi_polygon<poly> mpoly; + + test_geometry<ring, ring>("POLYGON((0 0,0 2,2 2,2 0,0 0))", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + test_geometry<ring, poly>("POLYGON((0 0,0 5,5 5,5 0,0 0))", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + test_geometry<poly, ring>("POLYGON((0 0,0 6,6 6,6 0,0 0))", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + + test_geometry<poly, poly>("POLYGON((0 0,0 9,9 9,9 0,0 0),(3 3,6 3,6 6,3 6,3 3))", + "POLYGON((0 0,0 9,9 9,9 0,0 0),(3 3,6 3,6 6,3 6,3 3))", true); + test_geometry<poly, poly>("POLYGON((0 0,0 9,9 9,9 0,0 0),(3 3,6 3,6 6,3 6,3 3))", + "POLYGON((0 0,0 9,9 9,9 0,0 0),(4 4,5 4,5 5,4 5,4 4))", true); + test_geometry<poly, poly>("POLYGON((1 1,1 8,8 8,8 1,1 1),(3 3,6 3,6 6,3 6,3 3))", + "POLYGON((0 0,0 9,9 9,9 0,0 0),(3 3,6 3,6 6,3 6,3 3))", true); + test_geometry<poly, poly>("POLYGON((1 1,1 8,8 8,8 1,1 1),(3 3,6 3,6 6,3 6,3 3))", + "POLYGON((0 0,0 9,9 9,9 0,0 0),(4 4,5 4,5 5,4 5,4 4))", true); + + test_geometry<ring, mpoly>("POLYGON((0 0,0 2,2 2,2 0,0 0))", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", true); + test_geometry<poly, mpoly>("POLYGON((0 0,0 2,2 2,2 0,0 0))", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", true); + + test_geometry<mpoly, ring>("MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", + "POLYGON((0 0,0 10,10 10,10 0,0 0))", true); + test_geometry<mpoly, poly>("MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((15 15,15 110,110 110,110 15,15 15)))", + "POLYGON((0 0,0 10,10 10,10 0,0 0))", false); + + test_geometry<mpoly, poly>("MULTIPOLYGON(((0 0,0 1,1 0,0 0)),((3 3,3 4,4 3,3 3)))", + "POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,4 3,4 4,3 4,3 3))", false); + + test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 1,1 0,0 0)),((3 3,3 4,4 3,3 3)))", + "MULTIPOLYGON(((0 0,0 1,1 0,0 0)),((3 3,3 4,4 3,3 3)))", true); + test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 1,1 0,0 0)),((3 3,3 4,4 3,3 3)))", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", true); + test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", + "MULTIPOLYGON(((0 0,0 1,1 0,0 0)),((3 3,3 4,4 3,3 3)))", false); + + // https://svn.boost.org/trac/boost/ticket/10912 + test_geometry<poly, poly>("POLYGON((0 0,0 5,5 5,5 0,0 0))", + "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2),(6 6,8 6,8 8,6 8,6 6))", + false); + test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))", + "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,2 4,4 4,4 2,2 2))", + false); + + test_geometry<poly, mpoly>("POLYGON((0 0,0 5,5 5,5 0,0 0))", + "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))", + true); + test_geometry<poly, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))", + "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))", + true); +} + +template <typename P> +void test_all() +{ + test_a_a<P>(); +} + +int test_main( int , char* [] ) +{ + test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); +#endif + + return 0; +} diff --git a/libs/geometry/test/algorithms/relational_operations/within/within_linear_areal.cpp b/libs/geometry/test/algorithms/relational_operations/within/within_linear_areal.cpp new file mode 100644 index 000000000..889ff3692 --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/within_linear_areal.cpp @@ -0,0 +1,121 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// 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) + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +#include "test_within.hpp" + + +#include <boost/geometry/geometries/geometries.hpp> +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/multi.hpp> +#include <boost/geometry/multi/geometries/multi_linestring.hpp> +#include <boost/geometry/multi/geometries/multi_polygon.hpp> + +template <typename P> +void test_l_a() +{ + typedef bg::model::linestring<P> ls; + typedef bg::model::multi_linestring<ls> mls; + typedef bg::model::polygon<P> poly; + typedef bg::model::ring<P> ring; + typedef bg::model::multi_polygon<poly> mpoly; + + // B,I + test_geometry<ls, ring>("LINESTRING(0 0, 2 2)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + + // B,I + test_geometry<ls, poly>("LINESTRING(0 0, 2 2)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + // I + test_geometry<ls, poly>("LINESTRING(1 1, 2 2)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + // I,E + test_geometry<ls, poly>("LINESTRING(1 1, 6 6)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + // B + test_geometry<ls, poly>("LINESTRING(0 0, 5 0)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + test_geometry<ls, poly>("LINESTRING(0 0, 0 5)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + // E + test_geometry<ls, poly>("LINESTRING(6 0, 6 5)", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + + // BIBIB + test_geometry<ls, mpoly>("LINESTRING(0 0, 10 10)", "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", true); + // BIBEBIB + test_geometry<ls, mpoly>("LINESTRING(0 0, 10 10)", "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((6 6,5 10,10 10,10 5,6 6)))", false); + + // MySQL report 18.12.2014 (https://svn.boost.org/trac/boost/ticket/10887) + test_geometry<ls, mpoly>("LINESTRING(5 -2,5 2)", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + true); + test_geometry<ls, mpoly>("LINESTRING(5 -2,5 5)", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + true); + test_geometry<ls, mpoly>("LINESTRING(5 -2,5 0)", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + true); + // MySQL report 18.12.2014 - extended + test_geometry<ls, mpoly>("LINESTRING(5 -2,5 0)", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)),((5 0,7 1,7 -1,5 0)))", + true); + test_geometry<ls, mpoly>("LINESTRING(0 0,5 0)", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)),((5 0,7 1,7 -1,5 0)))", + false); + test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,4 -2,5 0),(5 -2,6 -2,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + true); + test_geometry<mls, mpoly>("MULTILINESTRING((0 0,0 1,5 0),(0 0,0 -1,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + false); + test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,4 -2,5 0),(6 -2,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + true); + test_geometry<mls, mpoly>("MULTILINESTRING((0 0,0 1,5 0),(0 -1,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + false); + test_geometry<mls, mpoly>("MULTILINESTRING((0 0,5 0),(5 -2,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + false); + test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,5 0),(0 0,5 0))", + "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))", + false); + + // BI + test_geometry<mls, poly>("MULTILINESTRING((0 0,2 2),(2 2,3 3))", "POLYGON((0 0,0 5,5 5,5 0,0 0))", true); + // I E + test_geometry<mls, poly>("MULTILINESTRING((1 1,2 2),(6 6,7 7))", "POLYGON((0 0,0 5,5 5,5 0,0 0))", false); + + // I I + test_geometry<mls, mpoly>("MULTILINESTRING((1 1,5 5),(6 6,7 7))", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", + true); + // I E + test_geometry<mls, mpoly>("MULTILINESTRING((1 1,5 5),(11 11,12 12))", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))", + false); +} + +template <typename P> +void test_all() +{ + test_l_a<P>(); +} + +int test_main( int , char* [] ) +{ + test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); +#endif + + return 0; +} diff --git a/libs/geometry/test/algorithms/relational_operations/within/within_linear_linear.cpp b/libs/geometry/test/algorithms/relational_operations/within/within_linear_linear.cpp new file mode 100644 index 000000000..6467e0110 --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/within_linear_linear.cpp @@ -0,0 +1,99 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// 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) + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +#include "test_within.hpp" + + +#include <boost/geometry/geometries/geometries.hpp> +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/multi.hpp> +#include <boost/geometry/multi/geometries/multi_linestring.hpp> + +template <typename P> +void test_l_l() +{ + typedef bg::model::linestring<P> ls; + typedef bg::model::multi_linestring<ls> mls; + + test_geometry<ls, ls>("LINESTRING(0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", true); + + test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", true); + test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", true); + test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 3 2)", "LINESTRING(3 2, 2 2, 0 0)", true); + test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1, 0 0)", "LINESTRING(3 2, 2 2, 0 0)", true); + + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", true); + test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1)", "LINESTRING(0 0, 2 2, 4 2)", true); + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2)", "LINESTRING(4 2, 2 2, 0 0)", true); + test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1)", "LINESTRING(4 2, 2 2, 0 0)", true); + + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false); + + test_geometry<ls, ls>("LINESTRING(0 1, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(0 1, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(1 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false); + test_geometry<ls, ls>("LINESTRING(1 0, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false); + + // duplicated points + test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", true); + test_geometry<ls, ls>("LINESTRING(1 1, 1 1, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", true); + + test_geometry<ls, ls>("LINESTRING(0 0, 0 0, 0 0, 1 1, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 2 2, 3 3)", + "LINESTRING(0 0, 2 2, 4 4)", true); + + // invalid linestrings +// test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", false); +// test_geometry<ls, ls>("LINESTRING(1 1)", "LINESTRING(0 0, 2 2)", true); +// test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0, 2 2)", false); +// test_geometry<ls, ls>("LINESTRING(0 0, 1 1)", "LINESTRING(0 0)", false); + + // spikes + // FOR NOW DISABLED + + /*test_geometry<ls, ls>("LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true); + + test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,3 3,6 3)", true); + test_geometry<ls, ls>("LINESTRING(0 0,3 3,6 3)", "LINESTRING(0 0,2 2,3 3,1 1)", false); + test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,4 4,6 3)", true); + test_geometry<ls, ls>("LINESTRING(0 0,4 4,6 3)", "LINESTRING(0 0,2 2,3 3,1 1)", false); + + test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1,5 3)", "LINESTRING(0 0,3 3,6 3)", false);*/ + + test_geometry<ls, mls>("LINESTRING(1 1, 2 2)", "MULTILINESTRING((0 0, 2 2),(3 3, 4 4))", true); + + test_geometry<mls, ls>("MULTILINESTRING((0 0, 2 2),(3 3, 4 4))", "LINESTRING(0 0, 5 5)", true); + + test_geometry<mls, mls>("MULTILINESTRING((1 1, 2 2),(3 3, 4 4))", "MULTILINESTRING((1 1, 2 2),(2 2, 5 5))", true); +} + +template <typename P> +void test_all() +{ + test_l_l<P>(); +} + +int test_main( int , char* [] ) +{ + test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); +#endif + + return 0; +} diff --git a/libs/geometry/test/algorithms/relational_operations/within/within_pointlike_xxx.cpp b/libs/geometry/test/algorithms/relational_operations/within/within_pointlike_xxx.cpp new file mode 100644 index 000000000..5ea4f09f2 --- /dev/null +++ b/libs/geometry/test/algorithms/relational_operations/within/within_pointlike_xxx.cpp @@ -0,0 +1,253 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// 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) + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +#include "test_within.hpp" + + +#include <boost/geometry/geometries/geometries.hpp> +#include <boost/geometry/geometries/point_xy.hpp> +#include <boost/geometry/multi/multi.hpp> +#include <boost/geometry/multi/geometries/multi_point.hpp> +#include <boost/geometry/multi/geometries/multi_linestring.hpp> +#include <boost/geometry/multi/geometries/multi_polygon.hpp> + +template <typename P> +void test_p_p() +{ + typedef bg::model::multi_point<P> mpt; + + test_geometry<P, P>("POINT(0 0)", "POINT(0 0)", true); + test_geometry<P, P>("POINT(0 0)", "POINT(1 1)", false); + + test_geometry<P, mpt>("POINT(0 0)", "MULTIPOINT(0 0, 1 1)", true); + test_geometry<P, mpt>("POINT(0 0)", "MULTIPOINT(1 1, 2 2)", false); +} + +template <typename P> +void test_p_l() +{ + typedef bg::model::segment<P> seg; + typedef bg::model::linestring<P> ls; + typedef bg::model::multi_linestring<ls> mls; + + test_geometry<P, seg>("POINT(1 1)", "LINESTRING(0 0, 2 2)", true); + test_geometry<P, seg>("POINT(0 0)", "LINESTRING(0 0, 1 1)", false); + test_geometry<P, seg>("POINT(1 0)", "LINESTRING(0 0, 1 1)", false); + + test_geometry<P, ls>("POINT(0 0)", "LINESTRING(0 0,1 1,2 2)", false); + test_geometry<P, ls>("POINT(3 3)", "LINESTRING(0 0,1 1,2 2)", false); + test_geometry<P, ls>("POINT(1 1)", "LINESTRING(0 0,2 2,3 3)", true); + + test_geometry<P, ls>("POINT(1 1)", "LINESTRING(0 0, 2 2)", true); + test_geometry<P, ls>("POINT(0 0)", "LINESTRING(0 0, 1 1)", false); + + test_geometry<P, mls>("POINT(0 0)", "MULTILINESTRING((0 0,1 1,2 2),(0 0,0 1))", true); + test_geometry<P, mls>("POINT(0 0)", "MULTILINESTRING((0 0,1 1,2 2),(0 0,0 1),(0 0,1 0))", false); + + test_geometry<P, mls>("POINT(1 1)", "MULTILINESTRING((0 0, 1 1),(1 1, 2 2))", true); + test_geometry<P, mls>("POINT(1 1)", "MULTILINESTRING((0 0, 1 1),(2 2, 3 3))", false); +} + +template <typename P> +void test_p_a() +{ + typedef bg::model::polygon<P> poly; + typedef bg::model::multi_polygon<poly> mpoly; + + // trivial case + test_ring<P>("POINT(1 1)", "POLYGON((0 0,0 2,2 2,2 0,0 0))", true, false); + + // on border/corner + test_ring<P>("POINT(0 0)", "POLYGON((0 0,0 2,2 2,2 0,0 0))", false, true); + test_ring<P>("POINT(0 1)", "POLYGON((0 0,0 2,2 2,2 0,0 0))", false, true); + + // aligned to segment/vertex + test_ring<P>("POINT(1 1)", "POLYGON((0 0,0 3,3 3,3 1,2 1,2 0,0 0))", true, false); + test_ring<P>("POINT(1 1)", "POLYGON((0 0,0 3,4 3,3 1,2 2,2 0,0 0))", true, false); + + // same polygon, but point on border + test_ring<P>("POINT(3 3)", "POLYGON((0 0,0 3,3 3,3 1,2 1,2 0,0 0))", false, true); + test_ring<P>("POINT(3 3)", "POLYGON((0 0,0 3,4 3,3 1,2 2,2 0,0 0))", false, true); + + // holes + test_geometry<P, poly>("POINT(2 2)", + "POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1))", false); + + // Real-life problem (solved now), point is in the middle, 409623 is also a coordinate + // on the border, has been wrong in the past (2009) + test_ring<P>("POINT(146383 409623)", + "POLYGON((146351 410597,146521 410659,147906 410363,148088 410420" + ",148175 410296,148281 409750,148215 409623,148154 409666,148154 409666" + ",148130 409625,148035 409626,148035 409626,148008 409544,147963 409510" + ",147993 409457,147961 409352,147261 408687,147008 408586,145714 408840" + ",145001 409033,144486 409066,144616 409308,145023 410286,145254 410488" + ",145618 410612,145618 410612,146015 410565,146190 410545,146351 410597))", + true, false); + + test_geometry<P, mpoly>("POINT(2 2)", + "MULTIPOLYGON(((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1)),((5 5,5 9,9 9,9 5,5 5)))", false); + test_geometry<P, mpoly>("POINT(1 1)", + "MULTIPOLYGON(((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1)),((5 5,5 9,9 9,9 5,5 5)))", false); + test_geometry<P, mpoly>("POINT(1 1)", + "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0),(2 2,4 2,4 4,2 4,2 2)),((5 5,5 9,9 9,9 5,5 5)))", true); + test_geometry<P, mpoly>("POINT(6 6)", + "MULTIPOLYGON(((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1)),((5 5,5 9,9 9,9 5,5 5)))", true); +} + +template <typename P> +void test_all() +{ + test_p_p<P>(); + test_p_l<P>(); + test_p_a<P>(); +} + +template <typename Point> +void test_spherical() +{ + bg::model::polygon<Point> wrangel; + + // SQL Server check (no geography::STWithin, so check with intersection trick) + /* + + with q as ( + select geography::STGeomFromText('POLYGON((-178.569 71.5641,-179.034 71.5977,-179.305 71.5514,-179.629 71.5772,-180 71.5358,179.53 71.4383,178.872 71.2175,178.618 71.0355,178.791 70.7964,179.273 70.8886,179.678 70.8955,-180 70.9972,-179.274 70.9078,-178.819 70.98,-177.939 71.0375,-177.62 71.1166,-177.439 71.2269,-177.503 71.2775,-177.833 71.3461,-178.018 71.4497,-178.569 71.5641))',4326) as wrangel + ) + + select wrangel.STArea()/1000000.0 + ,geography::STGeomFromText('POINT(-179.3 71.27)',4326).STIntersection(wrangel).STAsText() as workaround_within_1 + ,geography::STGeomFromText('POINT(-179.9 70.95)',4326).STIntersection(wrangel).STAsText() as workaround_within_2 + ,geography::STGeomFromText('POINT(179.9 70.95)',4326).STIntersection(wrangel).STAsText() as workaround_within_3 + from q + + -> 7669.10402181435 POINT (-179.3 71.27) GEOMETRYCOLLECTION EMPTY GEOMETRYCOLLECTION EMPTY + + PostGIS knows Within for Geography neither, and the intersection trick gives the same result + + */ + + bg::read_wkt("POLYGON((-178.568604 71.564148,-178.017548 71.449692,-177.833313 71.3461,-177.502838 71.277466 ,-177.439453 71.226929,-177.620026 71.116638,-177.9389 71.037491,-178.8186 70.979965,-179.274445 70.907761,-180 70.9972,179.678314 70.895538,179.272766 70.888596,178.791016 70.7964,178.617737 71.035538,178.872192 71.217484,179.530273 71.4383 ,-180 71.535843 ,-179.628601 71.577194,-179.305298 71.551361,-179.03421 71.597748,-178.568604 71.564148))", wrangel); + + bool within = bg::within(Point(-179.3, 71.27), wrangel); + BOOST_CHECK_EQUAL(within, true); + + within = bg::within(Point(-179.9, 70.95), wrangel); + BOOST_CHECK_EQUAL(within, false); + + within = bg::within(Point(179.9, 70.95), wrangel); + BOOST_CHECK_EQUAL(within, false); + + // Test using great circle mapper + // http://www.gcmap.com/mapui?P=5E52N-9E53N-7E50N-5E52N,7E52.5N,8E51.5N,6E51N + + bg::model::polygon<Point> triangle; + bg::read_wkt("POLYGON((5 52,9 53,7 50,5 52))", triangle); + BOOST_CHECK_EQUAL(bg::within(Point(7, 52.5), triangle), true); + BOOST_CHECK_EQUAL(bg::within(Point(8.0, 51.5), triangle), false); + BOOST_CHECK_EQUAL(bg::within(Point(6.0, 51.0), triangle), false); +} + +void test_large_integers() +{ + typedef bg::model::point<int, 2, bg::cs::cartesian> int_point_type; + typedef bg::model::point<double, 2, bg::cs::cartesian> double_point_type; + + std::string const polygon_li = "POLYGON((1872000 528000,1872000 192000,1536119 192000,1536000 528000,1200000 528000,1200000 863880,1536000 863880,1872000 863880,1872000 528000))"; + bg::model::polygon<int_point_type> int_poly; + bg::model::polygon<double_point_type> double_poly; + bg::read_wkt(polygon_li, int_poly); + bg::read_wkt(polygon_li, double_poly); + + std::string const point_li = "POINT(1592000 583950)"; + int_point_type int_point; + double_point_type double_point; + bg::read_wkt(point_li, int_point); + bg::read_wkt(point_li, double_point); + + bool wi = bg::within(int_point, int_poly); + bool wd = bg::within(double_point, double_poly); + + BOOST_CHECK_MESSAGE(wi == wd, "within<a double> different from within<an int>"); +} + +void test_tickets() +{ + typedef boost::geometry::model::d2::point_xy<double> pt; + typedef boost::geometry::model::ring<pt> ring; + + // https://svn.boost.org/trac/boost/ticket/9628 + { + ring r; + r.push_back(pt(-19155.669324773193,54820.312032458620)); + r.push_back(pt(-13826.169324773080,54820.312032458627)); + r.push_back(pt(-13826.169324773078,52720.312032458663)); + r.push_back(pt(-12755.169324773129,52720.312032458663)); + r.push_back(pt(-12755.169324773129,51087.312032458671)); + r.push_back(pt(-12760.669324773080,51087.312032458671)); + r.push_back(pt(-12760.669324773082,51070.312032458627)); + r.push_back(pt(-19155.669324779392,51070.312032458620)); + r.push_back(pt(-19155.669324773193,54820.312032458620)); + + pt p( -12260.669324773118, 54820.312032458634 ); + + //boost::geometry::correct(r); + + bool within = boost::geometry::within(p, r); + BOOST_CHECK_EQUAL(within, false); + } + // similar + { + ring r; + r.push_back(pt(-14155.6,54820.312032458620)); + r.push_back(pt(-13826.1,54820.312032458625)); + r.push_back(pt(-12155.6,53720.3)); + r.push_back(pt(-14155.6,54820.312032458620)); + + pt p( -13826.0, 54820.312032458634 ); + + bool within = boost::geometry::within(p, r); + BOOST_CHECK_EQUAL(within, false); + } + + // https://svn.boost.org/trac/boost/ticket/10234 + { + pt p; + ring r; + bg::read_wkt("POINT(0.1377 5.00)", p); + bg::read_wkt("POLYGON((0.1277 4.97, 0.1277 5.00, 0.1278 4.9999999999999982, 0.1278 4.97, 0.1277 4.97))", r); + bool within = boost::geometry::within(p, r); + BOOST_CHECK_EQUAL(within, false); + bool covered_by = boost::geometry::covered_by(p, r); + BOOST_CHECK_EQUAL(covered_by, false); + } +} + +int test_main( int , char* [] ) +{ + test_large_integers(); + + test_all<bg::model::d2::point_xy<int> >(); + test_all<bg::model::d2::point_xy<double> >(); + + test_spherical<bg::model::point<double, 2, bg::cs::spherical_equatorial<bg::degree> > >(); + +#if defined(HAVE_TTMATH) + test_all<bg::model::d2::point_xy<ttmath_big> >(); + test_spherical<bg::model::point<ttmath_big, 2, bg::cs::spherical_equatorial<bg::degree> > >(); +#endif + + test_tickets(); + + return 0; +} |