Технологии

#include const double G = 6.67430e-11; class GravitySource { sf::Vector2f pos; float strength; float mass; - вопрос №5156118

sf::CircleShape s; public: GravitySource(float mass, float pos_x, float pos_y) { this-> mass=mass; pos.x = pos_x; pos.y = pos_y; s.setPosition(pos); s.setFillColor(sf::Color::Yellow); s.setRadius(10); } void render(sf::RenderWindow& wind) { wind.draw(s); } sf::Vector2f get_pos() { return pos; } float get_mass() const { return mass; } }; class Planets { sf::Vector2f pos1; sf::Vector2f pos2; sf::Vector2f vel1; sf::Vector2f vel2; sf::CircleShape s1; sf::CircleShape s2; float mass1; float mass2; public: Planets(float mass1, float mass2, float pos1_x, float pos1_y, float pos2_x, float pos2_y, float vel1_x, float vel1_y, float vel2_x, float vel2_y) { this->mass1= mass1; pos1.x = pos1_x; pos1.y = pos1_y; vel1.x = vel1_x; vel1.y = vel1_y; this->mass2= mass2; pos2.x = pos2_x; pos2.y = pos2_y; vel2.x = vel2_x; vel2.y = vel2_y; s1.setPosition(pos1); s1.setFillColor(sf::Color::White); s1.setRadius(8); s2.setPosition(pos2); s2.setFillColor(sf::Color::Magenta); s2.setRadius(4); } void render(sf::RenderWindow& wind) { s1.setPosition(pos1); wind.draw(s1); s2.setPosition(pos2); wind.draw(s2); } // Функция для расчета сил, действующих на каждую из планет void update_physics(GravitySource& s, double x, double y, double dt) { float distance1_x = s.get_pos().x — pos1.x; float distance1_y = s.get_pos().y — pos1.y; float distance1 = sqrt(distance1_x * distance1_x + distance1_y * distance1_y); float distance2_x = s.get_pos().x — pos2.x; float distance2_y = s.get_pos().y — pos2.y; float distance2 = sqrt(distance2_x * distance2_x + distance2_y * distance2_y); float distance = sqrt(pow((pos1.x — pos2.x), 2) + pow((pos1.y — pos2.y), 2)); double force1 = G * mass1 * mass2 / pow(distance, 2) — G * mass1 * s.get_mass() / pow(distance1, 2); double force2 = — G * mass1 * mass2 / pow(distance, 2) + G * mass2 * s.get_mass() / pow(distance2, 2); double force1_x = force1 * (pos1.x — x) / distance1; // Проекции силы на оси координат double force1_y = force1 * (pos1.y — y) / distance1; double force2_x = force2 * (pos2.x — x) / distance2; // Проекции силы на оси координат double force2_y = force2 * (pos2.y — y) / distance2; vel1.x += force1_x / mass1; // Изменение скорости планеты 1 vel1.y += force1_y / mass1; vel2.x += force2_x / mass2; // Изменение скорости планеты 2 vel2.y += force2_y / mass2; pos1.x += vel1.x * dt; // Изменение положения планеты 1 pos1.y += vel1.y * dt; pos2.x += vel2.x * dt; // Изменение положения планеты 2 pos2.y += vel2.y * dt; } }; int main() { sf::RenderWindow window(sf::VideoMode(1600, 1000), «Program»); window.setFramerateLimit(60); GravitySource source(1.98e30, 800, 500); Planets planetstwo(5.97e24, 5.97e23, 800, 600, 1000, 1000, 4, 2, 0, 0); double dt = 0.0001; while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) window.close(); } window.clear(); planetstwo.update_physics(source, 800, 500, dt); // Вычисляем ускорения и скорости планет и Обновляем положения планет по методу Эйлера planetstwo.render(window); source.render(window); window.display(); } return 0; } В этой программе у меня почему-то не отображаются планеты на экране

май 13, 2023 г.

  • Всего ответов: 0

Похожие вопросы