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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2021, 15:11   #21
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Я так думаю, что быть экстрасенсом - неблагородное дело.
Почему вы не указываете что:
Цитата:
Движение частичек вроде наладилось, но их скорость теперь достаточно низкая.
Произошло после того, как ...
Что вы сделали?

В предыдущем посте есть всё, что надо для понимания, а при необходимости, и изменения диапазона скоростей. Дерзайте.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 03.12.2021, 15:54   #22
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Я сделал то, что Вы написали в прошлом посте.
А именно:
----------------------------------------
Пишем выражение:
Код:
x = -100 + rand()%(200 + 1)
и пробуем.
Т.е., выражение (целиком):
Код:
Vx = rand() % 100000 / 500.0 - 100;
заменяем на то, что написано выше.
------------------------------------------------
wqerty11 вне форума Ответить с цитированием
Старый 03.12.2021, 15:59   #23
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Ну и партизан.
А что с Vy? Тут тоже сделали замену?
Код:
x= -100 + rand()%(201)
Посмотрите как получилась эта формула и увеличьте диапазон скоростей.
Пробуйте.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 04.12.2021, 00:54   #24
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Да, для Vy тоже сделал замену. Если пытаюсь увеличить значения скорости, опять начинаются проблемы с движением молекул.
wqerty11 вне форума Ответить с цитированием
Старый 04.12.2021, 11:45   #25
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

А не сложно будет для вас показать, как вы увеличиваете скорости?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.12.2021, 12:34   #26
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Я пытался увеличивать подчеркнутые значения.

Код:
x = -100 + rand()%(200 + 1)
wqerty11 вне форума Ответить с цитированием
Старый 09.12.2021, 01:49   #27
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, Помогите, пожалуйста, решить проблему с увеличением скоростей молекул. Задание нужно сдать на проверку до конца недели. Спасибо!
wqerty11 вне форума Ответить с цитированием
Старый 10.12.2021, 10:02   #28
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Ещё раз.
У меня нет вашей среды для тестирования и нет времени всё это устанавливать (не говоря о языке ...).
Просто последовательно анализируйте данные, делайте выводы и корректируйте код.

Возможно, что кто-то ещё откликнется, хотя мне непонятно, почему другие эту тему игнорируют.
Может у них этот код просто работает без доп. усилий?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.12.2021, 18:04   #29
wqerty11
Пользователь
 
Регистрация: 24.11.2021
Сообщений: 24
По умолчанию

ViktorR, А что, если немного увеличить значение DT в этой строчке:
Код:
const float DT = 0.01;
Она используется в этой части программы:
Код:
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);
}
Я установил значение DT = 0.03 вместо 0.01 и скорость молекул увеличилась, но они по прежнему двигаются нормально. Можно ли так поступить?
wqerty11 вне форума Ответить с цитированием
Старый 10.12.2021, 18:56   #30
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

DT - это временной интервал, по истечение которого показывается следующая картинка (как я понял).
Дело в том, что в программе расчёт координат и скоростей ведётся с плавающей арифметикой, а рисовать надо с использованием целых чисел (координаты задаются в пикселах).
Увеличение DT - увеличение расстояний, на которые перемещаются молекулы.
Тут важным может оказаться тот момент, когда молекулы сталкиваются с большим телом (молекулой).
В изображении может проявиться ситуация, когда молекула влетает в большую.
Но этого не должно быть при соударении.

PS: Скорость молекул не увеличивается от DT.
От этого параметра увеличивается расстояние, на которое молекула улетает от текущей позиции.
Если текущие координаты X, Y, то следующие: X = X + Vx*DT и Y = Y + Vy*DT.

PSS: Действительно, если скорость составляет, например, 60 единиц, то за 0.01 молекула переместится на 0.6 единиц и, примерно, на один пиксел за 0.02 единицы времени.
Это значит, что формулу для получения скоростей можно поменять на
Код:
x = -500 + rand()%(1001)
Я бы подумал о том, что бы не использовать рандомный генератор, а заменить его на такой, в котором можно задать медиану (центральное значение) и дисперсию. Такое распределение лучше соответствует пониманию температуры (кинетическая энергия).

Если задавать рандомно, то будет много медленно движущихся молекул.

Если использовать нормальное распределение, то диапазон скоростей молекул будет пропорционален дисперсии, а средняя скорость составит, примерно, среднее значение такого распределения.
Алгоритм придётся поискать.
Например, есть трёхтомник Кнута, но для начинающего это будет сложно.
Мне неизвестны библиотеки в Си или С++, которые позволяют генерировать такие наборы быстро.
Как-то так, ...
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