Дипломная работа: Разработка программной системы, обеспечивающей отображение и сравнение в трехмерном пространстве исходных данных из двух матричных форм
vx:Array of Array of Extended;//массив вершин
nx:Array of Array of Array[1..3] of Extended;//массив нормалей
cx:Array of Array of Array[1..3] of GLfloat;//массив цветов
cc:Array of Array of Array[1..3] of GLfloat;//массив цветов
end;
PMatrix = ^TMatrix;
TMat = class(TForm)
Panel1: TPanel;
OpenPictureDialog1: TOpenPictureDialog;
Panel4: TPanel;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
UpDown1: TUpDown;
UpDown2: TUpDown;
Label3: TLabel;
Edit3: TEdit;
GroupBox2: TGroupBox;
Button2: TButton;
FoDialog: TOpenDialog;
Addons: TGroupBox;
SpeedButton1: TSpeedButton;
Button1: TButton;
Button3: TButton;
LBData: TListBox;
ListBox1: TListBox;
cb_Surface: TCheckBox;
progress: TPanel;
Label4: TLabel;
bar: TProgressBar;
ComboBoxMatrix: TComboBox;
BitBtnSave: TBitBtn;
SaveDialogMain: TSaveDialog;
procedure CalcNormals(x1,y1,z1,x2,y2,z2,x3,y3,z3:Extended; var nx,ny,nz:Extended);
procedure GL(var Matrix:TMatrix); //прорисовка матрицы на экран
procedure Init();
procedure SelPos(var Matrix:TMatrix; xx:Integer;yy:Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
//---------------------------------
function LoadMatrixFromBitmap(filename:string; var Matrix:TMatrix):boolean;
function LoadMatrixFromDtFile(filename:string; var Matrix:TMatrix):boolean;
function MakeAnalysMatrixData(Matrix01,Matrix02:TMatrix; var Matrix03:TMatrix):boolean;
//---------------------------------
procedure bmp1Click(Sender: TObject);
procedure Panel4MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel4MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Panel4MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Change(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure cb_SurfaceClick(Sender: TObject);
procedure ComboBoxMatrixChange(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
MyPanels: TRenderPanel;
MCurrent: PMatrix;
myMatrix01:TMatrix; //первое изображение
myMatrix02:TMatrix; //второе изображение
myMatrix03:TMatrix; //наложение первого на второе
// w:Integer; //размерность матрицы
// vx:Array of Array of Extended;//массив вершин
// nx:Array of Array of Array[1..3] of Extended;//массив нормалей
// cx:Array of Array of Array[1..3] of GLfloat;//массив цветов
// cc:Array of Array of Array[1..3] of GLfloat;//массив цветов
mess:string;
bmp:TBitmap;
procedure InitOpenGL;
procedure SetDCPixelFormat(DC:HDC);
end;
var
yess: Boolean;
Mat: TMat;
MouseButton : Integer;
Xcoord, Ycoord, Zcoord : Integer;
YRot, XRot : integer;
Depth : integer;
LastCCX,LastCCY : Integer;
//-----------------------------------------------------------------------------
implementation
//-----------------------------------------------------------------------------
uses UAbout;
{$R *.dfm}
procedure TMat.InitOpenGL;
begin
MyPanels.DC:=GetDC(Panel4.Handle);
SetDCPixelFormat(MyPanels.DC);
MyPanels.HRC:=wglCreateContext(MyPanels.DC);
wglMakeCurrent(MyPanels.DC,MyPanels.HRC);
glEnable(GL_DEPTH_TEST);
glClearColor(0,0,0,1);
end;
procedure TMat.SetDCPixelFormat(DC:HDC);
var
pfd:TPixelFormatDescriptor;
nPixelFormat:Integer;
begin
FillChar(pfd,SizeOf(pfd),0);
pfd.dwFlags:=PFD_DOUBLEBUFFER or
PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL;
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
end;
procedure TMat.FormCreate(Sender: TObject);
begin
MouseButton :=0;
bmp:=TBitmap.Create;
InitOpenGL;
Left:=0;
Top:=0;
LastCCX:=0;
LastCCY:=0;
self.MCurrent := @self.myMatrix01;
self.ComboBoxMatrix.ItemIndex := 0;
// Width:=Screen.Width;
// Height:=Screen.Height;
// WindowState:=wsMaximized;
// Timer1.Enabled:=True;
end;
procedure TMat.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0,0);
bmp.Destroy;
Finalize(myMatrix01.vx);
Finalize(myMatrix01.cx);
Finalize(myMatrix01.cc);
Finalize(myMatrix01.nx);
Finalize(myMatrix02.vx);
Finalize(myMatrix02.cx);
Finalize(myMatrix02.cc);
Finalize(myMatrix02.nx);
Finalize(myMatrix03.vx);
Finalize(myMatrix03.cx);
Finalize(myMatrix03.cc);
Finalize(myMatrix03.nx);
wglDeleteContext(MyPanels.HRC);
ReleaseDC(MyPanels.DC,Panel4.Handle);
DeleteDC(MyPanels.DC);
end;
procedure TMat.GL(var Matrix:TMatrix);
var
j,k,dw,dv : Integer;
ps : TPaintStruct;
av : Integer;
stroka:string;
begin
av:=0;
dw:=0;
dv:=0;
if (Yess=true) then
begin
GroupBox1.Enabled:=True;
dw:=Matrix.w div 2;
dv:=25 div 2;
BeginPaint(Panel4.Handle,ps);
wglMakeCurrent(MyPanels.DC,MyPanels.HRC);
glViewport(0,0,Panel4.Width,Panel4.Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(30,Panel4.Width/Panel4.Height,1,10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0,0,-Zcoord);
glRotatef(Xrot,1,0,0);
glRotatef(Yrot,0,1,0);
try
if (Matrix.w>5) then
If cb_Surface.Checked then av:=2 else av:=1;
case av of
1 : begin
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glColor3f(1,1,1);
glBegin(GL_LINES);
for j:=0 to Matrix.w-2 do
for k:=0 to Matrix.w-2 do
begin
glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);
glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);
glColor3f(Matrix.cx[j,k+1,1],Matrix.cx[j,k+1,2],Matrix.cx[j,k+1,3]);
glVertex3f(j-dw,Matrix.vx[j,k+1]-dv,k+1-dw);
end;
for j:=0 to Matrix.w-2 do
for k:=0 to Matrix.w-2 do
begin
glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);
glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);
glColor3f(Matrix.cx[j+1,k,1],Matrix.cx[j+1,k,2],Matrix.cx[j+1,k,3]);
glVertex3f(j+1-dw,Matrix.vx[j+1,k]-dv,k-dw);
end;
glEnd;
end;
2 : begin
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColor3f(1,1,1);
glBegin(GL_TRIANGLES);
for j:=0 to Matrix.w-2 do
for k:=0 to Matrix.w-2 do
begin
glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);
glNormal3f(Matrix.nx[j,k,1],Matrix.nx[j,k,2],Matrix.nx[j,k,3]);
glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);
glColor3f(Matrix.cx[j+1,k,1],Matrix.cx[j+1,k,2],Matrix.cx[j+1,k,3]);
glNormal3f(Matrix.nx[j+1,k,1],Matrix.nx[j+1,k,2],Matrix.nx[j+1,k,3]);
glVertex3f(j-dw+1,Matrix.vx[j+1,k]-dv,k-dw);
glColor3f(Matrix.cx[j+1,k+1,1],Matrix.cx[j+1,k+1,2],Matrix.cx[j+1,k+1,3]);
glNormal3f(Matrix.nx[j+1,k+1,1],Matrix.nx[j+1,k+1,2],Matrix.nx[j+1,k+1,3]);
glVertex3f(j-dw+1,Matrix.vx[j+1,k+1]-dv,k-dw+1);
end;
for j:=0 to Matrix.w-2 do
for k:=0 to Matrix.w-2 do
begin
glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);
glNormal3f(Matrix.nx[j,k,1],Matrix.nx[j,k,2],Matrix.nx[j,k,3]);
glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);
glColor3f(Matrix.cx[j,k+1,1],Matrix.cx[j,k+1,2],Matrix.cx[j,k+1,3]);
glNormal3f(Matrix.nx[j,k+1,1],Matrix.nx[j,k+1,2],Matrix.nx[j,k+1,3]);
glVertex3f(j-dw,Matrix.vx[j,k+1]-dv,k-dw+1);
glColor3f(Matrix.cx[j+1,k+1,1],Matrix.cx[j+1,k+1,2],Matrix.cx[j+1,k+1,3]);
glNormal3f(Matrix.nx[j+1,k+1,1],Matrix.nx[j+1,k+1,2],Matrix.nx[j+1,k+1,3]);
glVertex3f(j-dw+1,Matrix.vx[j+1,k+1]-dv,k-dw+1);
end;
glEnd;
glDisable(GL_COLOR_MATERIAL);
end;
end;
except
Matrix.w:=0;
MessageBox(Handle,'Ошибка при прорисовке изображения',
'Ошибка',MB_OK or MB_ICONERROR);
end;
EndPaint(Panel4.Handle,ps);
glRotatef(120,1.0,0.0,0.0); // Rotate on x
glRotatef(120,0.0,1.0,0.0); // Rotate on y
glRotatef(120,0.0,0.0,1.0); // Rotate on z
SwapBuffers(MyPanels.DC);
//временная защита кода
// stroka := 'Это демонстрационная версия!!!';
// TextOut(myPanels.DC,300,200,PChar(stroka),Length(stroka));
// stroka := 'Программа сделана на заказ!!!';
// TextOut(myPanels.DC,300,220,PChar(stroka),Length(stroka));
// stroka := 'лоалофв аофоа длфыв а лдо';
// TextOut(myPanels.DC,300,240,PChar(stroka),Length(stroka));
end;
end;
procedure TMat.SelPos(var Matrix:TMatrix; xx:Integer;yy:Integer);
var
fx:Integer;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9