src/ldrawalgorithm.h

changeset 232
8efa3a33172e
parent 206
654661eab7f3
child 250
2837b549e616
equal deleted inserted replaced
231:a9bf6bab5ea2 232:8efa3a33172e
17 17
18 /* 18 /*
19 void makeUnofficial(ModelEditor &editor); 19 void makeUnofficial(ModelEditor &editor);
20 */ 20 */
21 21
22 constexpr float circleAngle(int divisions, int i)
23 {
24 constexpr float ofs = 0.5 * pi<>;
25 float factor = -2.0f * pi<> / divisions;
26 return i * factor + ofs;
27 }
28
29 constexpr glm::vec2 rimpoint(int divisions, int i)
30 {
31 const float angle = circleAngle(divisions, i);
32 return glm::vec2{std::sin(angle), std::cos(angle)};
33 }
34
35 template<typename Fn>
36 void circleAngles(int segments, int divisions, Fn&& fn)
37 {
38 for (int i = 0; i < segments; i += 1)
39 {
40 const float a1 = circleAngle(divisions, i - 1);
41 const float a2 = circleAngle(divisions, i);
42 const float a3 = circleAngle(divisions, i + 1);
43 fn(a1, a2, a3);
44 }
45 }
46
22 template<typename Fn> 47 template<typename Fn>
23 void circle(int segments, int divisions, Fn&& fn) 48 void circle(int segments, int divisions, Fn&& fn)
24 { 49 {
25 float factor = 2.0f * pi<> / divisions; 50 circleAngles(segments, divisions, [&fn](
26 for (int i = 0; i < segments; i += 1) 51 const float a1,
27 { 52 const float a2,
53 const float a3
54 ){
28 fn( 55 fn(
29 glm::vec2{std::sin((i - 1) * factor), std::cos((i - 1) * factor)}, 56 glm::vec2{std::sin(a1), std::cos(a1)},
30 glm::vec2{std::sin(i * factor), std::cos(i * factor)}, 57 glm::vec2{std::sin(a2), std::cos(a2)},
31 glm::vec2{std::sin((i + 1) * factor), std::cos((i - 1) * factor)} 58 glm::vec2{std::sin(a3), std::cos(a3)}
32 ); 59 );
33 } 60 });
34 } 61 }
35 } 62 }
36 63
37 ModelElement inverted(const ModelElement &element); 64 ModelElement inverted(const ModelElement &element);

mercurial