Программирование построения изолиний
В этом параграфе мы с вами снова вернемся к программированию получения графических изображений на Delphi. В §2.4.5 рассматривалась программа построения графика функции. На ее примере были описаны основные принципы получения графического изображения в Delphi. Теперь нашей задачей будет составление программы построения картины изолиний для поля температур.
Что такое изолинии
Рассмотрим подробнее понятие изолиний. Дадим определение изолинии.
Дана функция от двух переменных Z(x,y), определенная в некоторой области значений аргументов. Изолинией называется геометрическое место точек на плоскости X0Y, соответствующее постоянному значению функции Z.
Графическим изображением функции Z(x,y) является поверхность в трехмерном пространстве. Такие поверхности, показанные на рис.3.26, 3.30, были получены с помощью табличного процессора. Изолиния, соответствующая некоторому постоянному значению Z=Zc, представляет собой проекцию сечения поверхности Z(x,y) плоскостью Z=Zc.
В качестве примера рассмотрим сферическую поверхность радиуса R с центром в начале координат. Ее уравнение следующее:
x2 + y2 + z2=R2
Выразим из этого уравнения значение Z, как функцию от x, y:
(3.47)
Знак ‘+’ соответствует верхней полусфере, знак ‘–‘ соответствует нижней полусфере. Изолиниями такой функции являются концентрические окружности с центром в начале координат и радиусом от 0 до R. Построение одной изолинии показано на рис.3.31.
Теперь перейдем к программированию. План действий будет следующим.
1. Составим программу вычисления дискретных значений на прямоугольной сетке функции (3.47) с сохранением в файле полученного числового массива.
2. Составим программу построения картины изолиний для функции Z(x,y), сохраненной в дискретном виде в файле, в результате выполнения п.1.
Дискретное представление поверхности
Примем . Будем строить картину изолиний верхней части сферической поверхности (Z>0) в пределах квадратной области -1≤ x ≤ 1, -1≤ y ≤1. Такая область будет представлять собой вписанный квадрат в окружность, получающуюся при пересечении сферы с плоскостью X0Y, как показано на рис.3.32.
На квадратную область накладываем прямоугольную сетку размером N×M, где N – число шагов по оси X, M - число шагов по оси Y. В дальнейшем будем называть ее расчетной сеткой. Значения шагов по X и по Y равны, соответственно:
hx=2/N, hy=2/M.
Если N=M, то шаги одинаковые и ячейки сетки квадратные.
Координаты узлов сетки вычисляются по следующим формулам:
xj= –1+jhx, j=0,..,N
yi= –1+ihy, i=0,..,M
Для получения дискретного представления верхней половины сферической поверхности, в каждом узле сетки вычисляется значение функции Z по формуле (3.47). Получим расчетную формулу:
(3.48)
Множество значений функции Z образует матрицу {Zi,j}, i=0,..,M, j=0,..,N
Программа расчета сферической поверхности
Ниже приведена программа на Паскале для расчета поверхности верхней полусферы.
Program Polusfera;
Const M=50; N=50;//Параметры размера сетки
Var I,j: integer;
Z: array[1..M,1..N] of real; //Массив расчетных значений ф-ии Z
x,y,hx,hy: real;
Flt: file of real; //файловая переменная
begin
Assign(Flt, ‘F:\temp\Tmas.dat’); //Назначение файла
Rewrite(Flt); //Открытие файла для записи
hx:=2/N; hy:=2/M; //Расчет шагов по X и по Y
//Вычисление массива Z
for i:=1 to M do
begin
y:=-1+hy*I;
for j:=1 to N do
begin
x:=-1+hx*j;
Z[I,j]:=sqrt(2-x*x-y*y)
end
end;
//Запись массива в файл поэлементно
for i:=1 to M do
for j:=1 to N do write(Flt, Z[I,j]);
close(Flt);
Writeln(‘Работа программы закончена’)
end.
Новым для вас элементом в этой программе является использование типизированного файла. Чтобы вспомнить, как организуется ввод данных из файла и вывод в файл, посмотрите еще раз §2.2.4 нашего учебника. Там описана работа с текстовыми файлами, которые хранят любые данные в символьном формате.
Если же требуется хранить в файле данные в том же формате, в каком они хранятся в оперативной памяти, то в таком случае используются типизированные файлы. Файловая переменная, связываемая с типизированным файлом, описывается так:
Var <переменная>: file of <тип сохраняемых данных>.
В рассматриваемой программе используется файловая переменная Flt, которая описана следующим образом:
Var Flt: file of real;
Запись в типизированный файл производится оператором
write(<файловая переменная>, <список вывода>)
Чтение из типизированного файла производится оператором:
Read((<файловая переменная>, <список ввода>)
При использовании типизированных файлов вместо текстовых для сохранения массива вещественных чисел, обычно значительно сокращается объем получаемого файла.