Skip to content

Commit 89920b4

Browse files
committed
Returns an empty polygon if there are not enough points
Points can be CCW or CW
1 parent 01eb6fd commit 89920b4

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

olcUTIL_Geometry2D.h

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)