diff -r c1ff4f107569 -r 24590af32ad6 src/geometry.cpp --- a/src/geometry.cpp Sat Mar 05 15:40:43 2022 +0200 +++ b/src/geometry.cpp Sat Mar 05 16:57:28 2022 +0200 @@ -217,3 +217,21 @@ return glm::dot(crosses[0], vector) < 1e-6; }); } + +/** + * @brief Determines the winding of a 2d polygon + * @param polygon + * @return winding + */ +Winding geom::winding(const QPolygonF &polygon) +{ + // based on https://stackoverflow.com/a/1165943 + double sum = 0.0; + for (int i = 0; i < polygon.size(); i += 1) + { + const QPointF& p1 = polygon[i]; + const QPointF& p2 = polygon[(i + 1) % polygon.size()]; + sum += (p2.x() - p1.x()) * (p2.y() + p1.y()); + } + return (sum < 0) ? Winding::Anticlockwise : Winding::Clockwise; +}