src/ldrawalgorithm.h

changeset 232
8efa3a33172e
parent 206
654661eab7f3
child 250
2837b549e616
--- 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<typename Fn>
+	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<typename Fn>
 	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)}
 			);
-		}
+		});
 	}
 }
 

mercurial