Merge branch 'develop' into feature/buffer

This commit is contained in:
Barend Gehrels
2015-05-05 10:08:49 +02:00
177 changed files with 8061 additions and 1458 deletions

View File

@@ -56,6 +56,15 @@ void test_polygon()
// should (1.5 1) be returned?
// if yes, then all other Polygons degenerated to Linestrings should be handled
test_centroid<Polygon>("POLYGON((1 1,2 1,1 1,1 1))", 1.0, 1.0);
// reported 2015.04.24
// input INT, result FP
test_centroid
<
bg::model::polygon<bg::model::d2::point_xy<int> >,
typename bg::point_type<Polygon>::type,
typename bg::coordinate_type<Polygon>::type
>("POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))", 1.5, 1.5);
}
@@ -97,6 +106,23 @@ void test_2d()
test_centroid<bg::model::box<P> >("POLYGON((1 2,3 4))", 2, 3);
test_centroid<P>("POINT(3 3)", 3, 3);
// INT -> FP
test_centroid
<
bg::model::ring<bg::model::d2::point_xy<int> >,
P, typename bg::coordinate_type<P>::type
>("POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))", 1.5, 1.5);
test_centroid
<
bg::model::linestring<bg::model::d2::point_xy<int> >,
P, typename bg::coordinate_type<P>::type
>("LINESTRING(1 1, 2 2)", 1.5, 1.5);
test_centroid
<
bg::model::box<bg::model::d2::point_xy<int> >,
P, typename bg::coordinate_type<P>::type
>("BOX(1 1, 2 2)", 1.5, 1.5);
}
@@ -145,6 +171,7 @@ void test_large_integers()
bg::centroid(double_poly, double_centroid);
int_point_type double_centroid_as_int;
bg::assign_zero(double_centroid_as_int);
bg::assign(int_centroid, double_centroid_as_int);
BOOST_CHECK_EQUAL(bg::get<0>(int_centroid), bg::get<0>(double_centroid_as_int));

View File

@@ -158,24 +158,53 @@ inline void test_point_segment()
false);
tester::apply("p-s-02",
from_wkt<P>("POINT(1 0)"),
from_wkt<P>("POINT(2 0)"),
from_wkt<S>("SEGMENT(0 0,2 0)"),
false);
tester::apply("p-s-03",
from_wkt<P>("POINT(1 0)"),
from_wkt<S>("SEGMENT(0 0,2 0)"),
false);
tester::apply("p-s-04",
from_wkt<P>("POINT(1 1)"),
from_wkt<S>("SEGMENT(0 0,2 0)"),
true);
tester::apply("p-s-04",
tester::apply("p-s-05",
from_wkt<P>("POINT(3 0)"),
from_wkt<S>("SEGMENT(0 0,2 0)"),
true);
tester::apply("p-s-05",
tester::apply("p-s-06",
from_wkt<P>("POINT(-1 0)"),
from_wkt<S>("SEGMENT(0 0,2 0)"),
true);
// degenerate segment
tester::apply("p-s-07",
from_wkt<P>("POINT(-1 0)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
true);
// degenerate segment
tester::apply("p-s-08",
from_wkt<P>("POINT(2 0)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
false);
// degenerate segment
tester::apply("p-s-09",
from_wkt<P>("POINT(3 0)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
true);
// degenerate segment
tester::apply("p-s-10",
from_wkt<P>("POINT(1 1)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
true);
}
template <typename P>
@@ -348,9 +377,19 @@ inline void test_multipoint_linestring()
false);
tester::apply("mp-l-07",
from_wkt<MP>("MULTIPOINT(-1 -1,2 0)"),
from_wkt<MP>("MULTIPOINT(-1 -1,2 0,-1 -1,2 0)"),
from_wkt<L>("LINESTRING(1 0,3 0)"),
false);
tester::apply("mp-l-08",
from_wkt<MP>("MULTIPOINT(2 0)"),
from_wkt<L>("LINESTRING(1 0)"),
true);
tester::apply("mp-l-09",
from_wkt<MP>("MULTIPOINT(3 0,0 0,3 0)"),
from_wkt<L>("LINESTRING(1 0,2 0)"),
true);
}
template <typename P>
@@ -381,6 +420,16 @@ inline void test_multipoint_multilinestring()
from_wkt<MP>("MULTIPOINT(0 1,1 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2,4 4),(0 0,2 0,4 0))"),
false);
tester::apply("mp-ml-05",
from_wkt<MP>("MULTIPOINT(0 0,10 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2,4 4),(0 0,2 0,4 0))"),
false);
tester::apply("mp-ml-06",
from_wkt<MP>("MULTIPOINT(-1 0,3 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2,4 4),(0 0,2 0,4 0))"),
false);
}
//============================================================================
@@ -1575,9 +1624,8 @@ inline void test_pointlike_linear()
test_point_multilinestring<point_type>();
test_point_segment<point_type>();
// not implemented yet
// test_multipoint_linestring<point_type>();
// test_multipoint_multilinestring<point_type>();
test_multipoint_linestring<point_type>();
test_multipoint_multilinestring<point_type>();
test_multipoint_segment<point_type>();
}

