diff -r a9bf6bab5ea2 -r 8efa3a33172e src/ldrawalgorithm.h --- a/src/ldrawalgorithm.h Wed Jun 15 19:47:02 2022 +0300 +++ b/src/ldrawalgorithm.h Mon Jun 20 02:04:51 2022 +0300 @@ -19,18 +19,45 @@ void makeUnofficial(ModelEditor &editor); */ + constexpr float circleAngle(int divisions, int i) + { + constexpr float ofs = 0.5 * pi<>; + float factor = -2.0f * pi<> / divisions; + return i * factor + ofs; + } + + constexpr glm::vec2 rimpoint(int divisions, int i) + { + const float angle = circleAngle(divisions, i); + return glm::vec2{std::sin(angle), std::cos(angle)}; + } + + template + void circleAngles(int segments, int divisions, Fn&& fn) + { + for (int i = 0; i < segments; i += 1) + { + const float a1 = circleAngle(divisions, i - 1); + const float a2 = circleAngle(divisions, i); + const float a3 = circleAngle(divisions, i + 1); + fn(a1, a2, a3); + } + } + template void circle(int segments, int divisions, Fn&& fn) { - float factor = 2.0f * pi<> / divisions; - for (int i = 0; i < segments; i += 1) - { + circleAngles(segments, divisions, [&fn]( + const float a1, + const float a2, + const float a3 + ){ fn( - glm::vec2{std::sin((i - 1) * factor), std::cos((i - 1) * factor)}, - glm::vec2{std::sin(i * factor), std::cos(i * factor)}, - glm::vec2{std::sin((i + 1) * factor), std::cos((i - 1) * factor)} + glm::vec2{std::sin(a1), std::cos(a1)}, + glm::vec2{std::sin(a2), std::cos(a2)}, + glm::vec2{std::sin(a3), std::cos(a3)} ); - } + }); } }