Skip to content

Commit

Permalink
add torus to generator
Browse files Browse the repository at this point in the history
  • Loading branch information
gramosomi committed Mar 4, 2024
1 parent f965944 commit b32fe46
Show file tree
Hide file tree
Showing 4 changed files with 698 additions and 0 deletions.
12 changes: 12 additions & 0 deletions generator/include/shapes/torus.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef SOLAR_SYSTEM_TORUS_HPP
#define SOLAR_SYSTEM_TORUS_HPP

#include <string>
#include <vector>

#include "../utils.hpp"

bool generateTorus(float majorRadius, float minorRadius, int sides, int rings,
const char* filepath);

#endif // SOLAR_SYSTEM_TORUS_HPP
10 changes: 10 additions & 0 deletions generator/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "../include/shapes/cube.hpp"
#include "../include/shapes/plane.hpp"
#include "../include/shapes/sphere.hpp"
#include "../include/shapes/torus.hpp"

void generateFigure(int argc, char* argv[]) {
if (argc < 5) {
Expand Down Expand Up @@ -48,6 +49,15 @@ void generateFigure(int argc, char* argv[]) {

generateCone(radius, height, slices, stacks, figureType);

} else if (figureName == "torus" && argc == 7) {
// Generate Torus
std::cout << "Generating Torus\n";
float innerRadius = std::stof(argv[2]);
float outerRadius = std::stof(argv[3]);
int slices = std::stoi(argv[4]);
int stacks = std::stoi(argv[5]);

generateTorus(innerRadius, outerRadius, slices, stacks, figureType);
} else {
std::cerr << "Invalid arguments\n";
}
Expand Down
76 changes: 76 additions & 0 deletions generator/src/shapes/torus.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include <cmath>
#include <fstream>
#include <iostream>
#include <vector>

#include "utils.hpp"

std::vector<Point> torusTriangles(float majorRadius, float minorRadius,
int sides, int rings) {
std::vector<Point> points;

for (int i = 0; i < rings; ++i) {
float theta1 = static_cast<float>(i) * 2.0f * static_cast<float>(M_PI) /
static_cast<float>(rings);
float theta2 = static_cast<float>(i + 1) * 2.0f * static_cast<float>(M_PI) /
static_cast<float>(rings);

for (int j = 0; j < sides; ++j) {
float phi1 = static_cast<float>(j) * 2.0f * static_cast<float>(M_PI) /
static_cast<float>(sides);
float phi2 = static_cast<float>(j + 1) * 2.0f * static_cast<float>(M_PI) /
static_cast<float>(sides);

// Vertices
float x1 =
(majorRadius + minorRadius * std::cos(phi1)) * std::cos(theta1);
float y1 = minorRadius * std::sin(phi1);
float z1 =
(majorRadius + minorRadius * std::cos(phi1)) * std::sin(theta1);

float x2 =
(majorRadius + minorRadius * std::cos(phi2)) * std::cos(theta1);
float y2 = minorRadius * std::sin(phi2);
float z2 =
(majorRadius + minorRadius * std::cos(phi2)) * std::sin(theta1);

float x3 =
(majorRadius + minorRadius * std::cos(phi1)) * std::cos(theta2);
float y3 = minorRadius * std::sin(phi1);
float z3 =
(majorRadius + minorRadius * std::cos(phi1)) * std::sin(theta2);

float x4 =
(majorRadius + minorRadius * std::cos(phi2)) * std::cos(theta2);
float y4 = minorRadius * std::sin(phi2);
float z4 =
(majorRadius + minorRadius * std::cos(phi2)) * std::sin(theta2);

// Push vertices in counter-clockwise order
points.push_back(Point(x1, y1, z1));
points.push_back(Point(x2, y2, z2));
points.push_back(Point(x4, y4, z4));

points.push_back(Point(x1, y1, z1));
points.push_back(Point(x4, y4, z4));
points.push_back(Point(x3, y3, z3));
}
}

return points;
}

bool generateTorus(float majorRadius, float minorRadius, int sides, int rings,
const char* filepath) {
std::vector<Point> triangles =
torusTriangles(majorRadius, minorRadius, sides, rings);

if (triangles.empty()) {
std::cerr << "Error: Empty vector of triangles.\n";
return false;
}

saveToFile(triangles, filepath);

return true;
}
Loading

0 comments on commit b32fe46

Please sign in to comment.