Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2021, 16:29   #1
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию Проблема в броуновском движении молекул C++

Задание: Моделирование броуновского движения молекулы на двумерном поле
произвольной размерности. Смоделировать движение молекулы по законам физики.

Проблема: Молекулы постоянно летят из правого нижнего угла окна в левый верхний. Подскажите, пожалуйста, как исправить. Любые замечания приветствуются. Спасибо!


Код:
Код:
#define _USE_MATH_DEFINES
#include <GL/glut.h>
#include <vector>
#include <cstdlib>
#include <cmath>
using namespace std;
 
const float DT = 0.01;
 
struct P
{
    float x;
    float y;
    float vx;
    float vy;
    float m;
};
 
vector<P> p;
 
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    for (vector<P>::iterator i = p.begin(); i != p.end(); ++i)
    {
        if (i->m <= 2)
        {
            glPointSize(2);
            glBegin(GL_POINTS);
            glVertex2f(i->x, i->y);
            glEnd();
        }
        else
        {
            glBegin(GL_LINES);
            for (int a = 0; a < 36; ++a)
            {
                float x = i->m * cos(a * M_PI / 18);
                float y = i->m * sin(a * M_PI / 18);
                glVertex2f(i->x + x, i->y + y);
                x = i->m * cos((a + 1) * M_PI / 18);
                y = i->m * sin((a + 1) * M_PI / 18);
                glVertex2f(i->x + x, i->y + y);
            }
            glEnd();
        }
    }
    glutSwapBuffers();
}
 
void timer(int = 0)
{
 
   
    for (vector<P>::iterator i = p.begin(); i != p.end(); ++i)
        for (vector<P>::iterator j = p.begin(); j != p.end(); ++j)
            if (i != j)
            {
                float d = sqrt((i->x - j->x) * (i->x - j->x) + (i->y - j->y) * (i->y - j->y));
                if (d < i->m + j->m)
                {
                    float f = 50*(i->m + j->m - d);
                    i->vx += f * (i->x - j->x) / d / i->m * DT;
                    i->vy += f * (i->y - j->y) / d / i->m * DT;
                    j->vx -= f * (i->x - j->x) / d / j->m * DT;
                    j->vy -= f * (i->y - j->y) / d / j->m * DT;
                }
            }
    for (vector<P>::iterator i = p.begin(); i != p.end(); ++i)
    {
        i->x += i->vx * DT;
        i->y += i->vy * DT;
        if (i->x < 0)
            i->x += 480;
        if (i->y < 0)
            i->y += 480;
        if (i->x > 480)
            i->x -= 480;
        if (i->y > 480)
            i->y -= 480;
    }
    display();
    glutTimerFunc(10, timer, 0);
}
 
int main(int argc, char** argv)
{
    P p0 = { 480 / 2, 480 / 2, 0, 0, 40 };
    p.push_back(p0);
    for (int i = 0; i < 100; ++i)
    {
        P p0 = { rand() % 480, rand() % 480, rand() % 100000 / 500.0 - 100, rand() % 100000 / 500.0 - 100, 1 };
        p.push_back(p0);
    }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(480, 480);
    glutInitWindowPosition(20, 1050 - 480 - 20);
    glutCreateWindow("Brownian motion");
    glClearColor(0, 0, 0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 480, 480, 0, -1, 1);
    glutDisplayFunc(display);
    timer();
    glutMainLoop();
}
wqerty11 вне форума Ответить с цитированием
Старый 24.11.2021, 17:14   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Очень непонятен текст, так как в С++ мягко говоря ...
Вместе с тем, у вас есть две переменные vx и vy. Это проекции скорости.
Сделайте их, например, случайными значениями через генератор случайных чисел.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.11.2021, 23:10   #3
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Делал всё по этому видео https://www.youtube.com/watch?v=9Ecd3Pz4lCg&t=1s

Вроде у меня всё так же, но движение молекул неправильное. Не знаю в чём ошибка
wqerty11 вне форума Ответить с цитированием
Старый 26.11.2021, 12:04   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Посмотрите на характеристики вектора, который формируется в цикле.
Сделайте вывод характеристик, сгенерировав 3-5 векторов.
Возможно ваш rand() не инициализирован нужными значениями.
См., например, тут: http://cppstudio.com/post/339/
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 26.11.2021, 12:11   #5
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Звучит хорошо, но что именно мне нужно сделать? Я не очень понимаю.
wqerty11 вне форума Ответить с цитированием
Старый 26.11.2021, 18:49   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Вот тут:
Код:
for (int i = 0; i < 100; ++i)
    {
        P p0 = { rand() % 480, rand() % 480, rand() % 100000 / 500.0 - 100, rand() % 100000 / 500.0 - 100, 1 };
        p.push_back(p0);
    }
Вот выделены (жирным) координаты частицы и её скорости (подчёркнуто).
Замените число 100 в цикле, например, на 5.
Можете вывести на экран координаты и скорости?
Надеюсь, что с выводом у вас нет проблем.

И вот:
Цитата:
В строке 9 значение константы RAND_MAX выталкивается в поток вывода, так мы сможем посмотреть максимальное значение из интервала случайных чисел.
Это строка по данной ранее ссылке.
Вы можете посмотреть своё значение RAND_MAX?
Как-то так, ...

Последний раз редактировалось ViktorR; 26.11.2021 в 18:52.
ViktorR вне форума Ответить с цитированием
Старый 26.11.2021, 19:52   #7
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Значение RAND_MAX=32767
wqerty11 вне форума Ответить с цитированием
Старый 26.11.2021, 23:49   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
Значение RAND_MAX=32767
Вовсе не смешно.

А что с первой частью предложения? Как там поживают характеристики вектора?
Они устанавливаются рандомно?
В С++ я не дока и только ваша активная позиция (заинтересованность) может помочь вам.

У меня нет этой среды для тестирования, а вытаскивать информацию как из партизана ...

Если коротко. Есть понятие - отладка программы.
Если все частицы летят одинаково и из одного места, то проблема может быть в random().
Смотрим на вектор, как он формируется, затем на функцию
Код:
void timer(int = 0)
...
в которой меняются параметры скорости и, соответственно, координаты.
Просто генерируем несколько частиц и выводи их характеристики в тех местах, где они меняются.
и т.д.
По результатам вывода делаем заключение ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 28.11.2021, 00:02   #9
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Извините, я очень заинтересован, просто не очень хорошо в этом всём разбираюсь. Не подскажите как это реализовать? Просто генерируем несколько частиц и выводи их характеристики в тех местах, где они меняются.
wqerty11 вне форума Ответить с цитированием
Старый 28.11.2021, 10:10   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

wqerty11
Цитата:
Извините, я очень заинтересован
А у меня нет интереса решать ваш интерес.

Зачем вы взялись за эту задачу, если даже не знаете, как выполняется вывод на экран?

Ещё раз, в С++ я не дока и у меня нет этой среды для тестирования.
Подождите, возможно кто-то, более знающий, отзовётся на ваш запрос.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Броуновское движение молекул (диффузия) vzik Помощь студентам 2 19.05.2012 11:19
Задача на Pascal ABC. Определить среднюю кинетическую энергию вращательного движения молекул водорода faqbi4vosk Помощь студентам 1 22.04.2012 17:39
движение молекул Игорь228 C++ Builder 0 11.12.2011 00:48
QBasic графика в движении Dronlion Помощь студентам 0 05.04.2011 10:29
Количество молекул воздуха в помещении Cular Microsoft Office Excel 7 23.05.2010 20:30