#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.05.23
0 ответов
Ответов пока нет

Глеб Черняк

от 55 p.
Читать ответы

Олег Николаевич

от 50 p.
Читать ответы

Alexander

от 500 p.
Читать ответы
Посмотреть всех экспертов из раздела Технологии
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store