Материал: Разработка программного продукта для расчета тепловых коэффициентов для тел с распределенными и сосредоточенными источниками энергии

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Начинается процедура с установки режима рисования. Дело в том, что курсоры рисуются пером Pen на канве Canvas компонента Chart 1. При перемещении курсора надо сначала стереть прежнее изображение курсора, а затем нарисовать его в новом месте. Подобные операции легко осуществляются в режиме пера pmNotXor. В этом режиме повторное рисование фигуры на том же месте, где она была нарисована ранее, стирает прежнее изображение. В конце процедуры восстанавливается запомненный режим рисования пера.

Вторая вспомогательная процедура TFPlot. Write Value отображает координаты курсоров в окне FCoord. В начале этой процедуры методами Seriesl.XValue и Seriesl.YValue определяются координаты курсоров в системе координатных осей графика. Затем эти значения функцией FloatToStrF отображаются в соответствующих метках формы FCoord с точностью 7 значащих цифр.

Теперь обратимся к процедуре FormKeyDown. Это обработчик события ОпKeyDown формы, наступающего при нажатии пользователем какой-нибудь клавиши. Все операции выполняются только в случае, если включен режим курсоров графика (ACursors.Checked = true). Если пользователем нажата клавиша Shift (проверяется условием ssShift in Shift), то работа идет со вторым курсором. В противном случае работа идет с первым курсором. Индекс курсора, с которым идет работа, присваивается локальной переменной IndNew.

Далее анализируется нажатая пользователем клавиша. Если нажата клавиша со стрелкой влево (Key = VK_Left), то индекс курсора уменьшается функцией Dec на величину шага HCursor. Если нажата клавиша со стрелкой вправо (Key = VK_Right), то индекс курсора увеличивается функцией Inc на величину шага HCursor. При нажатых клавишах Ноmе и End индекс соответственно устанавливается на начало или конец графика.

Процедура ARepaintExecute осуществляет перерисовку изображения графика и всего нарисованного на канве, если это изображение по каким-то причинам испортилось. Для перерисовки вызывается стандартный метод Repaint.

Процедуры AMaxExecute и AMinExecute осуществляют расчет максимума и минимума отображенной на графике функции. Зрительно для пользователя это сводится к перемещению первого курсора соответственно в точку максимального или минимального значения. Поэтому сначала вызовом процедуры SetCursor стираются прежние изображения курсоров, затем по массиву Seriesl.YValues рассчитывается максимальное или минимальное значения графика, индекс первого курсора IndCursl задается равным индексу найденной точки, после чего курсоры рисуются в новой позиции.

Процедура ACalcExecute осуществляет вызов стандартной программ Windows «Калькулятор» функцией ShellExecute.

Процедуры ASaveBMPExecut, ASaveWMFExecute и ASaveEMFExecute вызывают стандартный диалог сохранения в файле и при выборе пользователем файла сохраняют график в соответствующем формате. При вызове диалога расширение по умолчанию DefaultExt и фильтр файлов Filterlndex диалога задаются соответствующими формату результирующего файла.

Процедуры ACopyBMPExecute, ACopyWMFExecute и ACopyEMFExecute соответствующими методами компонента копируют график в буфер обмена Clipboard в различных форматах. Из Clipboard эту копию может взять любая программа, например, Word.

Процедура APrintPExecut является обработчиком сразу двух действий: печати графика в книжной и альбомной ориентации. Вызов стандартного диалога печати позволяет пользователю выбрать принтер и число печатаемых копий, А затем одним из двух методов Chartl.PrintPortrait или Chartl.PrintLandscape (в зависимости от того, какое действие вызвало процедуру, т.е. от значения параметра Sender) осуществляется печать графика.

Процедура AExitExecute завершает приложение методом Application.Terminate. Процедура ChartlDblClick является обработчиком двойного щелчка. Она восстанавливает исходный масштаб графика, если он был изменен пользователем. Процедура AHelpExecute вызывает справку. Процедура FormClose является обработчиком события OnClose формы. Она закрывает окно координат, если оно было открыто.

