self intersection doesn't find collinear intersection types

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

self intersection doesn't find collinear intersection types

sergei benkovich
Hey,
i have an issue where i find self intersections in a polygon.but it doesn't seem to find the method_collinear type.

this is the piece of code:


  namespace bg = boost::geometry;
  using namespace std;
  typedef bg::model::d2::point_xy<double> point_2d;
  typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;
  Polygon poly;
  poly.outer().push_back(point_2d(0, 10));
  poly.outer().push_back(point_2d(10, 0));




  typedef bg::point_type<Polygon>::type point_type;
  typedef bg::detail::overlay::traversal_turn_info
   <point_type,typename bg::segment_ratio_type<point_type, bg::detail::no_rescale_policy>::type> turn_info;

  bg::detail::self_get_turn_points::no_interrupt_policy noInteruptPolicy;
  bg::detail::no_rescale_policy robust_policy;
  std::vector<turn_info> turns;
  bg::self_turns<bg::detail::overlay::assign_null_policy>(
    poly, robust_policy, turns, noInteruptPolicy);

_______________________________________________
Geometry mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/geometry
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: self intersection doesn't find collinear intersection types

Adam Wulkiewicz
Hi Sergei,

Sergei Benkovich wrote:

> Hey,
> i have an issue where i find self intersections in a polygon.but it
> doesn't seem to find the method_collinear type.
>
> this is the piece of code:
>
>
>   namespace bg = boost::geometry;
>   using namespace std;
>   typedef bg::model::d2::point_xy<double> point_2d;
>   typedef
> bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;
>   Polygon poly;
>   poly.outer().push_back(point_2d(0, 10));
>   poly.outer().push_back(point_2d(10, 0));
>

Have in mind that this polygon is invalid (too small number of points)
so it may even be ignored (I don't remember).
But of course if you had a valid polygon like:

Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, {0, 0} } };

There would be no self intersections returned because the polygon is not
self-intersecting.
However if you had a (invalid) Polygons like this:

Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, {0, 0},{ 0, 10 },{
10, 10 },{ 10, 0 },{ 0, 0 } } };
Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, { 10, 10 },{ 0, 10
},{ 0, 0 } } };

you'd get collinear and blocking self-intersection turns respectively.

Regards,
Adam
_______________________________________________
Geometry mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/geometry
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: self intersection doesn't find collinear intersection types

sergei benkovich
Hey Adam,
thank you very much for the response.
my original polygon example was bad.
but, i tried on this polygon :
  Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25, 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 }, { 10, 0 }, { 10, 10 } }};

and all i get is that there are two intersection points, and both are "touch".
and when i ran on your examples i got 4 collinear. 
is it a bug? am i doing something wrong?
much appreciated,
Sergei

On Wed, May 11, 2016 at 1:19 PM, Adam Wulkiewicz <[hidden email]> wrote:
Hi Sergei,

Sergei Benkovich wrote:
Hey,
i have an issue where i find self intersections in a polygon.but it doesn't seem to find the method_collinear type.

this is the piece of code:


  namespace bg = boost::geometry;
  using namespace std;
  typedef bg::model::d2::point_xy<double> point_2d;
  typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;
  Polygon poly;
  poly.outer().push_back(point_2d(0, 10));
  poly.outer().push_back(point_2d(10, 0));


Have in mind that this polygon is invalid (too small number of points) so it may even be ignored (I don't remember).
But of course if you had a valid polygon like:

Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, {0, 0} } };

There would be no self intersections returned because the polygon is not self-intersecting.
However if you had a (invalid) Polygons like this:

Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, {0, 0},{ 0, 10 },{ 10, 10 },{ 10, 0 },{ 0, 0 } } };
Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, { 10, 10 },{ 0, 10 },{ 0, 0 } } };

you'd get collinear and blocking self-intersection turns respectively.

Regards,
Adam
_______________________________________________
Geometry mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/geometry


_______________________________________________
Geometry mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/geometry
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: self intersection doesn't find collinear intersection types

Adam Wulkiewicz
Hi Sergei,

Sergei Benkovich wrote:

> Hey Adam,
> thank you very much for the response.
> my original polygon example was bad.
> but, i tried on this polygon :
>   Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25,
> 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 },
> { 10, 0 }, { 10, 10 } }};
>
> and all i get is that there are two intersection points, and both are
> "touch".
> and when i ran on your examples i got 4 collinear.
> is it a bug? am i doing something wrong?

No, everything is ok. The turns are oriented, so they reflect how
segments interact with each other when the edges of both geometries are
traversed clockwise. The only difference between 2-parameter version and
self-intersection version is that the turns for the same segments are
not generated because they'd all be equal.
So in your example at 2 points the edges touch and later goes in
different ways. For {20, 5} the touch turn is generated with
block/intersection operations, for {25, 5} it's also touch turn but the
operations are intersection/block. It's because if we wanted to
calculate the intersection (a set operation, set product of areas) of
these geometries at point {20,5} we should go to {20, 0}, not to the
{25,5} which is the next point on the edge and at {25,5} it's the opposite.

In this case:
Polygon poly{ { {0, 0},{0, 10}, {10, 10}, {10, 0}, { 10, 10 },{ 0, 10
},{ 0, 0 } } };

4 x (equal, collinear/collinear) turns are generated because if they
were different geometries and we wanted to calculate intersection or
union we could follow any of the edges in both cases.

In my second example:
Polygon poly{ { { 0, 0 },{ 0, 10 },{ 10, 10 },{ 10, 0 },{ 0, 0 },{ 0, 10
},{ 10, 10 },{ 10, 0 },{ 0, 0 } } };

2x (touch, block/block) turns are generated because we shouldn't follow
any of these points if we wanted to calculate union (sum of areas) or
intersection (common areas). The are collinear-opposite so if Polygons
were valid some other turns should be generated besides these, some
union/block or intersection/block so we'd follow them and ignore
block/block ones.

Regards,
Adam


_______________________________________________
Geometry mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/geometry
Loading...