View File

@@ -1,11 +1,11 @@
# 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.
# Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
# Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
# Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
#
# This file was modified by Oracle on 2014.
# Modifications copyright (c) 2014, Oracle and/or its affiliates.
# This file was modified by Oracle on 2014, 2015.
# Modifications copyright (c) 2014-2015, 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
@@ -18,6 +18,7 @@ test-suite boost-geometry-algorithms-difference
:
[ run difference.cpp : : : <define>BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ]
[ run difference_linear_linear.cpp ]
[ run difference_pl_l.cpp ]
[ run difference_pl_pl.cpp ]
[ run multi_difference.cpp : : : <define>BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ]
[ run multi_difference_spike.cpp : : : <define>BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ]

View File

@@ -0,0 +1,674 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2015, Oracle and/or its affiliates.
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
#ifndef BOOST_TEST_MODULE
#define BOOST_TEST_MODULE test_difference_pointlike_linear
#endif
#include <iostream>
#include <algorithm>
#include <boost/test/included/unit_test.hpp>
#include "../test_set_ops_pointlike.hpp"
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/multi_point.hpp>
#include <boost/geometry/geometries/multi_linestring.hpp>
typedef bg::model::point<double, 2, bg::cs::cartesian> point_type;
typedef bg::model::segment<point_type> segment_type;
typedef bg::model::linestring<point_type> linestring_type;
typedef bg::model::multi_point<point_type> multi_point_type;
typedef bg::model::multi_linestring<linestring_type> multi_linestring_type;
//===========================================================================
//===========================================================================
//===========================================================================
BOOST_AUTO_TEST_CASE( test_difference_point_segment )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << "size of std::size_t: " << sizeof(std::size_t) << std::endl;
std::cout << "size of range_iterator<multipoint>: "
<< sizeof(boost::range_iterator<multi_point_type>::type)
<< std::endl;
std::cout << "size of range_iterator<multilinestring>: "
<< sizeof(boost::range_iterator<multi_linestring_type>::type)
<< std::endl;
std::cout << "size of point_iterator<multipoint>: "
<< sizeof(bg::point_iterator<multi_point_type>) << std::endl;
std::cout << "size of point_iterator<linestring>: "
<< sizeof(bg::point_iterator<linestring_type>) << std::endl;
std::cout << "size of point_iterator<multilinestring>: "
<< sizeof(bg::point_iterator<multi_linestring_type>) << std::endl;
std::cout << "size of segment_iterator<linestring>: "
<< sizeof(bg::segment_iterator<linestring_type>) << std::endl;
std::cout << "size of segment_iterator<multilinestring>: "
<< sizeof(bg::segment_iterator<multi_linestring_type>) << std::endl;
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / SEGMENT DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef segment_type S;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, S, MP, bg::overlay_difference
> tester;
tester::apply
("psdf01",
from_wkt<P>("POINT(0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("psdf02",
from_wkt<P>("POINT(0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("psdf03",
from_wkt<P>("POINT(1 1)"),
from_wkt<S>("SEGMENT(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("psdf04",
from_wkt<P>("POINT(3 3)"),
from_wkt<S>("SEGMENT(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT(3 3)")
);
}
BOOST_AUTO_TEST_CASE( test_difference_point_linestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / LINESTRING DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef linestring_type L;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, L, MP, bg::overlay_difference
> tester;
tester::apply
("pldf01",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pldf02",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pldf03",
from_wkt<P>("POINT(1 1)"),
from_wkt<L>("LINESTRING(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pldf04",
from_wkt<P>("POINT(3 3)"),
from_wkt<L>("LINESTRING(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT(3 3)")
);
// linestrings with more than two points
tester::apply
("pldf05",
from_wkt<P>("POINT(1 1)"),
from_wkt<L>("LINESTRING(0 0,1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pldf06",
from_wkt<P>("POINT(2 2)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pldf07",
from_wkt<P>("POINT(10 10)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT(10 10)")
);
tester::apply
("pldf08",
from_wkt<P>("POINT(0 1)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT(0 1)")
);
tester::apply
("pldf09",
from_wkt<P>("POINT(4 4)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pldf10",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT()")
);
}
BOOST_AUTO_TEST_CASE( test_difference_point_multilinestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / MULTILINESTRING DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef multi_linestring_type ML;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, ML, MP, bg::overlay_difference
> tester;
tester::apply
("pmldf01",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((1 1,2 2))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pmldf02",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf03",
from_wkt<P>("POINT(1 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf04",
from_wkt<P>("POINT(3 3)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2))"),
from_wkt<MP>("MULTIPOINT(3 3)")
);
// linestrings with more than two points
tester::apply
("pmldf05",
from_wkt<P>("POINT(1 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,2 2))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf06",
from_wkt<P>("POINT(2 2)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf07",
from_wkt<P>("POINT(10 10)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(10 10)")
);
tester::apply
("pmldf08",
from_wkt<P>("POINT(0 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 1)")
);
tester::apply
("pmldf09",
from_wkt<P>("POINT(4 4)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf10",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
// multilinestrings with more than one linestring
tester::apply
("pmldf11",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10,-10),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf12",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,0 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf13",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmldf14",
from_wkt<P>("POINT(-20 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(-20 0)")
);
tester::apply
("pmldf15",
from_wkt<P>("POINT(0 1)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 1)")
);
}
BOOST_AUTO_TEST_CASE( test_difference_multipoint_segment )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / SEGMENT DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef segment_type S;
typedef test_set_op_of_pointlike_geometries
<
MP, S, MP, bg::overlay_difference
> tester;
tester::apply
("mpsdf01",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("mpsdf02",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsdf03",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsdf04",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsdf05",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)")
);
tester::apply
("mpsf06",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<S>("SEGMENT(1 0,2 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsdf07",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpsdf08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsdf09",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(-1 0,1 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpsdf10",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsdf11",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(-1 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsdf12",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)")
);
tester::apply
("mpsdf12a",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)")
);
tester::apply
("mpsdf12b",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0,2 0)")
);
tester::apply
("mpsdf12c",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,0 0,2 0,2 0)")
);
tester::apply
("mpsdf13",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsdf14",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(0 0,0 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpsdf15",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<S>("SEGMENT(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT()")
);
}
BOOST_AUTO_TEST_CASE( test_difference_multipoint_linestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / LINESTRING DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef linestring_type L;
typedef test_set_op_of_pointlike_geometries
<
MP, L, MP, bg::overlay_difference
> tester;
tester::apply
("mpldf01",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2,3 3,4 4,5 5)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("mpldf02",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpldf03",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpldf04",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpldf05",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)")
);
tester::apply
("mplf06",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<L>("LINESTRING(1 0,2 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpldf07",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpldf08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpldf09",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(-1 0,1 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpldf10",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpldf11",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(-1 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpldf12",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)")
);
tester::apply
("mpldf13",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(2 0,2 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpldf14",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(0 0,0 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpldf15",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING(0 0,1 0,2 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpldf16",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING()"),
from_wkt<MP>("MULTIPOINT()")
);
}
BOOST_AUTO_TEST_CASE( test_difference_multipoint_multilinestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / MULTILINESTRING DIFFERENCE ***" << std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef multi_linestring_type ML;
typedef test_set_op_of_pointlike_geometries
<
MP, ML, MP, bg::overlay_difference
> tester;
tester::apply
("mpmldf01",
from_wkt<MP>("MULTIPOINT(0 0,1 0,2 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0,2 0)")
);
tester::apply
("mpmldf02",
from_wkt<MP>("MULTIPOINT(2 2,3 3,0 0,0 0,2 2,1 1,1 1,1 0,1 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpmldf03",
from_wkt<MP>("MULTIPOINT(5 5,3 3,0 0,0 0,5 5,1 1,1 1,1 0,1 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(5 5,5 5,0 0,0 0)")
);
tester::apply
("mpmldf04",
from_wkt<MP>("MULTIPOINT(0 0,1 1,1 0,1 1)"),
from_wkt<ML>("MULTILINESTRING((1 0,0 0,1 1,0 0))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmldf05",
from_wkt<MP>("MULTIPOINT(0 0,1 0,2 0,5 0)"),
from_wkt<ML>("MULTILINESTRING((0 1,0 0,1 2,1 0),\
(0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmldf05a",
from_wkt<MP>("MULTIPOINT(0 0,1 0,6 0,7 0,2 0,5 0,7 0,8 0)"),
from_wkt<ML>("MULTILINESTRING((0 1,0 0,1 2,1 0),\
(0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"),
from_wkt<MP>("MULTIPOINT(7 0,7 0,8 0,6 0)")
);
tester::apply
("mpmldf06",
from_wkt<MP>("MULTIPOINT(0 0,1 1,1 0,1 1)"),
from_wkt<ML>("MULTILINESTRING(())"),
from_wkt<MP>("MULTIPOINT(0 0,1 1,1 0,1 1)")
);
tester::apply
("mpmldf07",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<ML>("MULTILINESTRING(())"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmldf08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<ML>("MULTILINESTRING((0 0,1 0),(9 0,10 0))"),
from_wkt<MP>("MULTIPOINT()")
);
}

View File

@@ -1,11 +1,11 @@
# 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.
# Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
# Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
# Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
#
# This file was modified by Oracle on 2014.
# Modifications copyright (c) 2014, Oracle and/or its affiliates.
# This file was modified by Oracle on 2014, 2015.
# Modifications copyright (c) 2014-2015, 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
@@ -18,6 +18,7 @@ test-suite boost-geometry-algorithms-intersection
:
[ run intersection.cpp : : : <define>BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ]
[ run intersection_linear_linear.cpp ]
[ run intersection_pl_l.cpp ]
[ run intersection_pl_pl.cpp ]
[ run multi_intersection.cpp : : : <define>BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ]
;

View File

@@ -358,6 +358,7 @@ void test_boxes(std::string const& wkt1, std::string const& wkt2, double expecte
bg::read_wkt(wkt2, box2);
Box box_out;
bg::assign_zero(box_out);
bool detected = bg::intersection(box1, box2, box_out);
typename bg::default_area_result<Box>::type area = bg::area(box_out);

View File

@@ -0,0 +1,702 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2015, Oracle and/or its affiliates.
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
#ifndef BOOST_TEST_MODULE
#define BOOST_TEST_MODULE test_intersection_pointlike_linear
#endif
#include <iostream>
#include <algorithm>
#include <boost/test/included/unit_test.hpp>
#include "../test_set_ops_pointlike.hpp"
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/multi_point.hpp>
#include <boost/geometry/geometries/multi_linestring.hpp>
typedef bg::model::point<double, 2, bg::cs::cartesian> point_type;
typedef bg::model::segment<point_type> segment_type;
typedef bg::model::linestring<point_type> linestring_type;
typedef bg::model::multi_point<point_type> multi_point_type;
typedef bg::model::multi_linestring<linestring_type> multi_linestring_type;
//===========================================================================
//===========================================================================
//===========================================================================
BOOST_AUTO_TEST_CASE( test_intersection_point_segment )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / SEGMENT INTERSECTION ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef segment_type S;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, S, MP, bg::overlay_intersection
> tester;
tester::apply
("psi01",
from_wkt<P>("POINT(0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("psi02",
from_wkt<P>("POINT(0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("psi03",
from_wkt<P>("POINT(1 1)"),
from_wkt<S>("SEGMENT(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT(1 1)")
);
tester::apply
("psi04",
from_wkt<P>("POINT(3 3)"),
from_wkt<S>("SEGMENT(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
}
BOOST_AUTO_TEST_CASE( test_intersection_point_linestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / LINESTRING INTERSECTION ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef linestring_type L;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, L, MP, bg::overlay_intersection
> tester;
tester::apply
("pli01",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pli02",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pli03",
from_wkt<P>("POINT(1 1)"),
from_wkt<L>("LINESTRING(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT(1 1)")
);
tester::apply
("pli04",
from_wkt<P>("POINT(3 3)"),
from_wkt<L>("LINESTRING(0 0,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
// linestrings with more than two points
tester::apply
("pli05",
from_wkt<P>("POINT(1 1)"),
from_wkt<L>("LINESTRING(0 0,1 1,2 2)"),
from_wkt<MP>("MULTIPOINT(1 1)")
);
tester::apply
("pli06",
from_wkt<P>("POINT(2 2)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT(2 2)")
);
tester::apply
("pli07",
from_wkt<P>("POINT(10 10)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pli08",
from_wkt<P>("POINT(0 1)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pli09",
from_wkt<P>("POINT(4 4)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT(4 4)")
);
tester::apply
("pli10",
from_wkt<P>("POINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1,4 4)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
}
BOOST_AUTO_TEST_CASE( test_intersection_point_multilinestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** POINT / MULTILINESTRING INTERSECTION ***" << std::endl;
std::cout << std::endl;
#endif
typedef point_type P;
typedef multi_linestring_type ML;
typedef multi_point_type MP;
typedef test_set_op_of_pointlike_geometries
<
P, ML, MP, bg::overlay_intersection
> tester;
tester::apply
("pmli01",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((1 1,2 2))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmli02",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pmli03",
from_wkt<P>("POINT(1 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2))"),
from_wkt<MP>("MULTIPOINT(1 1)")
);
tester::apply
("pmli04",
from_wkt<P>("POINT(3 3)"),
from_wkt<ML>("MULTILINESTRING((0 0,2 2))"),
from_wkt<MP>("MULTIPOINT()")
);
// linestrings with more than two points
tester::apply
("pmli05",
from_wkt<P>("POINT(1 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,2 2))"),
from_wkt<MP>("MULTIPOINT(1 1)")
);
tester::apply
("pmli06",
from_wkt<P>("POINT(2 2)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(2 2)")
);
tester::apply
("pmli07",
from_wkt<P>("POINT(10 10)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmli08",
from_wkt<P>("POINT(0 1)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmli09",
from_wkt<P>("POINT(4 4)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(4 4)")
);
tester::apply
("pmli10",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
// multilinestrings with more than one linestring
tester::apply
("pmli11",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10,-10),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pmli12",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,0 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pmli13",
from_wkt<P>("POINT(0 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("pmli14",
from_wkt<P>("POINT(-20 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmli15",
from_wkt<P>("POINT(0 1)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 0,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("pmli16",
from_wkt<P>("POINT(1 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(-1 0,2 0,20 0))"),
from_wkt<MP>("MULTIPOINT(1 0)")
);
tester::apply
("pmli17",
from_wkt<P>("POINT(1 0)"),
from_wkt<ML>("MULTILINESTRING((-10 0,10 0),(0 -1,0 2,0 4))"),
from_wkt<MP>("MULTIPOINT(1 0)")
);
}
BOOST_AUTO_TEST_CASE( test_intersection_multipoint_segment )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / SEGMENT INTERSECTION ***" << std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef segment_type S;
typedef test_set_op_of_pointlike_geometries
<
MP, S, MP, bg::overlay_intersection
> tester;
tester::apply
("mpsi01",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi02",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("mpsi03",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi04",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsi05",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<S>("SEGMENT(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsf06",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<S>("SEGMENT(1 0,2 0)"),
from_wkt<MP>("MULTIPOINT(1 0)")
);
tester::apply
("mpsi07",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsi07a",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(0 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)")
);
tester::apply
("mpsi08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<S>("SEGMENT(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi09",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(-1 0,1 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsi10",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpsi11",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(-1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)")
);
tester::apply
("mpsi12",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi12a",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi12b",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi12c",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"),
from_wkt<S>("SEGMENT(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi13",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(2 0,2 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpsi14",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<S>("SEGMENT(0 0,0 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpsi15",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<S>("SEGMENT(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpsi16",
from_wkt<MP>("MULTIPOINT(0 0,2 0,0 0,2 0,0 0)"),
from_wkt<S>("SEGMENT(-1 0,10 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,0 0,2 0,2 0)")
);
}
BOOST_AUTO_TEST_CASE( test_intersection_multipoint_linestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / LINESTRING INTERSECTION ***" << std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef linestring_type L;
typedef test_set_op_of_pointlike_geometries
<
MP, L, MP, bg::overlay_intersection
> tester;
tester::apply
("mpli01",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2,3 3,4 4,5 5)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli02",
from_wkt<MP>("MULTIPOINT(0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0)")
);
tester::apply
("mpli03",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli04",
from_wkt<MP>("MULTIPOINT(0 0,0 0)"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpli05",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<L>("LINESTRING(1 1,2 2)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli06",
from_wkt<MP>("MULTIPOINT(0 0,0 0,1 0)"),
from_wkt<L>("LINESTRING(1 0,2 0)"),
from_wkt<MP>("MULTIPOINT(1 0)")
);
tester::apply
("mpli07",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(0 0,1 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpli08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING(0 0,1 1)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli09",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(-1 0,1 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpli10",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpli10a",
from_wkt<MP>("MULTIPOINT(2 0,0 0,2 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(2 0,2 0,2 0)")
);
tester::apply
("mpli11",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(-1 0,3 0)"),
from_wkt<MP>("MULTIPOINT(2 0,0 0,0 0)")
);
tester::apply
("mpli12",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(3 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli13",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(2 0,2 0)"),
from_wkt<MP>("MULTIPOINT(2 0)")
);
tester::apply
("mpli14",
from_wkt<MP>("MULTIPOINT(0 0,0 0,2 0)"),
from_wkt<L>("LINESTRING(0 0,0 0)"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
tester::apply
("mpli15",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING(0 0,1 0,2 0,3 0)"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpli16",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<L>("LINESTRING()"),
from_wkt<MP>("MULTIPOINT()")
);
}
BOOST_AUTO_TEST_CASE( test_intersection_multipoint_multilinestring )
{
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl << std::endl;
std::cout << "*** MULTIPOINT / MULTILINESTRING INTERSECTION ***"
<< std::endl;
std::cout << std::endl;
#endif
typedef multi_point_type MP;
typedef multi_linestring_type ML;
typedef test_set_op_of_pointlike_geometries
<
MP, ML, MP, bg::overlay_intersection
> tester;
tester::apply
("mpmli01",
from_wkt<MP>("MULTIPOINT(0 0,1 0,2 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(1 0)")
);
tester::apply
("mpmli02",
from_wkt<MP>("MULTIPOINT(2 2,3 3,0 0,0 0,2 2,1 1,1 1,1 0,1 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(2 2,2 2,3 3,1 1,1 1,1 0,1 0)")
);
tester::apply
("mpmli03",
from_wkt<MP>("MULTIPOINT(5 5,3 3,0 0,0 0,5 5,1 1,1 1,1 0,1 0)"),
from_wkt<ML>("MULTILINESTRING((1 0,1 1,1 1,4 4))"),
from_wkt<MP>("MULTIPOINT(1 0,1 0,3 3,1 1,1 1)")
);
tester::apply
("mpmli04",
from_wkt<MP>("MULTIPOINT(0 0,1 1,1 0,1 1)"),
from_wkt<ML>("MULTILINESTRING((1 0,0 0,1 1,0 0))"),
from_wkt<MP>("MULTIPOINT(1 0,0 0,1 1,1 1)")
);
tester::apply
("mpmli05",
from_wkt<MP>("MULTIPOINT(0 0,1 0,2 0,5 0)"),
from_wkt<ML>("MULTILINESTRING((0 1,0 0,1 2,1 0),\
(0 1,2 0,0 10,2 0,2 10,5 10,5 0,5 10))"),
from_wkt<MP>("MULTIPOINT(0 0,1 0,2 0,5 0)")
);
tester::apply
("mpmli06",
from_wkt<MP>("MULTIPOINT(0 0,1 1,1 0,1 1)"),
from_wkt<ML>("MULTILINESTRING(())"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmli07",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<ML>("MULTILINESTRING(())"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmli08",
from_wkt<MP>("MULTIPOINT()"),
from_wkt<ML>("MULTILINESTRING((0 0,1 0),(9 0,10 0))"),
from_wkt<MP>("MULTIPOINT()")
);
tester::apply
("mpmli09",
from_wkt<MP>("MULTIPOINT(0 0,1 1,0 0,0 0,0 0,0 0,0 0,0 0,\
0 0,0 0,0 0,0 0,0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,0 1),(0 0,2 0),(0 0,0 3),\
(0 0,4 0),(0 0,0 5),(0 0,6 0),(0 0,7 0),(0 0,8 0))"),
from_wkt<MP>("MULTIPOINT(0 0,0 0,0 0,0 0,0 0,0 0,0 0,\
0 0,0 0,0 0,0 0,0 0)")
);
tester::apply
("mpmli09a",
from_wkt<MP>("MULTIPOINT(0 0,1 1,0 0)"),
from_wkt<ML>("MULTILINESTRING((0 0,0 1),(0 0,2 0),(0 0,0 3),\
(0 0,4 0),(0 0,0 5),(0 0,6 0),(0 0,7 0),(0 0,8 0))"),
from_wkt<MP>("MULTIPOINT(0 0,0 0)")
);
}

View File

@@ -30,6 +30,7 @@ struct check_result
static void apply(Point1 const& actual, Point2 const& expected)
{
check_result<D-1>::apply(actual, expected);
BOOST_CHECK_CLOSE(bg::get<D-1>(actual), bg::get<D-1>(expected), 0.001);
}
};
@@ -48,9 +49,9 @@ void test_with_other_calculation_type(Geometry const& geometry, Point& c1)
{
typedef typename bg::point_type<Geometry>::type point_type;
// Calculate it with user defined strategy
point_type c2;
Point c2;
bg::centroid(geometry, c2,
bg::strategy::centroid::bashein_detmer<point_type, point_type, CalculationType>());
bg::strategy::centroid::bashein_detmer<Point, point_type, CalculationType>());
std::cout << typeid(CalculationType).name() << ": " << std::setprecision(20)
<< bg::get<0>(c2) << " " << bg::get<1>(c2)
@@ -58,13 +59,13 @@ void test_with_other_calculation_type(Geometry const& geometry, Point& c1)
<< std::endl;
}
template <typename Geometry, typename T>
template <typename Geometry, typename Point, typename T>
void test_centroid(std::string const& wkt, T const& d1, T const& d2, T const& d3 = T(), T const& d4 = T(), T const& d5 = T())
{
Geometry geometry;
bg::read_wkt(wkt, geometry);
typedef typename bg::point_type<Geometry>::type point_type;
point_type c1;
Point c1;
bg::centroid(geometry, c1);
check_result<bg::dimension<Geometry>::type::value>::apply(c1, boost::make_tuple(d1, d2, d3, d4, d5));
@@ -85,6 +86,12 @@ void test_centroid(std::string const& wkt, T const& d1, T const& d2, T const& d3
#endif
}
template <typename Geometry, typename T>
void test_centroid(std::string const& wkt, T const& d1, T const& d2, T const& d3 = T(), T const& d4 = T(), T const& d5 = T())
{
test_centroid<Geometry, typename bg::point_type<Geometry>::type>(wkt, d1, d2, d3, d4, d5);
}
template <typename Geometry>
void test_centroid_exception()
{