Процедура FormCreate задает свойству Order массива аргументов серии Seriesl значение loNone. Это обеспечивает отсутствие упорядочивания точек и обеспечивает возможность рисования графиков многозначных функций.

4. Руководство пользователю

.1 Описание окна ввода исходных данных

Окно содержит текстовые поля для ввода исходных данных и кнопки для расчета температуры в конкретной точке или для перехода в окно работы с графиком.

Ввод дробных чисел осуществляется через запятую, а не через точку. Переход между окнами ввода и кнопками можно осуществлять с помощью клавиши "Tab", обратное перемещение "Shift+Tab".

Для работы с программой необходимо ввести требуемые данные в соответствующие поля. Размерность ввода указана рядом с полем ввода. Ввод температуры осуществляется в соответствии с заданием или в градусах Цельсия, или в градусах Кельвина, соответственно результат будет представлен в той размерности которую Вы выберите.

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

.2 Описание окна работы с графиком

Окно содержит панель, в которой отображается график, главное меню и инструментальную панель.

Масштаб по оси ординат выбирается автоматически исходя из рассчитанных значений отображаемого выражения. Масштаб по оси абсцисс определяется диапазоном аргумента X, заданным в основном окне приложения. Однако, он может изменяться, если обнаруживается, что значения аргумента в начале или в конце диапазона вызывают вычислительные ошибки. Если подобные ошибки возникают во внутренних точках диапазона, на графике отображаются области недопустимых значений. В них отсутствует кривая графика и стерта координатная сетка.

Для восстановления нормального изображения можно выполнить команду Правка | Перерисовать или нажать соответствующую быструю кнопку (шестая справа) на инструментальной панели.

В процессе просмотра графика пользователь может увеличивать размер окна вплоть до развертывания на весь экран, чтобы посмотреть график в более крупном масштабе. Однако, иногда этого мало. Требуется еще более крупное увеличение какого-то фрагмента. Это можно сделать, если нажать на графике левой кнопкой мыши и, потянув курсор, обвести прямоугольной рамкой требуемый фрагмент. Тогда обведенный фрагмент развернется на всю площадь графика.

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

Двойной щелчок на графике левой кнопкой мыши вернет масштаб графика к исходному значению. То же самое можно сделать, перейдя в основное окно приложения и выполнив команду График.

В меню Курсор имеется два раздела: Курсор мыши и Курсоры графика. Второй из этих разделов продублирован "горячими" клавишами Ctrl-C и быстрой кнопкой на инструментальной панели (пятой справа на приведенных ранее рисунках).

При выборе любого из этих разделов открывается окно координат курсоров. Верхняя строка в этом окне заполнена, если включена команда Курсор мыши. Тогда при перемещении курсора мыши в поле графика в этой верхней строке отображаются координаты X и Y курсора, соответствующие координатным осям графика. В момент, когда курсор мыши проходит точно над кривой, изображенной на графике, изменяется вид курсора - вместо стрелки появляется крест. Таким образом, команда Курсор мыши позволяет быстро (но приблизительно) определить координаты характерных точек графика.

Если выполнена команда Курсоры графика, то в окне координат заполняются строки 1-ый курсор, 2-ой курсор, Разность. Одновременно на графике появляются два курсора в виде тонких линий, пересекающих все поле графика. В первый момент координата X обоих курсоров равна начальной координате. Если пользователь нажимает на клавиатуре клавишу со стрелкой вправо, первый курсор будет перемещаться вправо, причем будет точно отслеживать кривую графика. Соответственно в строке 1-ый курсор окна координат будут отображаться координаты той точки графика, в которой в данный момент расположен курсор. При нажатии клавиши со стрелкой влево курсор будет перемещаться по кривой влево. Если пользователь нажмет соответствующую клавишу со стрелкой и не будет ее отпускать, то движение курсора вдоль кривой будет со временем ускоряться. Это позволяет быстро подвести курсор к той области графика, которая интересует пользователя. А затем однократными нажатиями на клавишу со стрелкой можно установить курсор точно в требуемую позицию.

Нажатие клавиш Home или End переводит курсор в соответственно в начальную или конечную точку графика.

Если вы закончили работу с курсорами, их можно удалить. Для этого надо повторно выполнить команду меню Курсор | Курсор мыши или Курсор | Курсоры графика.

При измерениях на графиках в ряде случаев пользователю желательно произвести какие-то вычисления. Поэтому в окно графиков встроен вызов программы Windows "Калькулятор". Вызов осуществляется командой Функции | Калькулятор или соответствующей быстрой кнопкой на инструментальной панели (вторая справа).

Часто при исследовании графиков надо найти минимальное и максимальное значение кривой. Эти операции осуществляются командами Функции | Максимум и Функции | Минимум или соответствующими быстрыми кнопками со стрелками (третья и четвертая справа). При выборе этих команд открывается окно координат курсоров и первый курсор автоматически перемещается соответственно в точки минимума или максимума.

Команды Файл | Сохранить как .BMP, Файл | Сохранить как .WMF, Файл | Сохранить как .EMF и соответствующие им быстрые кнопки (три слева на инструментальной панели) сохраняют график в файлах форматов соответственно .bmp, .wmf (метафайл) и .emf (метафайл Enhanced WMF). При выборе этих команд открывается стандартное окно сохранения файла, в котором пользователь может задать имя файла и каталог.

Команды Файл | Печать книги (четвертая слева быстрая кнопка) и Файл | Печать альбома позволяют вывести график на принтер соответственно при книжной (вертикальной) или альбомной (горизонтальной) ориентации страницы.

Команды Правка | Копировать | Битовая матрица (BMP), Правка | Копировать | Метафайл WMF, Правка | Копировать | Метафайл EMF копируют в соответствующих форматах график в буфер обмена Clipboard, откуда его можно заимствовать в другое приложение, например, в документ Word.

Заключение

В ходе выполнения данного курсового проекта были решены поставленные задачи по оптимизации вычислений и отображения тепловых полей для тел с распределенными и сосредоточенными источниками энергии.

В третей задаче источник тепла равномерно распределен по поверхности грани y. Реализовать задачу распределения источника тепла по другим граням оказалось невыполнимым по формулам приведенным в [1].

Данные программные продукты позволяют сократить затраты времени на расчет температурных полей и получить графики распределения температуры вдоль двух выбранных осей координат с фиксированной третей координатой.

Приложение 1

unit Unit1;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart,, ImgList, ActnList, Menus, ComCtrls, ToolWin, jpeg;= class(TForm)

…BitBtn1Click(Sender: TObject);Edit4Change(Sender: TObject);BitBtn2Click(Sender: TObject);BitBtn3Click(Sender: TObject);BitBtn4Click(Sender: TObject);FormShow(Sender: TObject);N1Click(Sender: TObject);Edit1KeyPress(Sender: TObject; var Key: Char);Edit10KeyPress(Sender: TObject; var Key: Char);

{ Private declarations }

{$R *.DFM}TForm1.BitBtn1Click(Sender: TObject);

// кнопка «График зависимости t от x»

if (Edit1.text='') or (Edit2.text='') or (Edit3.text='') or (Edit4.text='')(Edit5.text='') or (Edit7.text='') or (Edit8.text='') or (Edit9.text='')(Edit10.text='')then('Заполните все поля формы')(strtofloat(Edit7.text)<0) or (strtofloat(Edit7.text)>strtofloat(Edit2.text)) or

(strtofloat(Edit8.text)<0) or (strtofloat(Edit8.text)>strtofloat(Edit3.text)) then

ShowMessage('Координаты исследуемой точки выходят за рамки параллепипеда')

