#include #include #include #include #include const int windowWidth = 800; const int windowHeight = 600; struct Ball { float x, y, z; float vx, vy, vz; float r, g, b; }; // Ustawienia rzutu ukośnego dla każdej kuli (kąt startowy, prędkość początkowa) std::vector balls; void initializeBalls() { for (int i = 0; i < 10; ++i) { float angle = 15 + i * 6; // Kąty między 15 a 75 stopni float speed = 10 + i; // Prędkości początkowe Ball ball = {0, 0, 0, speed * cos(angle * M_PI / 180.0f), speed * sin(angle * M_PI / 180.0f), 0, (float)rand()/RAND_MAX, (float)rand()/RAND_MAX, (float)rand()/RAND_MAX}; balls.push_back(ball); } } // Funkcja do integracji Rungego-Kutty void rungeKuttaStep(Ball &ball, float dt) { float k1vx = -0.1f * ball.vx; float k1vy = -9.8f - 0.1f * ball.vy; float k2vx = -0.1f * (ball.vx + 0.5f * dt * k1vx); float k2vy = -9.8f - 0.1f * (ball.vy + 0.5f * dt * k1vy); float k3vx = -0.1f * (ball.vx + 0.5f * dt * k2vx); float k3vy = -9.8f - 0.1f * (ball.vy + 0.5f * dt * k2vy); float k4vx = -0.1f * (ball.vx + dt * k3vx); float k4vy = -9.8f - 0.1f * (ball.vy + dt * k3vy); ball.vx += (dt / 6.0f) * (k1vx + 2.0f * k2vx + 2.0f * k3vx + k4vx); ball.vy += (dt / 6.0f) * (k1vy + 2.0f * k2vy + 2.0f * k3vy + k4vy); ball.x += ball.vx * dt; ball.y += ball.vy * dt; } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0, 5, 20, 0, 0, 0, 0, 1, 0); for (const auto &ball : balls) { glPushMatrix(); glTranslatef(ball.x, ball.y, ball.z); glColor3f(ball.r, ball.g, ball.b); glutSolidSphere(0.5, 20, 20); glPopMatrix(); } } void update() { float dt = 0.01f; for (auto &ball : balls) { rungeKuttaStep(ball, dt); } } void setupOpenGL() { glEnable(GL_DEPTH_TEST); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); } int main() { if (!glfwInit()) { std::cerr << "Failed to initialize GLFW" << std::endl; return -1; } GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, "Animacja 10 kul - Rzut ukośny", nullptr, nullptr); if (!window) { std::cerr << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cerr << "Failed to initialize GLEW" << std::endl; return -1; } initializeBalls(); setupOpenGL(); while (!glfwWindowShouldClose(window)) { display(); update(); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; }