Курсовая работа: Метод наискорейшего спуска
Литература
1. А.Я. Архангельский Программирование в Delphi 5.0. – М.: ЗАО “Издательство БИНОМ”, 2000 г.
2. Боресков А.В., Шикин Е.В., Шикина Г.Е. Компьютерная графика: первое знакомство; Под ред. Е.В. Шикина. - М.: Финансы и статистика, 1996. - 176 с.: ил. - (Диалог с компьютером).
3. Краснов М.В. OpenGL графика в проектах Delphi, БХВ-Санкт-Петербург, 2000. – 352 с.
Приложение А
Листинг программы
Файл Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,OpenGL, Grids, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Panel1: TPanel;
Label2: TLabel;
StringGrid1: TStringGrid;
RadioButton1: TRadioButton;
Button2: TButton;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit3: TEdit;
Label7: TLabel;
UpDown1: TUpDown;
Edit4: TEdit;
ComboBox1: TComboBox;
Edit5: TEdit;
Label8: TLabel;
Edit6: TEdit;
Label9: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button2Click(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit4Change(Sender: TObject);
procedure Edit5Change(Sender: TObject);
procedure Edit6Change(Sender: TObject);
private
DC : HDC;
hrc: HGLRC;
{ Private declarations }
end;
type TE = array [0..2,0..2] of glfloat;
type TM = array [0..2] of glfloat;
var
Form1: TForm1;
x,y,z,m,a,b,c,d,masht : glfloat;
mx,my,mz: TE;
mm : TM;
xmaus,ymaus,rt,verx: integer;
implementation
{$R *.DFM}
{Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{====================================================
Создание формы}
procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC (Form1.Panel1.Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
glEnable(GL_DEPTH_TEST);
x:=0.0;
y:=0.0;
z:=0.0;
m:=1.0;
a:=0.0;
b:=0.0;
c:=0.0;
xmaus:= 0;
ymaus:=0 ;
masht:=0;
rt:= 0 ;
verx:= 0;
StringGrid1.Cells[0,0]:='1';
tringGrid1.Cells[0,1]:='0';
tringGrid1.Cells[0,2]:='0';
tringGrid1.Cells[0,3]:='0';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hx,hy,x0,y0,f0,gx,gy,e,f1: real;
i : integer;
begin
StringGrid1.ColCount:=1;
hx:=0.001;
hy:=0.002;
e:=0.002;
x0:=StrToInt(Edit1.Text);
y0:=StrToInt(Edit2.Text);
if(ComboBox1.ItemIndex=0) then begin
f0:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
f0:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
f0:=sin(x0)*cos(y0*y0);
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
if(ComboBox1.ItemIndex=1) then
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
if(ComboBox1.ItemIndex=2) then
f1:=sin(x0)*cos(y0*y0);
StringGrid1.Cells[0,0]:='1';
StringGrid1.Cells[0,1]:=FloatToStr(x0);
StringGrid1.Cells[0,2]:=FloatToStr(y0);
StringGrid1.Cells[0,3]:=FloatToStr(f1);
if f1<f0 then begin
hx:=hx/2;
hy:=hy/2;
end;
i:=1;
while not((abs(gx)<e) and (abs(gy)<e))do
begin
f0:=f1;
if(ComboBox1.ItemIndex=0) then begin
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
if(ComboBox1.ItemIndex=1) then
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
if(ComboBox1.ItemIndex=2) then
f1:=sin(x0)*cos(y0*y0);
StringGrid1.Cells[i,0]:=IntToStr(i+1);
StringGrid1.Cells[i,1]:=FloatToStr(x0);
StringGrid1.Cells[i,2]:=FloatToStr(y0);
StringGrid1.Cells[i,3]:=FloatToStr(f1);
i:=i+1;
StringGrid1.ColCount:=i;
if f1<f0 then begin
hx:=hx/2;
hy:=hy/2;
end;
end;
Label1.Caption:=FloatToStr(f1);
refresh;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{====================================================
Конец работы приложения}
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Panel1.Handle, DC);
DeleteDC (DC);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -5); // перенос объекта - ось Z
InvalidateRect(Panel1.Handle, nil, False);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
i,j: real;
zz,xl,yl,zl,zlm,stg,h: glfloat;
fy,fx,clr,clb,obl : real;
it,wn : integer;
mm1,mm2,mm3,mm4 : array [0..5] of TM;
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
xl:=0;
yl:=0;
zl:=0;
zlm:=StrToFloat(StringGrid1.cells[0,3]);
stg:=StringGrid1.ColCount;
clr:=0;
clb:=1.0;
h:=StrToFloat(Edit3.text);
wn:=StrToInt(Edit5.text);
obl:= StrToFloat(Edit6.Text);
//ox oy oz
glscalef(masht,masht,masht);
glLineWidth(3);
glcolor3f(1.0,1.0,1.0);
glBegin(GL_Lines);
glVertex3f(-1,-1,1);
glVertex3f(1,-1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,-1,-1);
glend;
glLineWidth(1);
glcolor3f(1.0,1.0,0.0);
glBegin(GL_Lines);
//x
glVertex3f(1.1-0.03,-1+0.1,1);
glVertex3f(1.1+0.03,-1-0.1,1);
glVertex3f(1.1+0.03,-1+0.1,1);
glVertex3f(1.1-0.03,-1-0.1,1);
//z
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.1,1);
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.2,1);
glVertex3f(-1-0.03,1.2,1);
glVertex3f(-1+0.03,1.2,1);
//y
glVertex3f(-1,-1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1-0.03,-1+0.2,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1+0.03,-1+0.2,-1-0.1);
glend;
// if(ComboBox1.ItemIndex=1) then begin
/f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
/f1:=sin(x0)/(x0+y0*y0+1);
i:=-wn;
j:=-wn;
while j<=wn do begin
i:=-wn;
yl:=j;
//glBegin(GL_points);
glBegin(GL_Lines);
glcolor3f(clr,0.0,clb);
while i<=wn do begin
xl:=i; //f(x) ==
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);