GeneralPolygon::operator list<TPPLPoly>() { auto isPolygonOutside = [&](const Contour &referencePolygon, const Contour &poly) { for(unsigned int p=0; p < referencePolygon.size() ; ++p) if( !_evenOddRuleAlgorithm( referencePolygon[p], poly) ) return true; return false; }; list<TPPLPoly> polys; for(unsigned int c=0; c < _contours.size() ; ++c) { const Contour &contour = _contours[c]; TPPLPoly poly; poly.Init(contour.size()); for(unsigned int v=0; v < contour.size() ; ++v) { TPPLPoint point; point.x = contour[v].x; point.y = contour[v].y; poly[v] = point; } // BE CAREFULL!!! not really correct because the polygon could be concave then // the center of mass could not be inside the polygon sf::Vector2f centerOfMass(0.0f, 0.0f); for(unsigned int i=0; i < contour.size() ; ++i) centerOfMass += contour[i]; centerOfMass *= (1.0f/contour.size()); std::vector<Contour> outsideContours; for(unsigned int i=0; i < _contours.size() ; ++i) { if( i == c ) { outsideContours.push_back(_contours[i]); continue; } if( isPolygonOutside(_contours[i], contour) ) outsideContours.push_back(_contours[i]); } // first test if is a hole or not if( !_evenOddRuleAlgorithm( centerOfMass, outsideContours ) ) poly.SetHole(true); else poly.SetHole(false); // if it is a hole then it must be in CW order to the algorithm to recognize // else must be in CCW if( poly.IsHole() ) poly.SetOrientation(TPPL_CW);// Hole orientation (needed in the algorithm) else poly.SetOrientation(TPPL_CCW);// Not a hole orientation (needed in the algorithm) polys.push_back(poly); } return polys; }