Студопедия

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

КАТЕГОРИИ:

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






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)

{

 

}

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

 


mylektsii.ru - Мои Лекции - 2015-2019 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал