@@ -2812,12 +2812,23 @@ namespace olc::utils::geom2d
28122812 {
28132813 polygon<T> returnPolygon;
28142814
2815+ // Less than three points so return empty polygpon
2816+ if (points.size () < 3 )
2817+ {
2818+ return returnPolygon;
2819+ }
2820+
28152821 std::vector<size_t > indexList;
28162822
2823+ float area = 0.0 ;
2824+
28172825 for (size_t i = 0 ; i < points.size (); i++)
28182826 {
28192827 indexList.push_back (i);
28202828 returnPolygon.pos .push_back (points[i]);
2829+ size_t j = (i + 1 ) % points.size ();
2830+ area += points[i].x * points[j].y - points[j].x * points[i].y ;
2831+
28212832 line<T> edge;
28222833
28232834 if (i == points.size () - 1 )
@@ -2834,6 +2845,12 @@ namespace olc::utils::geom2d
28342845 returnPolygon.edges .push_back (edge);
28352846 }
28362847
2848+ if (area < 0 .0f )
2849+ {
2850+ std::reverse (returnPolygon.pos .begin (), returnPolygon.pos .end ());
2851+ std::reverse (returnPolygon.edges .begin (), returnPolygon.edges .end ());
2852+ }
2853+
28372854 while (indexList.size () > 3 )
28382855 {
28392856 for (size_t i = 0 ; i < indexList.size (); i++)
@@ -2843,12 +2860,12 @@ namespace olc::utils::geom2d
28432860 size_t c = indexList[i == indexList.size () - 1 ? 0 : i + 1 ];
28442861
28452862 triangle<T> thisTriangle;
2846- thisTriangle.pos [0 ] = points [a];
2847- thisTriangle.pos [1 ] = points [b];
2848- thisTriangle.pos [2 ] = points [c];
2863+ thisTriangle.pos [0 ] = returnPolygon. pos [a];
2864+ thisTriangle.pos [1 ] = returnPolygon. pos [b];
2865+ thisTriangle.pos [2 ] = returnPolygon. pos [c];
28492866
2850- olc::v_2d<T> pb_pa = points [b] - points [a];
2851- olc::v_2d<T> pc_pa = points [c] - points [a];
2867+ olc::v_2d<T> pb_pa = returnPolygon. pos [b] - returnPolygon. pos [a];
2868+ olc::v_2d<T> pc_pa = returnPolygon. pos [c] - returnPolygon. pos [a];
28522869
28532870 if (pb_pa.cross (pc_pa) > 0 .0f )
28542871 {
@@ -2857,14 +2874,14 @@ namespace olc::utils::geom2d
28572874
28582875 bool isEar = true ;
28592876
2860- for (size_t j = 0 ; j < points .size (); j++)
2877+ for (size_t j = 0 ; j < returnPolygon. pos .size (); j++)
28612878 {
28622879 if (j == a || j == b || j == c)
28632880 {
28642881 continue ;
28652882 }
28662883
2867- if (contains (thisTriangle, points [j]) == true )
2884+ if (contains (thisTriangle, returnPolygon. pos [j]) == true )
28682885 {
28692886 isEar = false ;
28702887 break ;
@@ -2882,9 +2899,9 @@ namespace olc::utils::geom2d
28822899 }
28832900
28842901 triangle<T> lastTriangle;
2885- lastTriangle.pos [0 ] = points [indexList[0 ]];
2886- lastTriangle.pos [1 ] = points [indexList[1 ]];
2887- lastTriangle.pos [2 ] = points [indexList[2 ]];
2902+ lastTriangle.pos [0 ] = returnPolygon. pos [indexList[0 ]];
2903+ lastTriangle.pos [1 ] = returnPolygon. pos [indexList[1 ]];
2904+ lastTriangle.pos [2 ] = returnPolygon. pos [indexList[2 ]];
28882905
28892906 returnPolygon.triangles .push_back (lastTriangle);
28902907
0 commit comments