Проект. «Моделирование процесса теплообмена». Программа моделирует процесс теплообмена, протекающий в некоторой квадратной пластинке, окруженной с четырех сторон обогревателями. Работу над проектом разобьем на три этапа: I. II. III. Нарисуем квадратную пластинку и четыре обогревателя. Зададим исходные (начальные) температуры обогревателей и пластинки. В соответствии с законами физики, моделируем процесс теплообмена. Этап I. Нарисуем квадратную пластинку и четыре обогревателя. Обогреватели будут изображены в виде четырех объектов типа TPanel соответствующих размеров. Их мы нарисуем заранее на этапе визуального проектирования формы. Пластинку мы условно разделим на 2500 (50 х 50) маленьких частей и будем считать, что в пределах этих частей (клеток) температура одинаковая и процесс теплообмена протекает между этими клетками. Это допущение нашей компьютерной модели, небольшое упрощение настоящего физического явления. Пластинку мы создадим в процедуре FormCreate. Для этого объявим глобальный массив 50 х 50 типа TPanel (объект типа панель): const n=50; var p:array[1..n,1..n]of tpanel; (В строке Uses должен быть прописан модуль ExtCtrls). Далее поступим следующим образом: procedure TForm1.FormCreate(Sender: TObject); var i,k:integer; begin for i:=1 to n do for k:=1 to n do begin p[i,k]:=tpanel.Create(form1); p[i,k].Left:=55+k*5; p[i,k].Top:=45+i*5; p[i,k].Width:=5; p[i,k].Height:=5; p[i,k].Color:=c; p[i,k].Parent:=form1; end; end; Как видно размер частей (клеток) - 5 на 5 пикселей. Добавим еще кнопку Start и получим такой вид формы: Этап II. Зададим исходные (начальные) температуры обогревателей и пластинки. Визуально температуру пластинки и обогревателей будем изображать определенными цветами (в зависимости от значений температур). Для удобства зададим некоторый интервал возможных температур, например от 0 до 800 градусов. Этот интервал удобно разбить на 10 частей (по 100 градусов) и сопоставить каждой части в соответствие определенный цвет. Проверку температур и выбор цвета можно осуществить в некоторой процедуре, например, так: procedure prov; begin case t of 0..100:c:=clblue; 101..200:c:=clTeal; 201..300:c:=clskyblue; 301..400:c:=claqua; 401..500:c:=cllime; 501..600:c:=clpurple; 601..700:c:=clfuchsia; 701..800:c:=clred; end; end; Значения температур (и соответственно цвет) проще задавать случайным образом: t:=random(801);t1:=t; prov; panel1.Color:=c; t:=random(801);t2:=t; prov; panel2.Color:=c; t:=random(801);t3:=t; prov; panel3.Color:=c; t:=random(801);t4:=t; prov; panel4.Color:=c; Аналогично и начальную температуру (и цвет) самой пластинки. Заданные таким образом температуры нам понадобятся для реализации процесса теплообмена. Введем массив: a:array[0..1,0..n+1,0..n+1]of integer; {n = 50} Трехмерным массив задан неслучайно, так как, очевидно, новые температуры «клеток» не должны сразу же влиять на своих соседей в пределах одного цикла теплообмена (здесь, цикл теплообмена – это просмотр всех 2500 (n x n) «клеток»). Поэтому первый индекс массива будет играть роль своеобразного переключателя (см. проект «Живые клетки»): L:=0, а затем L:=1 - L, таким образом 0 1. При этом a[L,0,k]:=t1 температура верхнего обогревателя, a[L,n+1,k]:=t2 температура нижнего обогревателя, a[L,k,0]:=t4 температура левого обогревателя, a[L,k,n+1]:=t3 температура правого обогревателя. Таким образом, любая клетка будет иметь четырех соседей: i –1, k i, k-1 i, k i, k+1 i+1, k Для крайних клеток соседними являются температуры обогревателей. Этап III. В соответствии с законами физики, моделируем процесс теплообмена. Новую температуру клетки будем определять как среднее арифметическое температур ее соседей: t:=round((a[l,i-1,k]+a[l,i,k-1]+a[l,i,k+1]+a[l,i+1,k])/4); Причем значение температуры мы округлим до целого. Просмотр всех частей («клеток») будем производить в процедуре Timer1Timer: procedure TForm1.Timer1Timer(Sender: TObject); var i,k:integer; begin for i:=1 to n do for k:=1 to n do begin t:=round((a[l,i-1,k]+a[l,i,k-1]+a[l,i,k+1]+a[l,i+1,k])/4); a[1-l,i,k]:=t; prov; p[i,k].Color:=c; end; l:=1-l; end; Таймер будем включать кнопкой Start, этой же кнопкой процесс можно будет остановить (и возобновить снова): if timer1.Enabled=false then begin timer1.Enabled:=true; button1.Caption:='Stop'; end else begin timer1.Enabled:=false; button1.Caption:='Start'; end; Причем свойство Interval таймера рекомендуется сделать равным 1: timer1.Interval:=1; В результате можем получить, например, такие картинки: Для большей динамики можно время от времени менять температуру обогревателей случайным образом.