Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3.3.5-6 Изолинии.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
217.09 Кб
Скачать

Программирование построения изолиний на Delphi

Интерфейс программы построения изолиний показан на рис3.33. На этом рисунке отражены результаты выполнения тестовых расчетов на построение изолиний сферической поверхности, о которой было рассказано выше. Числовой массив, получаемый по программе Polusfera, сохраняется в файле с полным именем F:\temp\Tmas.dat (путь к файлу и его имя могут быть и другими). Программа построения изолиний читает этот файл, запрашивает у пользователя число рисуемых изолиний с помощью элемента интерфейса ComboBox1. После нажатия командной кнопки Botton1 в поле элемента ListBox1 выводятся номера изолиний и соответствующие им значения функции, а в прямоугольном окне рисуются изолинии, помеченные соответствующими номерами.

Как и следовало ожидать, картина изолиний сферической поверхности представляет собой концентрические окружности. Максимальное значение находится в центре, соответствует верхней точке сферы и равно .

Рис3.33. Результат работы программы построения изолиний на тестовой задаче

Программа построения изолиний

Программа построения изолиний реализована в процедуре обработки события Button1Click.

Procedure Tform6.Button1Click(Sender: Tobject);

Const M=50; N=50;

var T: array [1..M,1..N] of real;

Tmax, Tmin, DT, Tlin: real;

Nlin,I,j: integer;

F: File of real;

Procedure IZOLIN;

var l,b:integer; // левый нижний угол области вывода графика

w,h:integer; // ширина и высота области вывода графика

I, j, lin, k, e: integer;

ri, rj: real;

flag: 66oolean;

Procedure Pixels_9(e,k:integer);//закрашивание квадратика 3х3

var i1,j1:integer;

begin

for i1 := -1 to 1 do

for j1 := -1 to 1 do

Form6.Canvas.Pixels[e+i1,k+j1]:=clBlack;

end;

Begin

l:=130; //Смещение вправо окна изолиний на 130 пикселей

b:=Form6.ClientHeight-20; //Y–координата левого нижнего угла

h:=Form6.ClientHeight-40; // максимальная высота окна

w:=Form6.ClientWidth-(l+20); // максимальная ширина окна

if M>N then w:=round(w*N/M); //пропорциональное уменьшение ширины

if M<N then h:=round(h*M/N); // или высоты

with Form6.Canvas do

begin

//Границы прямоугольной области

MoveTo (l, b-h); LineTo(l,b); LineTo(l+w,b);

LineTo(l+w,b-h); LineTo(l,b-h);

//построение изолиний

for lin:=1 to Nlin do

begin

Tlin:=Tmin+(lin-1)*DT;

flag:=true;

//пересечение с горизонтальными линиями сетки

For i:=1 to M-1 do

Begin k:=round(h/M*(M-i)+b-h); // граф. Координата по Y

For j:=1 to N-1 do

Begin

If (Tlin>=T[I,j]) and (T[I,j+1]>=Tlin) or (Tlin<=T[I,j]) and

(Tlin >= T[i,j+1])

then Begin //х-координата точки пересечения

if abs(T[I,j+1]-T[I,j])<1E-6//исключение деления на ноль

then rj:=j+1

else rj:=j+(Tlin-T[I,j])/(T[I,j+1]-T[I,j]);

e:=round(l+w/N*rj);//граф. Координата по X

Pixels_9(e,k) //Закрашивание области точки

end

end

end;

//пересечение с вертикальными линиями сетки

For j:=1 to N-1 do

Begin e:=round(l+w/N*j); //граф. Координата по X

For i:=1 to M-1 do

Begin

If (Tlin>=T[I,j]) and (Tlin<=T[i+1,j])or(Tlin<=T[I,j]) and

(Tlin>=T[i+1,j])

then Begin //y-координата точки пересечения

if abs(T[i+1,j]-T[I,j])<1E-6 then ri:=i+1

else ri:=i+(Tlin-T[I,j])/(T[i+1,j]-T[I,j]);

k:=round(h/M*(M-ri)+b-h); //граф. Координата по Y

//Вывод номера изолинии или закрашивание точки

If flag then begin TextOut(e,k,IntToStr(lin));

flag:=false end

else Pixels_9(e,k) //Закрашивание области точки

end

end

end

end //конец цикла вывода изолиний

end // end with

end; //конец процедуры изолиний

begin

AssignFile(F,’F:\temp\Tmas.dat’); Reset(F);

for I := 1 to M do

for j := 1 to N do Read(F,T[I,j]);//Ввод массива из файла

//Вычисление max и min массива T

Tmax:=T[1,1]; Tmin:=T[1,1];

For i:=1 to M do

For j:=1 to N do

begin

If T[I,j]>Tmax then Tmax:=T[I,j];

If T[I,j]<Tmin then Tmin:=T[I,j]

End;

//Ввод числа изолиний из поля ComboBox1

Nlin:=StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]);

DT:=(Tmax-Tmin)/(Nlin-1); //Шаг изменение значения изолинии

//Вывод списка изолиний в поле ListBox1

ListBox1.Items.Add('Значения изолиний');

for I := 1 to Nlin do

begin

ListBox1.Items.Add(IntToStr(i)+’:T=’+FloatToStrF(Tmin+(i-1) *DT,ffGeneral,4,2))

end;

IZOLIN //Обращение к процедуре построения изолиний

end;

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

  1. И зображение изолинии получается из точек пересечения этой линии с горизонтальными и вертикальными линиями расчетной сетки. Чем гуще расчетная сетка (больше M×N), тем плотнее расположатся точки (рис.3.34)

  2. Число изолиний заносится в переменную Nlin. Значения, соответствующие выводимым изолиниям, изменяются от минимального значения в массиве (Tmin) до максимального значения (Tmax) с шагом DT=(Tmax-Tmin)/(Nlin-1).

  3. Д

    Рис.3.34. Точечное изображение изолинии на расчетной сетке

    ля очередного значения изолинии Tlin определятся все пары ближайших узлов расчетной сетки, между которыми лежит это значение. Для горизонтальных линий сетки: . Для вертикальных линий сетки . Далее, путем линейного приближения вычисляется положение точки пересечения изолинии с соответствующей линией сетки. Например, для горизонтальных линий сетки положение точки пересечения получается в переменной rj, которое вычисляется оператором: rj:=j+(Tlin-T[I,j])/(T[I,j+1]-T[I,j]). Это значение будет удовлетворять условию: j≤rj≤j+1. Для вертикальных линий сетки положение точки пересечения вычисляется оператором: ri:=i+(Tlin-T[I,j])/(T[i+1,j]-T[I,j]). Отсюда i≤ri≤i+1.

  4. Координаты точек пересечения изолиний с линиями расчетной сетки (i,rj) или (ri,j) пересчитываются в координаты ближайших точек графической сетки в окне вывода изображения (Canvas - холсте). Эти координаты получаются, соответственно, в переменных e, k. Затем на холсте в этом месте закрашивается черный квадратик размером 3×3 пикселя. Точка с координатами e, k находится в центре этого квадратика. Закрашивание производится процедурой Pixels_9. Номер каждой изолинии выводится только один раз при обнаружении ее первого пересечения с вертикальной линией вычислительной сетки. Для управления эти процессом используется логическая переменная flag.

Обращаем ваше внимание на весьма важное обстоятельство: значения констант M и N, определяющих размер расчетной сетки, должны быть одинаковыми в программе получения числового массива и в программе построения изолиний по значениям этого массива. Нарушение данного правила приведет к ошибке во время чтения из файла.