
Geometry : 
Subject: Re: [geometry] union gives an empty multipolygon
From: Barend Gehrels (barend_at_[hidden])
Date: 20121227 11:48:41
Hi Romain,
Welcome to the list.
On 27122012 15:11, Romain Texier wrote:
> Hi,
>
> I want to make real time union and clipping of many polygons.
> I have tried the clipper library and I would like to try the boost
> geometry library.
>
> But I have a problem: The union of two triangles is an empty
> multipolygon.
> Could you help me ?
>
>
> typedef boost::geometry::model::d2::point_xy<float> BoostPoint;
> typedef boost::geometry::model::polygon<BoostPoint,false>
> BoostPolygon; //false because my triangles are counterclockwise.
> typedef boost::geometry::model::multi_polygon< BoostPolygon >
> BoostPolygons;
I did not (yet) test the code, because I don't have the definitions of
your triangles, but I'm pretty sure that your polygons are not closed.
You defined them counterclockwise, but you should also define them as
"open" if you want them to use this way. So the definition should be
BoostPoint, false, false>.
See also this link:
http://www.boost.org/doc/libs/1_52_0/libs/geometry/doc/html/geometry/reference/models/model_polygon.html
>
> void BoostShape::createNewPoly(Triangle2D const & NewTriangle,
> BoostPolygons& p_InOutPolygon)
> {
> model::ring<BoostPoint,false> outerRingTriangle;
> outerRingTriangle.push_back(BoostPoint(NewTriangle.m_Vertex0.X,NewTriangle.m_Vertex0.Y));
> outerRingTriangle.push_back(BoostPoint(NewTriangle.m_Vertex1.X,NewTriangle.m_Vertex1.Y));
> outerRingTriangle.push_back(BoostPoint(NewTriangle.m_Vertex2.X,NewTriangle.m_Vertex2.Y));
>
What also helps is calling boost::geometry::correct (which would close
them in this code).
HTH, Barend
Geometry list run by mateusz at loskot.net