![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Sleep(10); ⇐ ПредыдущаяСтр 3 из 3
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) {
} Откомпилируйте и запустите программу, работа программы соответствует рисунку приведенному ниже.
|