Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Sleep(10);






Application-> ProcessMessages();

}

5.10.1 Тот же прием используется дальше – во время операций стирания/рисования молекул. Если текущее значение переменной цикла меньше или равно N, то нам известно, что радиус молекулы большой, иначе маленький.

5.10.2 Вывести значения температур проще всего в двух элементах TLabel. В нашем случае в качестве температуры вполне сгодится сумма скоростей молекул, находящихся в интересующей нас половине. Изначально температура холодного газа равна N*V_холодного_молекулы, а горячего –N*V_горячей_молекулы. Если какая-нибудь молекула перелетает в другую половину аквариума, то температура первой уменьшается на скорость молекулы, температура второй же увеличивается на то же число.

5.10.3 Не забудем, что при выводе числа в метку(строку) необходимо преобразовать его, используя функцию преобразования из ЦелогочислаВСтроку: IntToStr(число).

5.10.4 Теперь проясним ситуацию с перегородкой. Линия прорисовывается методами:

где параметры а-координаты X, b- координаты Y

Pen-> Color = clBlack; // устанавливается цвет линии, черный, можно поменять на любой другой.

MoveTo(a, b); // координаты начала линии

LineTo(a, b); // координаты окончания линии

 

Линии в середине аквариума надо перерисовывать в каждой итерации цикла while(IsRunning), так как пролетающие молекулы стирают её.

 

5.10.5 Когда молекула подлетает к перегородке, необходимо как-то определить, что с ней произойдет дальше: перелетит ли она в другую половину аквариума или отразится от перегородки назад. Напоминаем, что в процессе работы с молекулой мы сначала её стираем, потом вычисляем новые координаты, рисуем на новом месте, но прежде теперь надо проверить не произошло ли столкновение с перегородкой. Если такое случилось, то его надо обработать, т.е. молекула должна отлететь от перегородки в обратную сторону, аналогично того как это происходило при встрече со стенками всего аквариума.

ЕСЛИ молекула находится в правой части аквариума, но при этом на предыдущей итерации моделирования молекула была в его левой части

ЕСЛИ молекула находится на уровне отверстия в перегородке

То молекула перелетает из левой части аквариума в правую

ИНАЧЕ

Молекула отлетает от перегородки назад в левую часть

ИНАЧЕ

ЕСЛИ молекула находится в левой части аквариума, но при этом на предыдущей итерации моделирования молекула была в его правой части

ЕСЛИ молекула находится на уровне отверстия в перегородке

То молекула перелетает из правой части аквариума в левую

ИНАЧЕ

Молекула отлетает от перегородки назад в правую часть

На языке С++ это выглядит так

if (Mol[i].X > Screen-> Width / 2 - R & & Mol[i].X - Mol[i].Vx < = Screen-> Width / 2 - R)

{

if (Mol[i].Y > = Screen-> Height / 2 - RHole & & Mol[i].Y < = Screen-> Height / 2 + RHole)

{ N1 = N1 - V; // молекула перелетает, температура изменяется

N2 = N2 + V;

}

else

{ Mol[i].X = Screen-> Width / 2 - R; // молекула отражается

Mol[i].Vx = -Mol[i].Vx;

}

}

Else

if (Mol[i].X < Screen-> Width / 2 + R & & Mol[i].X - Mol[i].Vx > = Screen-> Width / 2 + R)

{

if (Mol[i].Y > = Screen-> Height / 2 - RHole & & Mol[i].Y < = Screen-> Height / 2 + RHole)

{ N2 = N2 - V; N1 = N1 + V; }

else

{ Mol[i].X = Screen-> Width / 2 + R; Mol[i].Vx = -Mol[i].Vx; }

}

 

5.10.6 Следующие строки дописываем в конце цикла while(IsRunning)

Screen-> Canvas-> Pen-> Color= clBlack;

Screen-> Canvas-> MoveTo(Screen-> Width / 2, 0);

Screen-> Canvas-> LineTo(Screen-> Width / 2, Screen-> Height / 2 - RHole);

Screen-> Canvas-> MoveTo(Screen-> Width / 2, Screen-> Height / 2 + RHole);

Screen-> Canvas-> LineTo(Screen-> Width / 2, Screen-> Height);

TLeft-> Caption = IntToStr(N1);

TRight-> Caption= IntToStr(N2);

 

5.11 Объедините код тела цикла из программы «Идеальный газ», добавьте в него фрагменты 5.10.1 - 5.10.6

while(IsRunning)

{

 

}

Откомпилируйте и запустите программу, работа программы соответствует рисунку приведенному ниже.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.