Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.11.2022
Сообщений: 4

Проблема с физической моделью

19.05.2023, 17:37. Показов 1145. Ответов 1

Студворк — интернет-сервис помощи студентам
Написал симулятор математического маятника, скорость которого изначально была привязана к кол-ву кадров в секунду, всё работало отлично, но потом решил сделать привязку именно к времени, и появилась одна проблемка. Если поставить угол на 180 градусов и затухание на 0, то будет вероятность, что маятник провернётся, чего быть не должно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <SFML/Graphics.hpp>
#include <cmath>
#include "imgui.h"
#include "imgui-SFML.h"
#include <vector>
 
using namespace sf;
 
int main()
{
    const int windowWidth = 800;
    const int windowHeight = 600;
    bool simulation = false;
 
    RenderWindow window(VideoMode(windowWidth, windowHeight), "Mathematical Pendulum");
 
    ImGui::SFML::Init(window);
 
    const float g = 9.81;      // ускорение свободного падения
    const float l = 200;       // длина маятника
    float damping = 0.02;      // коэффициент затухания
    float angle = 180;         // начальный угол отклонения
    float angularVelocity = 0; // начальная скорость
 
    CircleShape pendulum(20);
    pendulum.setOrigin(pendulum.getRadius(), 0);
    pendulum.setPosition(windowWidth / 2, windowHeight / 2 + l);
                                                                          //создания маятника и нити
    VertexArray line(Lines, 2);
    line[0].position = Vector2f(windowWidth / 2, windowHeight / 5);
 
    Clock deltaClock, clock;
 
    std::vector<float> angleValues; // Вектор для хранения значений угла
 
    Sprite background;
    Texture back;
    back.loadFromFile("background.png");
    background.setTexture(back);
    while (window.isOpen())
    {
        float deltaTime = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        deltaTime /= 40000;
        Event event;
        while (window.pollEvent(event))
        {
            ImGui::SFML::ProcessEvent(event);
            if (event.type == Event::Closed)
                window.close();
        }
 
        ImGui::SFML::Update(window, deltaClock.restart());
 
        ImGui::Begin("Settings");
 
        if (ImGui::SliderFloat("Angle", &angle, 0, 180))
        {
            angularVelocity = 0;
        }
 
        ImGui::SliderFloat("Damping", &damping, 0, 0.02);
 
        if (ImGui::Button("Start"))
        {
            simulation = true;
        }
 
        ImGui::SameLine();
 
        if (ImGui::Button("Stop"))
        {
            simulation = false;
        }
        ImGui::SameLine();
        if (simulation)
        {
            float angularAcceleration = -g / l * sin(angle * 3.14 / 180) - damping * angularVelocity;    //физ модель маятника
            angularVelocity += angularAcceleration * deltaTime;
            angle += angularVelocity * deltaTime * 180 / 3.14;
            angleValues.push_back(angle);
        }
        if (ImGui::Button("Reset"))
        {
            simulation = false;
            angle = 180;
            angularVelocity = 0;
            angleValues.clear();
        }
 
        ImGui::End();
 
       
        
        float x = l * sin(angle * 3.14 / 180);
        float y = l * cos(angle * 3.14 / 180);
        line[1].position = Vector2f(windowWidth / 2 + x, windowHeight / 5 + y);
        line[1].color = Color::White;
 
        pendulum.setPosition(line[1].position.x, line[1].position.y - 20);
 
        window.clear();
        window.draw(background);
        window.draw(pendulum);
        window.draw(line);
 
        // Рисуем график зависимости угла от времени
        ImGui::Begin("Graph");
        ImGui::PlotLines("Angle and Time", angleValues.data(), angleValues.size(), 0, nullptr, -180, 180, ImVec2(300, 200));
        ImGui::End();
 
        ImGui::SFML::Render(window);
       
        window.display();
    }
 
    ImGui::SFML::Shutdown();
 
    return 0;
}
Видео:
Кликните здесь для просмотра всего текста
https://youtu.be/O1K5ELWiqiM
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2023, 17:37
Ответы с готовыми решениями:

Можно ли считать четырёхмерный кроссворд физической моделью 4-мерного пространства?
Всем заглянувшим - здравствуйте, а откликнувшимся - ещё и большое спасибо! Сделал я как-то на досуге :))) трёхмерный кроссворд...

Проблема с моделью машины
Здравствуйте, загружаю автомобиль из Asset Store и добавляю его на сцену, в итоге текстуры адекватно не отображаются, подскажите, в чём...

Проблема с физической памятью на сервере W2003
Проблема такая. На сервере стоит 8 гб мозгов, 4 планки по 1гб и 2 планки по 2 гб, 4 процессора ксеон 3,20 на сервер поставили W2003...

1
 Аватар для Pphantom
2254 / 1513 / 695
Регистрация: 17.03.2022
Сообщений: 4,841
19.05.2023, 17:48
Лучший ответ Сообщение было отмечено yung96 как решение

Решение

Цитата Сообщение от yung96 Посмотреть сообщение
то будет вероятность, что маятник провернётся, чего быть не должно.
А почему не должно? В реальной жизни это случайные флуктуации начальных условий, в модели - ошибки округления, но эффект в конечном счете тот же.

Так что все работает правильно. Если по каким-то причинам эффект не нужен - надо блокировать проворот явно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.05.2023, 17:48
Помогаю со студенческими работами здесь

Взаимодействие с 3D моделью
Доброго времени суток. Мы проектируем робота (настоящего в железе и микроконтроллерах))). Стоит задача в написании консоли управленияю...

Работа с моделью
Имеется такой вот кусок кода @parent_student = ParentStudent.find_by(parent_id: current_parent.id).student_id if...

Окно с 3D-моделью
здравствуйте. необходимо написать программу рисующую 3д модель. никакие библиотеки использовать нельзя, кроме стандартной...

Работа с моделью User
Должно быть 4 вида пользователя: Администратор, диспетчер, юр. лицо - используют стандартную систему авторизации и аутентификации...

Работа с DOM- моделью
День добрый! Есть форма: Нужно программно нажать на кнопку &quot;Заполнено&quot;, а потом далее. Наставьте на путь истинный пожалуйста! ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru