Лекции.Орг


Поиск:




Категории:

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

 

 

 

 


Программирование построения изолиний на 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: oolean;

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. Для очередного значения изолинии 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, определяющих размер расчетной сетки, должны быть одинаковыми в программе получения числового массива и в программе построения изолиний по значениям этого массива. Нарушение данного правила приведет к ошибке во время чтения из файла.

Вопросы и задания

1. Что такое изолиния функции двух переменных?

2. Как выглядит картина изолиний конической поверхности?

3. Чем отличаются между собой типизированные и текстовые файлы? Почему выгоднее хранить массивы вещественных чисел в типизированных файлах? Какие преимущества имеет хранение данных в текстовых файлах?

4. Какие элементы управления Delphi использованы в программе построения изолиний?

5. Изучите процедуру построения изолиний и ответьте на вопросы:

- как определяется положение на холсте и размер области вывода изолиний?

- как вычисляется шаг изменения значений изолиний?

- каким образом вычисляются координаты точек пересечения изолинии с линиями расчетной сетки?

- как происходит пересчет координат пересечения изолиний с линиями расчетной сетки в графические координаты холста?

- как обеспечивается однократный вывод номера изолинии на рисунок?

 
 

 

 






Поделиться с друзьями:


Дата добавления: 2015-11-23; Мы поможем в написании ваших работ!; просмотров: 4594 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Вы никогда не пересечете океан, если не наберетесь мужества потерять берег из виду. © Христофор Колумб
==> читать все изречения...

2339 - | 2144 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.