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

◆ generate_circle()

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

Generate vertices along a circular path.

Parameters
centerCircle center in 3D space
radiusCircle radius
segmentsNumber of subdivisions (must be >= 3)
normalCircle plane normal (default: XY plane, Z-up)
Returns
Vertices generated by angle θ ∈ [0, 2π)

Generates N+1 vertices where last vertex equals first (closed curve). For LINE_STRIP topology. For POINT_LIST, use N vertices.

Definition at line 21 of file GeometryPrimitives.cpp.

26{
27 if (segments < 3) {
28 segments = 3;
29 }
30
31 std::vector<glm::vec3> vertices;
32 vertices.reserve(segments + 1);
33
34 glm::vec3 n = glm::normalize(normal);
35 glm::vec3 u;
36
37 if (std::abs(n.z) < 0.9F) {
38 u = glm::normalize(glm::cross(n, glm::vec3(0, 0, 1)));
39 } else {
40 u = glm::normalize(glm::cross(n, glm::vec3(1, 0, 0)));
41 }
42
43 glm::vec3 v = glm::cross(n, u);
44
45 float angle_step = glm::two_pi<float>() / static_cast<float>(segments);
46
47 for (size_t i = 0; i <= segments; ++i) {
48 float angle = static_cast<float>(i) * angle_step;
49 float cos_a = std::cos(angle);
50 float sin_a = std::sin(angle);
51
52 glm::vec3 position = center + radius * (cos_a * u + sin_a * v);
53
54 vertices.push_back(position);
55 }
56
57 return vertices;
58}
Range radius
glm::vec3 position

References position, and radius.