p align="left">end; end; function Integral2Function(x: real; var y: real):boolean; begin Result:=true; try y:=sin(2*x)/sqr(x) except result:=false; end; end; 2.4 Реализация функции разбора произвольно заданных математических функций В программе реализована возможность расчета интегралов и построения графиков не только для функций, заданных в процессе разработки программы, но и для математических функций задаваемых пользователем в процессе работы с программой. Данная функция реализована в модуле evalcomp.pas. Так как разработка данной возможности не была предусмотрена в задании к курсовому проекту, то реализации данного модуля не будет подробно рассматриваться в записке. Рассмотрим лишь правила использования функции. Для использования данной возможности в главном модуле создается объект типа evalvec. Объект необходимо инициализировать строкой содержащей математическую функцию. Пример: new(calc, init('x')); где calc - переменная типа evalvec. Для вычисления значения заданной функции необходимо вызывать метод eval1d: function eval1d(x:real):real; В качестве параметра для данной функции необходимо задавать значение переменной х, на выходе получаем значение функции в точке x. 2.5 Реализация численных методов вычисления интегралов Теоретические выкладки для вычисления интегралов численными методами были приведены выше в п.1.1.1 и п.1.1.2 данной записки. Программно данные методы реализованы в динамической бибилотеке integrals.dll. Листинги процедур для вычисления интегралов методами трапеций и Симпсона представлены на рисунках 4 и 5. function Simpson(MainFunction: IntegralFunction;a,b:real;n: integer; var Res: real): boolean; var s, h, x,y: real; i: integer; begin Result:=true; try s:=0; h:=(b-a)/n; for i:=0 to n do begin x:=a+h*i; if (i=0) or (i=n) then if MainFunction(x,y) then s:=s+y else Result:=false else if i mod 2 = 0 then if MainFunction(x,y) then s:=s+2*y else Result:=false else if MainFunction(x,y) then s:=s+4*y else Result:=false; end; except Simpson:=false; end; Res:=s*h/3; end; function CountTrap(MainFunction: IntegralFunction; a,b, eps: real; var Res: real): boolean; function PTrap(MainFunction: IntegralFunction; a,b:real; DivNo: Integer; var Res: real): boolean; var x1, x2,y1,y2,y3,dx,sum: real; i: integer; begin PTrap:=true; try sum:=0; dx:=(b-a)/DivNo; for i:=1 to DivNo-1 do begin x1:=a+dx*i; if MainFunction(x1,y1) then sum:=sum+y1 else Raise EAbort.Create(''); end; sum:=sum*2; if MainFunction(a,y1) and MainFunction(b,y2) then sum:=sum+y1+y2 else Raise EAbort.Create(''); Res:=sum*dx/2; except PTrap:=False; end; end; {-----} var T: integer; i1, i2: real; begin countTrap:=true; try if PTrap(MainFunction,a,b,2,i1) and PTrap(MainFunction,a,b,4,i2) then begin T:=4; while abs(i1-i2)>eps do begin if PTrap(MainFunction,a,b,t,i1) and PTrap(MainFunction,a,b,t*2,i2) then t:=t*2 else EAbort.Create(''); T:=T*2; end; end else EAbort.Create(''); Res:=(i1+i2)/2; except CountTrap:=false; end; end; 2.5 Реализация функций построения и сохранения графиков 2.5.1 Основная концепция В программе функции построения графика выделены в отдельный модуль chart.pas. Для реализации функций построения графика использованы принципы объектно-ориентированного программирования. Этот подход позволяет размещать на форме несколько областей для отображения графиков. Кроме того, на каждой области могут отображаться не один, а сразу несколько графиков различных функций. Для каждой области построения графиков необходимо создавать объекты класса TChart. При создании объекта в конструктор Create передается указатель на Canvas области построения графиков (в нашем случае в программе передается указатель на Canvas компонента TImage). Для каждого графика, который необходимо отображать необходимо создавать объект класса TChartFunction. В качестве параметра в конструктор Create передается указатель на функцию, график которой необходимо отображать. После создания объекта класса TChartFunction необходимо вызывать метод TChart.AddFunction, который добавляет график текущей функции в список графиков объекта TChart. 2.5.2 Функция отрисовки графика Метод DrawFuncitons класса TChart перебирает по очередности все графики из списка графиков и по очередности отрисовывает каждый из них используя для этого вызов процедуры TChart.DrawFunction. Листинг данной процедуры представлен на рис. 6. procedure TChart.DrawFunction(funct: TChartFunction); var x, y: real; x1,y1,x2,y2: integer; a,b: boolean; f: GraphFunction; begin x:=-(x0/FScale); a:=false; f:=funct.MainFunction; while (x0+x*FScale)<(Width-BorderRight) do begin if f(x,y) then begin x1:=round(x0+x*FScale); y1:=round(y0-y*FScale); if (x1>BorderLeft) and (x1<width-BorderRight) and (y1>BorderTop) and (y1<height-BorderBottom) then begin PutPixel(x1,y1, funct.Color); end; end; x:=x+0.01; end; end; В данной процедуре используя вызов функции MainFunction объекта класса TChartFunction определяются абсолютные координаты каждой точки графика в диапазоне значений, отображаемых на области отрисовки графика. Используя предварительно заданные масштаб и абсолютные координаты начала координат графика просчитываются координаты каждой точки графика. 2.5.3 Описание методики сохранения графика в графический файл Для сохранения созданного графика в графический файл используется метод SaveToFile класса TChart. В качестве параметра в данный метод передается имя файла в который необходимо сохранять изображение. Данная процедура создает временный объект класса TPicture, копирует канвас графика в канвас вновь созданного объекта и после этого, используя метод TPicture.SaveToFile сохраняет изображение в файл. Полный листинг данного метода представлен на рисунке 7. procedure TChart.SaveToFile(filename: string); var temporary: TPicture; begin temporary:=TPicture.Create; temporary.Bitmap.Width:=width; temporary.Bitmap.Height:=height; Temporary.Bitmap.Canvas.CopyRect(Temporary.Bitmap.Canvas.ClipRect,MainCanvas, MainCanvas.ClipRect); Temporary.SaveToFile(filename); temporary.Destroy; end; 2.6 Описание модулей и форм MainForm (MainUnit.pas) - главная форма программы на которой отображаются вычисления интегралов, а также происходит построение графиков функций AboutForm (Abut.unit) - форма содержащая сведения о разработчике программы EvalForm (EvalFormUnit.pas) - форма для ввода произвольных математических функций SystemInfoForm (SysInfo.pas) - форма отображающая результат выполнения API-функции GetSystemInfo Рисунок 8 - Схема взаимодействия форм приложения 2.7 Вызовы API-функций В качестве задания к курсовому проекту необходимо описать и использовать в программе две API-функции: ClipCursor и GetSystemInfo. 1. Функция ClipCursor содержится в стандартной библиотеке user32.dll Описание функции: function ClipCursor(Rect: TRect); Эта функция заключает курсор в Rect. Если Rect имеет значение nil, то курсор является неограниченным. Параметры: Rect: ограничивающий TRect в координатах экрана. Пример использования данной функции в программе приведен в листинге на рисунке 9. procedure TMainForm.ClipCursor1Click(Sender: TObject); var R: TRect; begin ClipCursor1.Checked:=not ClipCursor1.Checked; if ClipCursor1.Checked then begin GetClipCursor(ClipRect); Left:=MainForm.Left; Right:=MainForm.Left+MainForm.Width; Bottom:=MainForm.Top+MainForm.Height; end; ClipCursor(@R); end else ClipCursor(@ClipRect); end; 2. Функция GetSystemInfo Описание функции: procedure GetSystemInfo(lpSystemInfo: TSystemInfo); Функция в качестве параметра получает указатель на структуру SystemInfo, которую она заполняет. Структуру SystemInfo содержит информацию о текущей системе. dwOemId: DWord Устаревший элемент, предназначенный для совместимости с предыдущими версиями Windows NT (3.5 и ранее). Начиная с Windows 3.51 приложения должны использовать переход wProcessorArchitecture объединения. Windows 95/98/Me: система всегда устанавливает этот элемент, чтобы обнулить значение, определенное для PROCESSOR_ARCHITECTURE_INTEL. wProcessorArchitecture:Word Определяет архитектуру процессора системы. Этим элементом может быть одно из следующих значений: PROCESSOR_ARCHITECTURE_UNKNOWN PROCESSOR_ARCHITECTURE_INTEL PROCESSOR_ARCHITECTURE_MIPS - Windows NT 3.51 PROCESSOR_ARCHITECTURE_ALPHA - Windows NT 4.0 и ранее PROCESSOR_ARCHITECTURE_PPC - Windows NT 4.0 и ранее PROCESSOR_ARCHITECTURE_IA64 - 64-битная версия Windows PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 - 64-битная версия Windows PROCESSOR_ARCHITECTURE_AMD64 - 64-битная версия Зарезервирован для будущего использования. dwPageSize : DWord Определяет размер страницы и степень детализации защиты страницы и блокирования. Это - размер страницы, используемый функцией VirtualAlloc. lpMinimumApplicationAddress: Pointer Указатель на самый низкий адрес памяти, доступный для приложений и библиотек динамической связи (DLLs). lpMaximumApplicationAddress: Pointer Указатель на самый высокий адрес памяти, доступный для приложений и DLLs. dwActiveProcessorMask: DWord Определяет маску, представляющую набор процессоров, конфигурированных в систему. Бит 0 - процессор 0; бит 31 - процессор 31. dwNumberOfProcessors: DWord Определяет количество процессоров в системе. dwProcessorType: DWord Устаревший элемент, предназначенный для совместимости с предыдущими версиями Windows NT (3.5 и ранее). Windows 95/98/Me: Определяет тип процессора в системе. Windows NT: Этот элемент больше не имеет значения, но сохранен для совместимости с Windows 95 и предыдущими версиями Windows NT. Необходимо использовать wProcessorArchitecture, wProcessorLevel, и wProcessorRevision элементы, чтобы определить тип процессора. Этим элементом может быть одно из следующих значений: PROCESSOR_INTEL_386 PROCESSOR_INTEL_486 PROCESSOR_INTEL_PENTIUM PROCESSOR_MIPS_R4000 - Windows NT PROCESSOR_ALPHA_21064 - Windows NT dwAllocationGranularity: DWord Определяет степень детализации распределения виртуальной памяти. wProcessorLevel : Word Windows 95 - этот элемент не поддерживается. Windows NT - определяет архитектурный уровень процессора. 2.8 Методика смешанного программирования
Страницы: 1, 2, 3, 4, 5, 6
|