# Enquiry on boost.geometry and intersection()

7 messages
Open this post in threaded view
|

## Enquiry on boost.geometry and intersection()

 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.Thanks.Ethan _______________________________________________ Boost-users mailing list [hidden email] https://lists.boost.org/mailman/listinfo.cgi/boost-users
Open this post in threaded view
|

## Re: Enquiry on boost.geometry and intersection()

 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 point; typedef bg::model::box box; typedef bg::model::segment segment; typedef bg::model::linestring linestring; typedef bg::model::multi_linestring multi_linestring; typedef bg::model::polygon 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(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, Adam _______________________________________________ Boost-users mailing list [hidden email] https://lists.boost.org/mailman/listinfo.cgi/boost-users
Open this post in threaded view
|

## Re: Enquiry on boost.geometry and intersection()

 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.Regards Ethan.On Fri, Nov 16, 2018 at 11:30 AM Adam Wulkiewicz <[hidden email]> 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 point; typedef bg::model::box box; typedef bg::model::segment segment; typedef bg::model::linestring linestring; typedef bg::model::multi_linestring multi_linestring; typedef bg::model::polygon 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(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, Adam _______________________________________________ Boost-users mailing list [hidden email] https://lists.boost.org/mailman/listinfo.cgi/boost-users
Open this post in threaded view
|

## Re: Enquiry on boost.geometry and intersection()

 Please do not top-post. Zhang Qun wrote: 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. I don't know what happens in this case exactly because I don't know the data but I would rather assume that Boost.Geometry doesn't care about the order of linestring points (both directions represent the same geometry). The simplest solution would be to check the direction of the output and if needed reverse the linestrings manually or with bg::reverse(). Adam _______________________________________________ Boost-users mailing list [hidden email] https://lists.boost.org/mailman/listinfo.cgi/boost-users
Open this post in threaded view
|