MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ generate_ellipse()

std::vector< glm::vec3 > MayaFlux::Kinesis::generate_ellipse ( const glm::vec3 &  center,
float  semi_major,
float  semi_minor,
size_t  segments,
const glm::vec3 &  normal = glm::vec3(0, 0, 1) 
)

Generate vertices along an elliptical path.

Parameters
centerEllipse center
semi_majorSemi-major axis length
semi_minorSemi-minor axis length
segmentsNumber of subdivisions
normalEllipse plane normal
Returns
Vertices generated by eccentric anomaly

Definition at line 60 of file GeometryPrimitives.cpp.

66{
67 if (segments < 3) {
68 segments = 3;
69 }
70
71 std::vector<glm::vec3> vertices;
72 vertices.reserve(segments + 1);
73
74 glm::vec3 n = glm::normalize(normal);
75 glm::vec3 u;
76
77 if (std::abs(n.z) < 0.9F) {
78 u = glm::normalize(glm::cross(n, glm::vec3(0, 0, 1)));
79 } else {
80 u = glm::normalize(glm::cross(n, glm::vec3(1, 0, 0)));
81 }
82
83 glm::vec3 v = glm::cross(n, u);
84
85 float angle_step = glm::two_pi<float>() / static_cast<float>(segments);
86
87 for (size_t i = 0; i <= segments; ++i) {
88 float angle = static_cast<float>(i) * angle_step;
89 float cos_a = std::cos(angle);
90 float sin_a = std::sin(angle);
91
92 glm::vec3 position = center + semi_major * cos_a * u + semi_minor * sin_a * v;
93
94 vertices.push_back(position);
95 }
96
97 return vertices;
98}
glm::vec3 position

References position.