#pragma once #include "shape.h" #include // Figura: Cubo 3D rotante // Distribución: // - 1-8 pelotas: Solo vértices (8 puntos) // - 9-26 pelotas: Vértices + centros de caras + centros de aristas (26 puntos) // - 27+ pelotas: Grid volumétrico 3D uniforme // Comportamiento: Rotación simultánea en ejes X, Y, Z (efecto Rubik) class CubeShape : public Shape { private: float angle_x_ = 0.0f; // Ángulo de rotación en eje X (rad) float angle_y_ = 0.0f; // Ángulo de rotación en eje Y (rad) float angle_z_ = 0.0f; // Ángulo de rotación en eje Z (rad) float size_ = 0.0f; // Mitad del lado del cubo (píxeles) int num_points_ = 0; // Cantidad de puntos generados // Posiciones base 3D (sin rotar) - se calculan en generatePoints() std::vector base_x_; std::vector base_y_; std::vector base_z_; public: void generatePoints(int num_points, float screen_width, float screen_height) override; void update(float delta_time, float screen_width, float screen_height) override; void getPoint3D(int index, float& x, float& y, float& z) const override; const char* getName() const override { return "CUBE"; } float getScaleFactor(float screen_height) const override; private: // Métodos auxiliares para distribución de puntos void generateVertices(); // 8 vértices void generateVerticesAndCenters(); // 26 puntos (vértices + caras + aristas) void generateVolumetricGrid(); // Grid 3D para muchas pelotas };