Snažil jsem se získat handle na tento problém pomocí DE-9IM , že Zvýšení Geometrie implementuje: https://godbolt.org/z/KWzvzExr7 které výstupy https://pastebin.ubuntu.com/p/9ck6gcPK5P/
---- void do_test(Input, Input) [with Input = boost::geometry::model::ring<boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> >]
a: POLYGON((0 0,0 10,10 10,10 0,0 0))
b: POLYGON((5 -5,5 5,15 5,15 -5,5 -5))
MULTIPOINT((10 5),(5 0))
MULTIPOLYGON(((10 5,10 0,5 0,5 5,10 5)))
Segment of ringB LINESTRING(5 -5,5 5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(5 5,15 5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(15 5,15 -5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(15 -5,5 -5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
---- void do_test(Input, Input) [with Input = boost::geometry::model::linestring<boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> >]
a: LINESTRING(0 0,0 10,10 10,10 0,0 0)
b: LINESTRING(5 -5,5 5,15 5,15 -5,5 -5)
MULTIPOINT((10 5),(5 0))
Segment of ringB LINESTRING(5 -5,5 5) relates to ringA
['F', 'F', '1']
['F', 'F', 'F']
['F', 'F', '2']
Segment of ringB LINESTRING(5 5,15 5) relates to ringA
['F', 'F', '1']
['F', 'F', 'F']
['F', 'F', '2']
Segment of ringB LINESTRING(15 5,15 -5) relates to ringA
['F', 'F', '1']
['F', 'F', 'F']
['F', 'F', '2']
Segment of ringB LINESTRING(15 -5,5 -5) relates to ringA
['F', 'F', '1']
['F', 'F', 'F']
['F', 'F', '2']
---- void do_test(Input, Input) [with Input = boost::geometry::model::polygon<boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> >]
a: POLYGON((0 0,0 10,10 10,10 0,0 0))
b: POLYGON((5 -5,5 5,15 5,15 -5,5 -5))
MULTIPOINT((10 5),(5 0))
MULTIPOLYGON(((10 5,10 0,5 0,5 5,10 5)))
Segment of ringB LINESTRING(5 -5,5 5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(5 5,15 5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(15 5,15 -5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
Segment of ringB LINESTRING(15 -5,5 -5) relates to ringA
['F', 'F', '2']
['F', 'F', '1']
['F', 'F', '2']
ale jak daleko jak já mohu vidět všechny výsledky jsou přinejmenším plně disjunktní. Takže možná budete muset přiblížit na body namísto segmentů:
Žít Na Wandbox
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/iterators/segment_iterator.hpp>
#include <iostream>
namespace bg = boost::geometry;
using point_t = bg::model::point<int, 2, bg::cs::cartesian>;
using ring_t = bg::model::ring<point_t>;
using mpoint_t = bg::model::multi_point<point_t>;
void do_test(ring_t ringA, ring_t ringB)
{
std::string reason;
if (!bg::is_valid(ringA, reason)) { std::cout << "warning ringA: " << reason << "\n"; bg::correct(ringA); }
if (!bg::is_valid(ringB, reason)) { std::cout << "warning ringB: " << reason << "\n"; bg::correct(ringB); }
std::cout << "ringA: " << bg::wkt(ringA) << std::endl;
std::cout << "ringB: " << bg::wkt(ringB) << std::endl;
mpoint_t result;
bg::intersection(ringA, ringB, result);
std::cout << bg::wkt(result) << std::endl;
for (auto seg : boost::make_iterator_range(bg::segments_begin(ringB),
bg::segments_end(ringB))) {
for (auto& p : result)
if (bg::intersects(p, seg))
std::cout << bg::wkt(p) << " intersects " << bg::wkt(seg) << "\n";
}
}
int main() {
do_test({{0, 0}, {0, 10}, {10, 10}, {10, 0}/*, {0, 0}*/},
{{5, -5}, {5, 5}, {15, 5}, {15, -5}/*, {5, -5}*/});
}
Otisky
warning ringA: Geometry is defined as closed but is open
warning ringB: Geometry is defined as closed but is open
ringA: POLYGON((0 0,0 10,10 10,10 0,0 0))
ringB: POLYGON((5 -5,5 5,15 5,15 -5,5 -5))
MULTIPOINT((10 5),(5 0))
POINT(5 0) intersects LINESTRING(5 -5,5 5)
POINT(10 5) intersects LINESTRING(5 5,15 5)