else:=strtofloat(Edit1.text)/2;:=strtofloat(Edit2.text)/2;:=strtofloat(Edit3.text)/2;:=strtofloat(Edit4.text);:=(strtofloat(Edit4.text))/(8*l1*l2*l3);:=strtofloat(Edit5.text);:=strtofloat(Edit9.text);:=strtofloat(Edit10.text);:=strtofloat(Edit7.text);:=strtofloat(Edit8.text);:=2*2*l1*2*l2+2*2*l3*2*l2+2*2*l3*2*l1;:=(P+AL*tc*S)/(AL*S);:=0; x:=0;.BeginPlot;:=l1*2;:=maximal/1000;i:=1 to 1000 do:=0;:=(64*W*l3*l3)/(3.14*3.14*3.14*3.14*LA);

// Вычисление основной формулы

for n:=1 to 20 do

beginm:=1 to 20 do:=t2+(sin((2*n-1)*3.14*x/(2*l1))*sin((2*m-1)*3.14*y/(2*l2))/

((2*n-1)*(2*m-1)*

((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+

(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2)))*

(2*l3/3.14)*(2*l3/3.14)))*

(1-(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z))+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z)))/

(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)));;;:=t1*t2+ts;.AddPoint(x,t,clRed);:=x+h;;.Chart1.Title.Text.Clear;

FPlot.Chart1.Title.Text.Add('График зависимости температуры от координаты X');

FPlot.Show;.LX.Caption:='X';;;;TForm1.Edit4Change(Sender: TObject);(Edit1.text<>'') and (Edit2.text<>'') and (Edit3.text<>'') and (Edit4.text<>'') then.Caption:=floattostr(round(strtofloat(Edit4.Text)/(strtofloat(Edit1.Text)*strtofloat(Edit2.Text)*strtofloat(Edit3.Text))*1000)/1000);;TForm1.BitBtn2Click(Sender: TObject);

// кнопка «График зависимости t от y»

if (Edit1.text='') or (Edit2.text='') or (Edit3.text='') or (Edit4.text='')(Edit5.text='') or (Edit6.text='') or (Edit8.text='') or (Edit9.text='')(Edit10.text='')then('Заполните все поля формы')(strtofloat(Edit6.text)<0) or (strtofloat(Edit6.text)>strtofloat(Edit1.text)) or

(strtofloat(Edit8.text)<0) or (strtofloat(Edit8.text)>strtofloat(Edit3.text)) then

ShowMessage('Координаты исследуемой точки выходят за рамки параллепипеда')

else:=strtofloat(Edit1.text)/2;:=strtofloat(Edit2.text)/2;:=strtofloat(Edit3.text)/2;:=strtofloat(Edit4.text);:=(strtofloat(Edit4.text))/(8*l1*l2*l3);:=strtofloat(Edit5.text);:=strtofloat(Edit9.text);:=strtofloat(Edit10.text);:=strtofloat(Edit6.text);:=strtofloat(Edit8.text);:=2*2*l1*2*l2+2*2*l3*2*l2+2*2*l3*2*l1;:=(P+AL*tc*S)/(AL*S);:=0; y:=0;.BeginPlot;:=l2*2;:=maximal/1000;i:=0 to 1000 do:=0;:=(64*W*l3*l3)/(3.14*3.14*3.14*3.14*LA);n:=1 to 20 dom:=1 to 20 do:=t2+(sin((2*n-1)*3.14*x/(2*l1))*sin((2*m-1)*3.14*y/(2*l2))/

((2*n-1)*(2*m-1)*

((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+

(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2)))*

(2*l3/3.14)*(2*l3/3.14)))*

(1-(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z))+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z)))/

(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)));;;:=t1*t2+ts;.AddPoint(y,t,clRed);:=y+h;;.Chart1.Title.Text.Clear;

FPlot.Chart1.Title.Text.Add('График зависимости температуры от координаты Y');

FPlot.Show;.LX.Caption:='Y';;;;TForm1.BitBtn3Click(Sender: TObject);

// кнопка «График зависимости t от z»

