# Boost Users :

Subject: Re: [Boost-users] Enquiry on boost.geometry and intersection()
From: Zhang Qun (zhangq.rhy_at_[hidden])
Date: 2018-11-16 09:08:57

Hi, Adam thanks for the reply and detailed code and explanation. Yes, it
worked.
I implemented as per your instructions but encountered a small problem.
That is sometimes I realized the intersections points between the
linestrings and the polygon are not in a "consistent" order, e.g. as shown
in the below image, lingstring 1 has P1->P2; However, instead of P3->P4,
linestring 2 is P4->P3. I actually expect linestring 2 is also along P3->P4
direction. Is this how it is supposed to be? Any workaround to solve this
problem? Thanks.

[image: Presentation1.png]

Regards
Ethan.

wrote:

> Hi and welcome,
>
> Zhang Qun Via Boost-users wrote:
>
> Hi guys, first-time post here. Hello to everyone.
>
> I'm using boost.geometry to implement a project. I need to calculate the
> intersection between a line and a polygon. I know there is no infinite line
> concept in boost.geometry. So I try to use the segment to intersect with a
> polygon, however, it seems not supported yet. Is there any other workaround
> that I can implement the intersection between a line and a polygon? The
> line is like y=mx+b or ax + by + c = 0.
>
>
> Indeed the intersection of segment and polygon does not compile even
> though it should. Fortunately you can represent a segment as a linestring
> with 2 points. Something like this:
>
> namespace bg = boost::geometry;
>
> typedef bg::model::point<double, 2, bg::cs::cartesian> point;
> typedef bg::model::box<point> box;
> typedef bg::model::segment<point> segment;
> typedef bg::model::linestring<point> linestring;
> typedef bg::model::multi_linestring<linestring> multi_linestring;
> typedef bg::model::polygon<point> polygon;
>
> // create some polygon, a circle
> polygon poly;
> for (double a = 0; a < 2 * 3.14; a += 0.1)
> bg::append(poly, point(cos(a), sin(a)));
> // correct data to match compile-time metadata
> // (clockwise, closed polygon)
> bg::correct(poly);
>
> // calculate polygon's bounding box which could be used with line
> // equation to calculate segment's endpoints
> box b = bg::return_envelope<box>(poly);
>
> // here you could calculate a segment represented as linestring
> // using min and max coordinates of polygon's envelope
> // and line's parameters
> // but for now:
> linestring ls;
> bg::append(ls, point(-1, -1));
> bg::append(ls, point(1, 1));
>
> // the result of the intersection of linear and areal geometry
> // is multi-linestring
> multi_linestring result;
> bg::intersection(ls, poly, result);
>
> std::cout << bg::wkt(ls) << std::endl;
> std::cout << bg::wkt(poly) << std::endl;
> std::cout << bg::wkt(result) << std::endl;
>
> Regards,