2026. június 10., szerda

C++-ban a naprendszer szimuláció

Ez a program egy 2D-s Naprendszer-szimulációt rajzol ki és futtat le, amelyben 8 bolygó kering a sárga színű Nap körül, miközben a külső bolygó körül egy kis hold is látható.A látvány és a program működése a következő főbb elemekből áll:Ablakméret és háttér: Egy \(858 \times 858\) pixel méretű ablak nyílik meg, fekete háttérrel.A Nap: A képernyő pontos közepén \((429, 429)\) egy sárga színű kör \((r = 30)\) helyezkedik el.Bolygók: A nap körül 8 különböző színű és méretű bolygó kering saját sugarú pályán (a Merkúrtól a Neptunusz jellegéig) a következő tulajdonságokkal:Különböző sugarú pályákon és sebességgel mozognak (a belső bolygók gyorsabban, a külsők lassabban).Méretük és színük egyedi (pl. a Jupiter barna, a Neptunusz kék).Hold: A legkülső bolygóhoz (a nyolcadikhoz, ami szintén kék színű) hozzá van kötve egy apró fehér hold, amely a bolygó körül kering.(Megjegyzés: A kód végén az ablakot frissítő window.clear(), window.draw() és window.display() hívások hiányoznak, így az ablak megnyílna, de a bolygók nem mozognának, vagy lefagynának. 
Telepitsd az SFML-t ; sudo apt-get install libsfml-dev

program futtatása;

#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>

const double PI = std::acos(-1.0);

struct Planet {
    sf::CircleShape shape;
    double radius;
    double speed;
    double inclination;
    double angleInc;
    double currentAngle;
};

int main() {
    sf::RenderWindow window(sf::VideoMode(858, 858), "Orbit Simulation");
    window.setFramerateLimit(60);

    sf::CircleShape sun(30.f);
    sun.setFillColor(sf::Color::Yellow);
    sun.setOrigin(30.f, 30.f);
    sun.setPosition(429.f, 429.f);

    std::vector<Planet> planets = {
        {sf::CircleShape(12.f), 45.0, 0.47, 35.0, 35.0, 0.0},
        {sf::CircleShape(20.f), 72.0, 0.35, 42.0, 42.0, 0.0},
        {sf::CircleShape(24.f), 108.0, 0.30, 78.0, 78.0, 0.0},
        {sf::CircleShape(15.f), 144.0, 0.24, 84.0, 84.0, 0.0},
        {sf::CircleShape(35.f), 198.0, 0.13, 98.0, 98.0, 0.0},
        {sf::CircleShape(28.f), 252.0, 0.10, 52.0, 52.0, 0.0},
        {sf::CircleShape(8.f),  306.0, 0.07, 76.0, 76.0, 0.0},
        {sf::CircleShape(8.f),  360.0, 0.05, 360.0, 360.0, 0.0}
    };

    // Színek beállítása
    sf::Color colors[] = {sf::Color(128, 128, 128), sf::Color(255, 165, 0), sf::Color::Blue,
                          sf::Color::Red, sf::Color::SaddleBrown, sf::Color::Yellow, 
                          sf::Color::Cyan, sf::Color::Blue};

    for (size_t i = 0; i < planets.size(); ++i) {
        planets[i].shape.setFillColor(colors[i]);
        planets[i].shape.setOrigin(planets[i].shape.getRadius(), planets[i].shape.getRadius());
    }

    sf::CircleShape moon(3.f);
    moon.setFillColor(sf::Color::White);
    moon.setOrigin(3.f, 3.f);
    double moonAngle = 0;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        // Logika
        for (auto& p : planets) {
            p.currentAngle += p.speed;
            double rad = p.currentAngle * (PI / 180.0);
            double incRad = p.inclination * (PI / 180.0);

            double x = p.radius * std::cos(rad);
            double y = p.radius * std::sin(rad);

            double screenX = x - y * 0.5;
            double screenY = y * std::cos(incRad) * std::sin(incRad) + (x + y * std::cos(incRad) * 0.866) * 0.5;

            p.shape.setPosition(429.f + screenX, 429.f + screenY);
        }

        // Hold pozíció (3. bolygóhoz, azaz az index 2-höz csatolva)
        moonAngle += 0.5;
        moon.setPosition(planets[2].shape.getPosition().x + 15 * std::cos(moonAngle * (PI / 180.0)),
                         planets[2].shape.getPosition().y + 15 * std::sin(moonAngle * (PI / 180.0)));

        // Renderelés
        window.clear(sf::Color::Black);
        window.draw(sun);
        for (const auto& p : planets) {
            window.draw(p.shape);
        }
        window.draw(moon);
        window.display();
    }

    return 0;
}

------------------
Nekem futott!

Nincsenek megjegyzések:

Megjegyzés küldése