#3876 Add reference to Shoelace formula for counter clockwise polygon test.

This commit is contained in:
Gaute Lindkvist 2018-12-21 09:44:11 +01:00
parent 9fdec77c94
commit b1b278fffc

View File

@ -281,14 +281,15 @@ std::vector<caf::ContourLines::ClosedPolygons> caf::ContourLines::create(const s
closedPolygonDeque.push_back(closedPolygonDeque.front()); closedPolygonDeque.push_back(closedPolygonDeque.front());
} }
// Make sure it is counter clockwise // Make sure it is counter clockwise. Use Shoelace formula to calculate signed area.
double sum = 0.0; // https://en.wikipedia.org/wiki/Shoelace_formula
double signedArea = 0.0;
for (size_t j = 0; j < closedPolygonDeque.size() - 1; ++j) for (size_t j = 0; j < closedPolygonDeque.size() - 1; ++j)
{ {
sum += (closedPolygonDeque[j + 1].x() - closedPolygonDeque[j].x()) * signedArea += (closedPolygonDeque[j + 1].x() - closedPolygonDeque[j].x()) *
(closedPolygonDeque[j + 1].y() + closedPolygonDeque[j].y()); (closedPolygonDeque[j + 1].y() + closedPolygonDeque[j].y());
} }
if (sum < 0.0) if (signedArea < 0.0)
{ {
closedPolygonsPerLevel[i].emplace_back(closedPolygonDeque.rbegin(), closedPolygonDeque.rend()); closedPolygonsPerLevel[i].emplace_back(closedPolygonDeque.rbegin(), closedPolygonDeque.rend());
} }