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