if (Edit1.text='') or (Edit2.text='') or (Edit3.text='') or (Edit4.text='')(Edit5.text='') or (Edit7.text='') or (Edit6.text='') or (Edit9.text='')(Edit10.text='')then('Заполните все поля формы')(strtofloat(Edit7.text)<0) or (strtofloat(Edit7.text)>strtofloat(Edit2.text)) or

(strtofloat(Edit6.text)<0) or (strtofloat(Edit6.text)>strtofloat(Edit1.text)) then

ShowMessage('Координаты исследуемой точки выходят за рамки параллепипеда')

else:=strtofloat(Edit1.text)/2;:=strtofloat(Edit2.text)/2;:=strtofloat(Edit3.text)/2;:=strtofloat(Edit4.text);:=(strtofloat(Edit4.text))/(8*l1*l2*l3);:=strtofloat(Edit5.text);:=strtofloat(Edit9.text);:=strtofloat(Edit10.text);:=strtofloat(Edit7.text);:=strtofloat(Edit6.text);:=2*2*l1*2*l2+2*2*l3*2*l2+2*2*l3*2*l1;:=(P+AL*tc*S)/(AL*S);:=0; z:=0;.BeginPlot;:=l3*2;:=maximal/1000;i:=0 to 1000 do:=0;:=(64*W*l3*l3)/(3.14*3.14*3.14*3.14*LA);n:=1 to 20 dom:=1 to 20 do:=t2+(sin((2*n-1)*3.14*x/(2*l1))*sin((2*m-1)*3.14*y/(2*l2))/

((2*n-1)*(2*m-1)*

((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+

(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2)))*

(2*l3/3.14)*(2*l3/3.14)))*

(1-(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z))+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*(l3-z)))/

(exp(sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)+(-sqrt(((2*n-1)*(2*n-1)*(3.14/(2*l1))*(3.14/(2*l1))+(2*m-1)*(2*m-1)*(3.14/(2*l2))*(3.14/(2*l2))))*l3)));;;:=t1*t2+ts;.AddPoint(z,t,clRed);:=z+h;;.Chart1.Title.Text.Clear;

FPlot.Chart1.Title.Text.Add('График зависимости температуры от координаты Z');

FPlot.Show;.LX.Caption:='Z';;;;TForm1.BitBtn4Click(Sender: TObject);

// кнопка «Температура поля в точке с координатами x, y, z.»

if (Edit1.text='') or (Edit2.text='') or (Edit3.text='') or (Edit4.text='')(Edit5.text='') or (Edit7.text='') or (Edit8.text='') or (Edit9.text='')(Edit10.text='') or (Edit6.text='') then

ShowMessage('Заполните все поля формы')

else(strtofloat(Edit6.text)<0) or (strtofloat(Edit6.text)>strtofloat(Edit1.text)) or

(strtofloat(Edit8.text)<0) or (strtofloat(Edit8.text)>strtofloat(Edit3.text)) or

(strtofloat(Edit7.text)<0) or (strtofloat(Edit7.text)>strtofloat(Edit2.text)) then

ShowMessage('Координаты исследуемой точки выходят за рамки параллепипеда')

else:=strtofloat(Edit1.text)/2;:=strtofloat(Edit2.text)/2;:=strtofloat(Edit3.text)/2;:=strtofloat(Edit4.text);:=(strtofloat(Edit4.text))/(8*l1*l2*l3);:=strtofloat(Edit5.text);:=strtofloat(Edit9.text);:=strtofloat(Edit10.text);:=strtofloat(Edit6.text);:=strtofloat(Edit7.text);:=strtofloat(Edit8.text);:=2*2*l1*2*l2+2*2*l3*2*l2+2*2*l3*2*l1;:=(P+AL*tc*S)/(AL*S);:=0;:=0;:=(64*W*l3*l3)/(3.14*3.14*3.14*3.14*LA);n:=1 to 20 dom:=1 to 20 do:=t2+(sin((2*n-1)*3.14*x/(2*l1))*sin((2*m-1)*3.14*y/(2*l2))/