Разработка программы создания виртуальной фотогалереи

Создание помещения галереи, установка параметров графических объектов и вывод на экран комнат фотогалереи, а также осуществление просмотра галереи в автоматическом режиме. Разработка алгоритма перемещения по фотогалерее. Структура модуля Gallery.pas.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 07.06.2012
Размер файла 466,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Федеральное агентство по образованию

Рязанский Государственный Радиотехнический Университет

Кафедра ЭВМ

Пояснительная записка

к курсовой работе на тему

«Разработка программы создания виртуальной фотогалереи»

Выполнил

студент группы 541

Гудков Александр

Поверил

Чичикин В.А

Рязань 2008г.

Введение

В рамках курсовой работы средствами объектно-ориентированного языка Object Pascal и библиотеки OpenGL создано помещение фотогалереи и разработан алгоритм, осуществляющий перемещение по галереи. Пользователь с помощью клавиатуры и мыши перемещаться по ней и рассматривать фотографии. Предусмотрен режим просмотра фотогалереи.

1. Теоретическая часть

Курсовой проект включает два этапа:

1. Разработка алгоритма перемещения по фотогалереи;

2. Создание помещения галереи.

1.1 Разработка алгоритма перемещения по фотогалереи

Одна из возможностей осуществить перемещение по фотогалереи - это перемещать камеру и перерисовывать 3D среду относительно её положения. Это можно осуществить следующим образом:

· Вращать и проецировать позицию камеры следуя командам пользователя;

· Вращать мир вокруг начала координат противоположено вращению камеры (это даёт иллюзию того, что повернулась камера);

· Переместить мир способом, противоположным перемещению камеры (это даёт иллюзию того, что переместилась камера)

Рис 1. Вращение координат

За исходное примем положение, в котором голова смотрит лицом по направлению оси Y, а вверх смотрит по направлению оси Z. Слева направо проходит ось X. Глядя в этом же направлении можно вращать голову вокруг оси Z.

Чтобы повернуть камеру вокруг оси Z применяется оператор вращения мира

glRotate(f, 0, 0, 1),

где f - угол, вращающий мир на -в

Чтобы переместиться вдоль осей X, Y применяется оператор

glTranslatef (tx, ty, 0),

где

ty := ty + sin(f*pi/180)/2;

tx := tx + cos(f*pi/180)/2;

или

ty := ty - sin(f*pi/180)/2;

tx := tx - cos(f*pi/180)/2;

В зависимости от направления движения:

Нажата стрелка «влево» (перемещение по оси X):

ty := ty - sin(f*pi/180)/2;

tx := tx + cos(f*pi/180)/2;

Нажата стрелка «вправо»:

ty := ty + sin(f*pi/180)/2;

tx := tx - cos(f*pi/180)/2;

Нажата стрелка «вверх» (перемещение по оси Y):

ty := ty + sin((f+90)*pi/180)/2;

tx:= tx - cos((f+90)*pi/180)/2;

Нажата стрелка «вниз»:

ty := ty - sin((f+90)*pi/180)/2;

tx := tx + cos((f+90)*pi/180)/2;

Фотогалерея состоит из двух основных комнат, каждая из которых имеет размер 12?12.

Рис 2. Структура фотогалереи

2. Описание модуля Gallery.pas

2.1 Общие сведения

Программная единица представляет собой статическую библиотеку, подключаемую к программе на этапе компиляции.

Наименование модуля Gallery.pas.

Модуль создан на языке Delphi в среде разработки Delphi 7.0

2.2 Функциональное назначение

Создание и перемещение по виртуальной фотогалереи в соответствии с командами пользователя.

2.3 Описание структуры модуля Gallery.pas.

Модуль содержит 13 процедур, реализующих создание галереи и перемещение по ней.

procedure TfrmGL.FormPaint(Sender: TObject)

Процедура обеспечивает установку параметров графических объектов и вывод на экран комнат фотогалереи, а также осуществление просмотра галереи в автоматическом режиме.

procedure TfrmGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

Процедура описывает реакцию программы при изменении положения мыши.

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

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

procedure TfrmGL.FormCreate(Sender: TObject);

Процедура инициализирует переменные и создает ссылку на окно для OpenGL

procedure TfrmGL.FormDestroy(Sender: TObject);

Процедура удаляет все объекты OpenGl, высвобождая память

procedure TfrmGL.FormResize(Sender: TObject);

Процедура перерисовывает окно и создает перспективу

procedure SetDCPixelFormat (hdc : HDC);

Процедура задает формат пикселей для работы c библиотекой OpenGl.

Procedure zal1;

Процедура производит рисование обстановки первой комнаты фотогалереи

Procedure zal2;

Процедура производит рисование обстановки второй комнаты фотогалереи.

Procedure zal0;

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

procedure BmpTexture(name:string; k:boolean);

Процедура производит чтение графического файла `name', который используется в качестве текстуры в помещении фотогалереи.

Procedure kartina;

Процедура производит рисование рамы для картины и загрузку изображения картины.

2.4 Вызов и использование модуля

Для использования процедур модуля необходимо на этапе компиляции подключить модуль к проекту, введя название модуля Gallery в список модулей, перечисленных в предложении uses. После этого можно обратиться к необходимой процедуре.

3. Описание применения программной единицы

Процедуры библиотеки Gallery.pas могут применяться при проектировании любых проектов в среде разработки Delphi , путем подключения модуля на этапе компиляции.

4. Список использованной литературы

1. ЕСПД ГОСТы 19.101, 19.105, 19,401.

2. M. B. Краснов OpenGL. Графика в проектах Delphi. М. 2000.

Текст программного модуля Gallery.pas

unit Gallery.pas;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

OpenGL, ExtDlgs;

type

TfrmGL = class(TForm)

OpenPictureDialog1: TOpenPictureDialog;

procedure FormCreate(Sender: TObject);

procedure FormPaint(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure FormResize(Sender: TObject);

procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

private

DC : HDC;

hrc: HGLRC;

tx,ty,tz,f,t : GLfloat;

quadObj : GLUquadricObj;

lock,zal,kadr:boolean;

wrkx,wrky:Glint;

mode,demonstr:boolean;

time0, time1,FrameTime: GLInt;

count: GLint;

end;

var

frmGL: TfrmGL;

mode : (POINT, LINE, FILL, SILHOUETTE) = FILL;

gluobj : (SPHERE, CONE, CYLINDER, DISK) = SPHERE;

Position1:array [0..3] of GlFloat;

Position:array [0..2] of GlFloat=(0.5,0.5,0.5);

heading,lookupdown :GlFloat;

mpos : TPoint;

float:GlFloat;

Bitmap:TBitmap;

getpict:boolean;

room,pict:byte;

p:0..18;

implementation

uses Unit3,Unit2;

{$R *.DFM}

{====================================================================

Процедура чтение графического файла, который используется в качестве текстуры}

procedure BmpTexture(name:string; k:boolean);

var

// массив образа, 64x64

i,j: Integer;

bits1:array [0..63,0..63,0..2] of Glbyte;

bits2:array [0..31,0..31,0..2] of Glbyte;

begin

Bitmap := TBitmap.Create;

Bitmap.LoadFromFile('image/'+name); // загрузка текстуры из файла

if k then

begin

For i := 0 to 63 do

For j := 0 to 63 do

begin

bits1 [i, j, 0] := GetRValue(Bitmap.Canvas.Pixels [i,j]);

bits1 [i, j, 1] := GetGValue(Bitmap.Canvas.Pixels[i,j]);

bits1 [i, j, 2] := GetBValue(bitmap.Canvas.Pixels[i,j]);

end;

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,

64,64, // здесь задается размер текстуры

0, GL_RGB, GL_UNSIGNED_BYTE, @Bits1);

end

else begin

For i := 0 to 31 do

For j := 0 to 31 do

begin

bits2 [i, j, 0] := GetRValue(Bitmap.Canvas.Pixels [i,j]);

bits2 [i, j, 1] := GetGValue(Bitmap.Canvas.Pixels[i,j]);

bits2 [i, j, 2] := GetBValue(bitmap.Canvas.Pixels[i,j]);

end;

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,

31,31, // здесь задается размер текстуры

0, GL_RGB, GL_UNSIGNED_BYTE, @Bits2);

end;

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_Mag_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

end;

{==============================================================

Создание рамы для картин, а также вывода изображения картин}

Procedure rama;

var

i:byte;

Begin

if (form2.colpic[p]=true)

then

For i:=1 to 4 do

begin

glColor3f(0.72,0.31,0.05);

glNormal3f(0,1,0);

glBegin(Gl_Quads);

glTexCoord2d (0.5,0); glVertex3f(0,0,0);

glTexCoord2d (0.5,2); glVertex3f(0,0,2);

glTexCoord2d (0, 2); glVertex3f(0.2,0.1,1.78);

glTexCoord2d (0, 0); glVertex3f(0.2,0.1,0.18);

glEnd;

glColor3f(0.491,0.25,0.1);

glBegin(Gl_Quads);

glTexCoord2d (0.2, 0); glVertex3f(0.2,0.1,0.18);

glTexCoord2d (0.2, 2); glVertex3f(0.2,0.1,1.78);

glTexCoord2d (0, 2); glVertex3f(0.3,0.05,1.78);

glTexCoord2d (0, 0); glVertex3f(0.3,0.05,0.18);

glEnd;

if getpict

then begin

frmGL.Visible:=true;

frmGL.Enabled:=true;

BMPPIC(p);

glEnable(GL_TEXTURE_2D);

end;

glColor3f(0.9,0.9,0.8);

glBegin(Gl_Quads);

glTexCoord2d (0, 1);

glVertex3f(0.3,0.05,0.3);

glTexCoord2d (1, 1);

glVertex3f(0.3,0.05,1.7);

glTexCoord2d (1, 0);

glVertex3f(1.7,0.05,1.7);

glTexCoord2d (0, 0);

glVertex3f(1.7,0.05,0.3);

glEnd;

glDisable(GL_TEXTURE_2D);

glTranslatef(2,0,0);

glRotatef(-90,0,1,0);

end;

End;

{=============================================================

Процедура создания 3 и 4 комнаты фотогалереи}

Procedure zal0;

var

i,k,j:integer;

quadObj : GLUquadricObj;

Begin

glPushMatrix;

quadObj := gluNewQuadric;

glColor3f (0.9, 0.9, 1); //стены

if (room>=3)

then begin

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (2.0, 0.0); glVertex3f (-12, 12.0, 0);

glTexCoord2d (2.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, 11.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, 11.0, 0);

glEnd;

фотогалерея алгоритм просмотр графический

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (4.0, 0.0); glVertex3f (-12, 11.0, 0);

glTexCoord2d (4.0, 1.0); glVertex3f (-12.0, 11.0, 1);

glTexCoord2d (0.0, 1.0); glVertex3f (-12.0, 7.0, 1);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, 7.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (18.0, 0.0); glVertex3f (-12, 7.0, 0);

glTexCoord2d (18.0, 5.0); glVertex3f (-12.0, 7.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1); // стена

glVertex3f (-12, 11.0, 1);

glVertex3f (-12, 7.0, 1);

glVertex3f (-12.2, 7.0, 1);

glVertex3f (-12.2, 11.0, 1);

glEnd;

end

else begin

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (24.0, 0.0); glVertex3f (-12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);

glEnd;

end;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);//дальняя

glTexCoord2d (12.0, 0.0); glVertex3f (-12, -12.0, 0);

glTexCoord2d (12.0, 5.0); glVertex3f (-12, -12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1); //ближняя

glTexCoord2d (24.0, 0.0); glVertex3f (12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, 12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(-1, 0, 1); //правая стена

glTexCoord2d (24.0, 0.0); glVertex3f (12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);

glEnd;

BmpTexture('WOOD30.bmp',true);

glEnable(GL_TEXTURE_2D);

glTranslatef (0.0, 0.0, 5);

glBegin (GL_QUADS);

glNormal(1,0,-1);

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.2, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.2, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glDisable(GL_TEXTURE_2D);

glTranslatef (0.0, 0.0, -5);

BmpTexture('w.bmp',true);

glEnable(GL_TEXTURE_2D);

glBegin (GL_QUADS);

glNormal3f(1,0,1);

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glDisable(GL_TEXTURE_2D);

glpopMatrix;

glPushMatrix;

glTranslatef(-1.5,-11.9,0.5);

if pict=1 then

begin

//прорисовка рам для картин

glPushMatrix;

glScalef(1.5,1.5,1.5);

p:=9;

rama;

glPopmatrix ;

glTranslatef(13.4,4,0.5);

glRotatef(90,0,0,1);

p:=12;

for j:=1 to 3 do

begin

inc(p);

rama;

glTranslatef(6,0,0);

end;

glTranslatef(1.8,6.9,-0.5);

glRotatef(90,0,0,1);

p:=18;

for j:=1 to 2 do

begin

glPushMatrix;

glScalef(1.5,1.5,1.5);

dec(p);

rama;

glPopmatrix ;

glTranslatef(7,0,0);

end;

glTranslatef(2.7,9,0.5);

glRotatef(90,0,0,1);

p:=13;

for j:=1 to 3do

begin

dec(p);

rama;

glTranslatef(4.5,0,0);

end;

end;

glPopMatrix;

glPushMatrix;

//Прорисовка ограничителей к картинам

glTranslatef (-12, 15, 1);

for k:=1 to 2 do

begin

glTranslatef (0, -4.0, 0.0);

glColor3f (0.7, 0.7, 0.4);

gluCylinder (quadObj, 0.4, 0.4, 4, 20, 1);

for i:=1 to 10 do

begin

glPushMatrix;

glTranslatef (0.4, 0.0, 0);

gluCylinder (quadObj, 0.01, 0.01, 4, 5,1);

glPopMatrix;

glRotatef (36, 0.0, 0.0, 1.0);

end;

glPushMatrix;

gluCylinder (quadObj, 0.8, 0.4, 0.4, 4, 1);

glPopMatrix;

end;

glTranslatef (6, 0, 0);

glPopMatrix;

glPushMatrix;

glTranslatef (11.5, -9.0, 3.5);

For j:=1 to 2 do

Begin

glColor3f(0.7,0.3,0.1);

GlTranslatef(0,2,0);

For i:=1 to 4 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(0,5,0);

end;

glColor3f(1,0,0);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (0, -20.0, 0.0);

glVertex3f (0, -20.0, 0.2);

glVertex3f (0, -5, 0.2);

glVertex3f (0, -5, 0.0);

glEnd;

glTranslatef (-23, -25.5, 0.1);

end;

glPopMatrix;

glPushMatrix;

glTranslatef (-7.5, 11.5, 3.5);

For k:=1 to 2 do

begin

glColor3f(0.7,0.3,0.1);

For i:=1 to 4 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(5,0,0);

end;

glColor3f(1,0,0);

glTranslatef (0, 0, 0.1);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (-5, 0, 0.0);

glVertex3f (-5.0, 0, 0.2);

glVertex3f (-20.0, 0, 0.2);

glVertex3f (-20.0, 0, 0.0);

glEnd;

glTranslatef (-20, -47, -0.1);

end;

GlPopMatrix;

glPushMatrix;

GlTranslatef(-4,-11.5,3.5);

glColor3f(0.7,0.3,0.1);

For i:=1 to 3 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(4,0,0);

end;

glColor3f(1,0,0);

glTranslatef (0, 0, 0.1);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (-4, 0, 0.0);

glVertex3f (-4.0, 0, 0.2);

glVertex3f (-12.0, 0, 0.2);

glVertex3f (-12.0, 0, 0.0);

glEnd;

glPopMatrix;

End;

{=============================================================

Процедура прорисовки первой комнаты}

Procedure zal1;

var

i,k,j:integer;

quadObj : GLUquadricObj;

Begin

glPushMatrix;

quadObj := gluNewQuadric;

glColor3f (0.9, 0.9, 1); //цвет стен

BmpTexture('w.bmp',true);

glEnable(GL_TEXTURE_2D);

if room>=4

then begin

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (19.0, 0.0); glVertex3f (-12, 12.0, 0);

glTexCoord2d (19.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, -7.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -7.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (4.0, 0.0); glVertex3f (-12, -7.0, 0);

glTexCoord2d (4.0, 1.0); glVertex3f (-12.0, -7.0, 1);

glTexCoord2d (0.0, 1.0); glVertex3f (-12.0, -11.0, 1);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -11.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (1.0, 0.0); glVertex3f (-12, -11.0, 0);

glTexCoord2d (1.0, 5.0); glVertex3f (-12.0, -11.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);

glEnd;

end

else begin

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glTexCoord2d (24.0, 0.0); glVertex3f (-12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);

glEnd;

end;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);//дальняя

glTexCoord2d (3.0, 0.0); glVertex3f (-12, -12.0, 0);

glTexCoord2d (3.0, 5.0); glVertex3f (-12, -12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-9.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-9.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);

glTexCoord2d (4.0, 0.0); glVertex3f (-9, -12.0, 0);

glTexCoord2d (4.0, 1); glVertex3f (-9, -12.0, 1);

glTexCoord2d (0.0, 1); glVertex3f (-5, -12.0, 1);

glTexCoord2d (0.0, 0.0); glVertex3f (-5, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);//дальняя

glTexCoord2d (10, 0.0); glVertex3f (-5, -12.0, 0);

glTexCoord2d (10, 5.0); glVertex3f (-5, -12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (5.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (5.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);

glTexCoord2d (4.0, 0.0); glVertex3f (5, -12.0, 0);

glTexCoord2d (4.0, 1); glVertex3f (5, -12.0, 1);

glTexCoord2d (0.0, 1); glVertex3f (9, -12.0, 1);

glTexCoord2d (0.0, 0.0); glVertex3f (9, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1);//дальняя

glTexCoord2d (3.0, 0.0); glVertex3f (9, -12.0, 0);

glTexCoord2d (3.0, 5.0); glVertex3f (9.0, -12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1); //ближняя

glTexCoord2d (24.0, 0.0); glVertex3f (12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (-12.0, 12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, 12.0, 0);

glEnd;

if room>=3 //Прорисовка прохода в третью комнату , если она подключена

then begin

glBegin (GL_QUADS);

glNormal3f(-1, 0, 1); //правая стена

glTexCoord2d (1.0, 0.0); glVertex3f (12, 12.0, 0);

glTexCoord2d (1.0, 5.0); glVertex3f (12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12.0, 11.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, 11.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(-1, 0, 1); //левая стена

glTexCoord2d (4.0, 0.0); glVertex3f (12, 11.0, 0);

glTexCoord2d (4.0, 1.0); glVertex3f (12.0, 11.0, 1);

glTexCoord2d (0.0, 1.0); glVertex3f (12.0, 7.0, 1);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, 7.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(-1, 0, 1); //правая стена

glTexCoord2d (19.0, 0.0); glVertex3f (12, 7.0, 0);

glTexCoord2d (19.0, 5.0); glVertex3f (12.0, 7.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);

glEnd;

end

else begin

glBegin (GL_QUADS);

glNormal3f(-1, 0, 1); //правая стена

glTexCoord2d (24.0, 0.0); glVertex3f (12, 12.0, 0);

glTexCoord2d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);

glTexCoord2d (0.0, 5.0); glVertex3f (12.0, -12.0, 5);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);

glEnd;

end;

//пол и потолок

glTranslatef (0.0, 0.0, 5);

glBegin (GL_QUADS);

glNormal(1,0,-1);

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glDisable(GL_TEXTURE_2D);

glTranslatef (0.0, 0.0, -5);

BmpTexture('blue.bmp',true);

glEnable(GL_TEXTURE_2D);

glBegin (GL_QUADS);

glNormal3f(1,0,1);

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glDisable(GL_TEXTURE_2D);

glpopMatrix;

glPushMatrix;

glTranslatef(-1.5,-11.9,0.5);

if pict=1 then

begin

//рамы для картин

glPushMatrix;

glScalef(1.5,1.5,1.5);

p:=9;

rama;

glPopmatrix ;

glTranslatef(13.4,4,0.5);

glRotatef(90,0,0,1);

p:=12;

for j:=1 to 3 do

begin

inc(p);

rama;

glTranslatef(6,0,0);

end;

glTranslatef(1.8,6.9,-0.5);

glRotatef(90,0,0,1);

p:=18;

for j:=1 to 2 do

begin

glPushMatrix;

glScalef(1.5,1.5,1.5);

dec(p);

rama;

glPopmatrix ;

glTranslatef(7,0,0);

end;

glTranslatef(2.7,4.1,0.5);

glRotatef(90,0,0,1);

p:=13;

for j:=1 to 3do

begin

dec(p);

rama;

glTranslatef(6,0,0);

end;

end;

//Прорисовка ограничителей к картинам

glPopMatrix;

glPushMatrix;

glTranslatef (-13, -12, 1);

For j:=1 to 2 do

begin

for k:=1 to 2 do

begin

glTranslatef (4, 0.0, 0.0);

glColor3f (0.7, 0.7, 0.4);

gluCylinder (quadObj, 0.4, 0.4, 4, 20, 1);

for i:=1 to 10 do

begin

glPushMatrix;

glTranslatef (0.4, 0.0, 0);

gluCylinder (quadObj, 0.01, 0.01, 4, 5,1);

glPopMatrix;

glRotatef (36, 0.0, 0.0, 1.0);

end;

glPushMatrix;

gluCylinder (quadObj, 0.8, 0.4, 0.4, 4, 1);

glPopMatrix;

end;

glTranslatef (6, 0, 0);

end;

glPopMatrix;

glPushMatrix;

glTranslatef (11.5, -10.0, 3.5);

For k:=1 to 2 do

Begin

For j:=1 to 2 do

Begin

glColor3f(0.7,0.3,0.1);

For i:=1 to 5 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

// glTranslatef (0, 0, -1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(0,4,0);

end;

glColor3f(1,0,0);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (0, -4.0, 0.0);

glVertex3f (0, -4.0, 0.2);

glVertex3f (0, -20, 0.2);

glVertex3f (0, -20, 0.0);

glEnd;

glTranslatef (0, -43, 0);

end;

glNormal3f(-1,1,0);

glTranslatef (-23, 50, 0);

end;

glPopMatrix;

glPushMatrix;

glTranslatef (-7.5, 11.5, 3.5);

For k:=1 to 2 do

begin

glColor3f(0.7,0.3,0.1);

For i:=1 to 4 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(5,0,0);

end;

glColor3f(1,0,0);

glTranslatef (0, 0, 0.1);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (-5, 0, 0.0);

glVertex3f (-5.0, 0, 0.2);

glVertex3f (-20.0, 0, 0.2);

glVertex3f (-20.0, 0, 0.0);

glEnd;

glTranslatef (-18, -47, -0.1);

end;

GlPopMatrix;

glPushMatrix;

GlTranslatef(-4,-11.5,3.5);

glColor3f(0.7,0.3,0.1);

For i:=1 to 3 do

begin

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(4,0,0);

end;

glColor3f(1,0,0);

glTranslatef (0, 0, 0.1);

glBegin (GL_QUADS);

glNormal3f(1,1,0);

glVertex3f (-4, 0, 0.0);

glVertex3f (-4.0, 0, 0.2);

glVertex3f (-12.0, 0, 0.2);

glVertex3f (-12.0, 0, 0.0);

glEnd;

glPopMatrix;

End;

{=============================================================

Процедура прорисовки первой комнаты}

Procedure zal2;

var

i,j:integer;

quadObj : GLUquadricObj;

Begin

quadObj := gluNewQuadric;

glPushMatrix;

glColor3f(0.9,0.9,0.8);

glBegin (GL_QUADS);

glNormal3f(1, 0, 1); //левая стена

glVertex3f (-12, 12.0, 0);

glVertex3f (-12.0, 12.0, 5);

glVertex3f (-12.0, -12.0, 5);

glVertex3f (-12.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, 1, 1); //дальняя стена

glVertex3f (12, -12.0, 0);

glVertex3f (12.0, -12.0, 5);

glVertex3f (-12.0, -12.0, 5);

glVertex3f (-12.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(-1,0 , 1); // правая стена

glVertex3f (12, 12.0, 0);

glVertex3f (12.0, 12.0, 5);

glVertex3f (12.0, -12.0, 5);

glVertex3f (12.0, -12.0, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1);//ближняя

glVertex3f (-12, 11.8, 0);

glVertex3f (-12, 11.8, 5);

glVertex3f (-9.0, 11.8, 5);

glVertex3f (-9.0, 11.8, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1);

glVertex3f (-9, 11.8, 0);

glVertex3f (-9, 11.8, 1);

glVertex3f (-5, 11.8, 1);

glVertex3f (-5, 11.8, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(1, 0, 1);

glVertex3f (-9, 11.8, 1);

glVertex3f (-9, 12, 1);

glVertex3f (-5, 12, 1);

glVertex3f (-5, 11.8, 1);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1);//ближняя

glVertex3f (-5, 11.8, 0);

glVertex3f (-5, 11.8, 5);

glVertex3f (5.0, 11.8, 5);

glVertex3f (5.0, 11.8, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1);

glVertex3f (5, 11.8, 0);

glVertex3f (5, 11.8, 1);

glVertex3f (9, 11.8, 1);

glVertex3f (9, 11.8, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(1, 0, 1);

glVertex3f (5, 11.8, 1);

glVertex3f (5, 12, 1);

glVertex3f (9, 12, 1);

glVertex3f (9, 11.8, 1);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1);//ближняя

glVertex3f (9, 11.8, 0);

glVertex3f (9.0, 11.8, 5);

glVertex3f (12.0, 11.8, 5);

glVertex3f (12.0, 11.8, 0);

glEnd;

glBegin (GL_QUADS);

glNormal3f(0, -1, 1); // стена

glVertex3f (-0.25, -4.0, 0);

glVertex3f (-0.25, -4.0, 5);

glVertex3f (0.25, -4.0, 5);

glVertex3f (0.25, -4.0, 0);

glEnd;

glPushMatrix;

glTranslatef(-0.75,0,0);

glNormal3f(-1,0 , 1); // перегородка правая стена

For i:=1 to 2 do

begin

glTranslatef(0.5,0,0);

glBegin (GL_QUADS);

glVertex3f (0, 12.0, 0);

glVertex3f (0, 12.0, 5);

glVertex3f (0, -4.0, 5);

glVertex3f (0, -4.0, 0);

glEnd;

glNormal3f(1,0 , 1); // перегородка левая стена

end ;

glpopMatrix;

BmpTexture('Roof.bmp',true);

glEnable(GL_TEXTURE_2D);

glBegin (GL_QUADS); //пол и потолок

glNormal3f(0,0 , 1);

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glDisable(GL_TEXTURE_2D);

glTranslatef (0.0, 0.0, 5);

BmpTexture('паркет.bmp',true);

glColor3f(1,1,1);

glEnable(GL_TEXTURE_2D);

glNormal(0,0,1);

glBegin (GL_QUADS); //пол и потолок

glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);

glTexCoord2d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);

glTexCoord2d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);

glTexCoord2d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);

glEnd;

glEnable(GL_COLOR_Material);

glDisable(GL_TEXTURE_2D);

glTranslatef (0.0, 0.0, 5);

glPopMatrix;

glPushMatrix;

if pict=2 then

begin

glTranslatef(-5,-11.8,0.5);

p:=0;

for j:=1 to 2 do //рамы для картин

begin

glPushmatrix;

glScalef(1.5,1.5,1.5);

inc(p);

rama;

glPopMatrix ;

glTranslatef(7,0,0);

end;

glTranslatef(2.9,4,0.5);

glRotatef(90,0,0,1);

p:=2;

for j:=1 to 3 do

begin

inc(p);

rama;

glTranslatef(6,0,0);

end;

glTranslatef(1.8,6,0);

glRotatef(90,0,0,1);

glTranslatef(17.7,4.1,0);

glRotatef(90,0,0,1);

p:=9;

for j:=1 to 3 do

begin

dec(p);

rama;

glTranslatef(6,0,0);

end;

end;

//Прорисовка ограничителей к картинам

glPopMatrix;

glPushMatrix;

GlTranslatef(0.8,0,3.5);

For j:=1 to 2 do

begin

For i:=1 to 3 do

begin

glColor3f(0.7,0.3,0.1);

gluCylinder (quadObj, 0.07, 0.07,1.5, 6, 1);

gluDisk (quadObj, 0, 0.08, 10, 1);

GlTranslatef(0,4.5,0);

end;

glColor3f(1,0,0);

glTranslatef (0, -4.5, 0.1);

glBegin (GL_QUADS);

glVertex3f (0, 0, 0.0);

glVertex3f (0, 0, 0.2);

glVertex3f (0, -9, 0.2);

glVertex3f (0, -9, 0.0);

glEnd;

GlTranslatef(-1.6,-9,-0.1);

end;

glPopMatrix;

glTranslatef (-7.3, -11.9, 1);

End;

{=======================================================================

Перерисовка окна}

procedure TfrmGL.FormPaint(Sender: TObject);

begin

Position1 [0]:=0; //Установка

Position1 [1]:=3; //положения

Position1 [2]:=4; //источников

Position1 [3]:=12; //света

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);// очистка буфера цвета

glLightfv(GL_LIGHT0,GL_PosiTion, @position1); //Загрузка источников света

glMaterialfv (GL_FRONT, GL_SPECULAR, @Position); //установка свойств материала

if Lock //Проверка блокировки указателя

then SetCursorPos(wrkX,wrkY);

if not mode

then glPolygonMode(GL_FRONT_AND_BACK,GL_LINE) //Установка стиля рисования линиями

else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //Установка стиля рисования с заполнением

glPushMatrix; //Сохранение исходного состояния матрицы

glRotate(f, 0, 0, 1); //поворот "мира" на угол f

glTranslatef (tx, ty, tz); //Перемещение по галереи

glPushMatrix;

zal1; // вызов процедуры рисования первой комнаты

glPopMatrix;

glPushMatrix;

glTranslatef(0,-24,0);

zal2; //вызов процедуры рисования второй комнаты

glPopMatrix;

if room>=3 then

begin

glTranslatef(24.2,0,0);

glPushMatrix;

zal0; //вызов процедуры рисования третьей комнаты

glPopMatrix;

end;

if room>=4 then

begin

glTranslatef(-48.4,0,0);

glRotatef(180,0,0,1);

glPushMatrix;

zal0; //вызов процедуры рисования четвертой комнаты

glPopMatrix;

end;

glPopMatrix;

if demonstr

then //Запуск режима демонстрации

begin

count:= count+1;

tx:=0;

ty:=0;

case count of

2:begin

f:=0;

pict:=1;

end;

3..61:f:=f+6;

62..78:ty:=(count-62)*0.5;

79..92:begin

ty:=8;

tx:=tx+(count-78)*0.5;

f:=f+6;

end;

93..133:begin

ty:=-(count-93)*0.4+8;

tx:=7;

end;

134..150:begin

ty:=-8;

tx:=7;

f:=f+6

end;

151..177:begin

ty:=-7.5;

tx:=-(count-151)*0.5+7;

end;

178..193:begin

ty:=-7.5;

tx:=-6;

f:=f+6;

end;

194..223:begin

ty:=(count-193)*0.5-7.5;

tx:=-6.5;

end;

224..229:begin

tx:=-6.5;

ty:=7.5;

f:=f+6;

end;

230..236:begin

pict:=2;

tx:=-6.5;

ty:=7.5;

f:=f+6;

end;

237..256:begin

pict:=2;

tx:=-6.5;

ty:=(count-236)*0.5+7.5;

end;

257..265:begin

tx:=-6.5;

ty:=14.5;

f:=f-6;

end;

266..296:begin

ty:=(count-265)*0.5+14.5;

tx:=-6.5;

end;

297..307:begin

tx:=-6.5;

ty:=29.5;

f:=f+6;

end;

308..332:begin

tx:=(count-308)*0.5-6.5;

ty:=29.5;

end;

333..345:begin

tx:=6.5;

ty:=29.5;

f:=f+6;

end;

346..374:begin

ty:=-(count-346)*0.5+29.5;

tx:=6.5;

end;

375..380:begin

tx:=6.5;

ty:=15.5;

f:=f+6;

end;

381..406:begin

pict:=1;

tx:=6.5;

ty:=15.5;

f:=f+6;

end;

407..420:begin

pict:=2;

tx:=6.5;

ty:=15.5;

f:=f+6;

end;

else begin

tX:=0;

tY:=-10;

f:=0;

demonstr:=false;

count:=1;

end

end;

end;

if kadr

then begin //Запуск режима отображения времени построения 1 кадра

time0:= GetTickCount;

FrameTime:=time0 - time1;

time1:=time0;

FRMGL.Caption :=inttostr(count)+'кадр 3а '+ inttostr(Frametime)+'мс ';

end

else

FRMGL.Caption :='Gallery ';

SwapBuffers(DC);

end;

{=======================================================================

Формат пикселя}

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 TfrmGL.FormCreate(Sender: TObject);

begin

room:=2;

DC := GetDC (Handle);

SetDCPixelFormat(DC);

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (1, 1, 0.9, 1.0); // цвет фона

glLineWidth (1.5);

glEnable (GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

glEnable (GL_COLOR_MATERIAL);

quadObj := gluNewQuadric;

tX:=0;

tY:=-10;

tZ:=-2;

demonstr:=false;

count:=1;

lock:=true;

pict:=1;

zal:=false;

mode:=true;

form2.prosmotr:=false;

getpict:=true;

p:=0;

t:=0;

f:=0;

ShowCursor(false);

wrkX:=Left+round(Width/2);

wrkY:=Top+round(Height/2);

SetCursorPos(wrkx,wrky);

end;

{=======================================================================

Конец работы приложения}

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

gluDeleteQuadric (quadObj);

wglMakeCurrent(0, 0);

wglDeleteContext(hrc);

ReleaseDC (Handle, DC);

DeleteDC (DC);

end;

procedure showimage(number:byte);

begin

Form3.Visible:=true;

Form3.Image1.Center:=true;

Form3.Image1.AutoSize:=true;

if fileexists (form2.nameimage[number]) then

begin

form3.Image1.Picture.LoadFromFile(form2.nameimage[number]);

form3.deleteimage.Enabled:=true;

form3.rotate90.Enabled:=true;

form3.Rotate180.Enabled:=true;

end

else

begin

form3.Image1.Picture:=nil;

form3.rotate90.Enabled:=false;

form3.Rotate180.Enabled:=false;

form3.deleteimage.Enabled:=false;

end;

Form3.Height:=Form3.Image1.Height+60;

Form3.Width:=Form3.Image1.Width+35;

frmGl.Visible:=false;

ShowCursor(true);

frmgl.hide;

showcursor(true)

end;

{==============================================================

Процедура реакции программы на нажатие пользователем клавиш управления}

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

var

tx0,ty0:Glfloat;

var

kolfile:byte;

begin

If Key = VK_ESCAPE then

begin

ShowCursor(true);

form2.Visible:=true;

form2.DirectoryListBox1.Directory:=form2.directory+'/download';

form2.FilterComboBox1.Filelist.Mask:='*.bmp';

for kolfile:=1 to 17 do

begin

if fileexists(form2.directory+'/download/fotogallery'+inttostr(kolfile)+'.bmp') then

if deletefile(form2.directory+'/download/fotogallery'+inttostr(kolfile)+'.bmp') then

form2.FileListBox1.DeleteSelected;

Form2.colpic[kolfile]:=false;

end ;

form2.DirectoryListBox1.Directory:=form2.directory;

form2.FilterComboBox1.Filelist.Mask:=form2.mask;

frmgl.close;

end;

if Key=VK_Return

then

begin

if (ty<-6) and (ty>-12) and (tx>0) and (tx<8)

then begin form3.number:=16; showimage(form3.number); end;

if (ty>-9) and (ty<-3) and (tx>3) and (tx<12)

then begin form3.number:=12; showimage(form3.number); end;

if (ty>-3) and (ty<4) and (tx>3) and (tx<12)

then begin form3.number:=11; showimage(form3.number); end;

if (ty>4) and (ty<12) and (tx>3) and (tx<12)

then begin form3.number:=10; showimage(form3.number); end;

if (ty<-6) and (ty>-12) and (tx>-8) and (tx<0)

then begin form3.number:=17; showimage(form3.number); end;

if (ty>-9) and (ty<-3) and (tx>-12) and (tx<-3)

then begin form3.number:=15; showimage(form3.number); end;

if (ty>-3) and (ty<4) and (tx>-12) and (tx<-3)

then begin form3.number:=14; showimage(form3.number); end;

if (ty>4) and (ty<12) and (tx>-12) and (tx<-3)

then begin form3.number:=13; showimage(form3.number); end;

if (ty>2) and (ty<12) and (tx>-6) and (tx<6)

then begin form3.number:=9; showimage(form3.number); end;

if (ty>12) and (ty<20) and (tx>1) and (tx<12)

then begin form3.number:=8; showimage(form3.number); end;

if (ty>20) and (ty<28) and (tx>1) and (tx<12)

then begin form3.number:=7; showimage(form3.number); end;

if (ty>28) and (ty<36) and (tx>1) and (tx<12)

then begin form3.number:=6; showimage(form3.number); end;

if (ty>12) and (ty<20) and (tx>-11) and (tx<-1)

then begin form3.number:=5; showimage(form3.number); end;

if (ty>20) and (ty<28) and (tx>-11) and (tx<-1)

then begin form3.number:=4; showimage(form3.number); end;

if (ty>28) and (ty<35) and (tx>-11) and (tx<-1)

then begin form3.number:=3; showimage(form3.number); end;

if (ty>30) and (ty<35) and (tx>0) and (tx<8)

then begin form3.number:=1; showimage(form3.number); end;

if (ty>30) and (ty<35) and (tx>-8) and (tx<0)

then begin form3.number:=2; showimage(form3.number); end;

end;

if Key=VK_F1

then begin

lock:=false;

Application.HelpFile:='Help\Help.hlp';

Application.HelpCommand(HELP_FINDER,0);

end;

if Key=VK_F2

then begin

if lock

then ShowCursor(true)

else ShowCursor(false);

lock:=not lock;

end;

if Key=VK_F3

then begin

demonstr:=not demonstr;

count:=1;

end;

If Key = VK_F4

then kadr:=not kadr;

if Key=VK_F5

then getpict:=not getpict;

if Key=VK_F8

then begin

zal:=true;

room:=room+1;

end;

if not demonstr

then begin

If Key = VK_Left then

begin

ty0:=ty;

tx0:=tx;

ty := ty - sin(f*pi/180)/2;

tX := tX + cos(f*pi/180)/2;

end;

If Key = VK_Right then

begin

ty0:=ty;

tx0:=tx;

ty := ty + sin(f*pi/180)/2;

tX := tX - cos(f*pi/180)/2;

end;

If Key = VK_up then

begin

ty0:=ty;

tx0:=tx;

ty := ty + sin((f+90)*pi/180)/2;

tX := tX - cos((f+90)*pi/180)/2;

end;

If Key = VK_down then

begin

ty0:=ty;

tx0:=tx;

ty := ty - sin((f+90)*pi/180)/5;

tX := tX + cos((f+90)*pi/180)/5;

end;

If Key = VK_delete then

tz:=tz-0.5;

If Key = VK_insert then

tz:=tz+0.5;

if room=2

then

begin

if (tx<=-11) and (tx>=-12)

then

tx:=-11;

end

else begin

if (tx<=-11)and (tx>=-12)and (((ty>-12) and (ty<-10.5))or((ty>-6.5) and (ty<36)))

then

tx:=-11;

if (tx>=-13)and (tx<=-12)and(((ty>-12) and (ty<-10.5))or((ty>-6.5) and (ty<36)))

then

tx:=-13;

end;

if room>=4

then begin

if (tx>=11)and (tx<=12)and (((ty>-12) and (ty<6.5))or((ty>10.5) and (ty<36)))

then

tx:=11;

if (tx<=13)and (tx>=12)and(((ty>-12) and (ty<6.5))or((ty>10.5) and (ty<36)))

then

tx:=13;

end

else if tx>=11

then tx:=11;

if (ty<=-11)

then ty:=-11;

if (ty>=35)

then ty:=35;

if (ty>11.4) and (ty<12.4) and ((tx>8) or (tx<-8) or ((tx<5) and (tx>-5)))

then begin

ty:=ty0;

end;

if (ty>12) and (ty<28.4) and (tx>-0.8) and (tx<0.8)

then

tx:=tx0;

if (tx>-0.8) and (tx<0.8) and (ty<28.4) and (ty>27)

then

ty:=ty0;

if (ty<12)// and (tx<12) and (tx>-12)

then pict:=1

else begin

{if tx<-12

then pict:=1 ;

if tx>12

then pict:=1

else }pict:=2

end;

end;

InvalidateRect(Handle, nil, False);

end;

{======================================================================

Процедура перерисовки галереи}

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

gluPerspective(50, Width/Height, 0.1, 48.2);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

glRotatef(90.0, 1.0, 0.0, 0.0); // поворот объекта - ось Y

InvalidateRect(Handle, nil, False);

end;

{====================================================================

Процедура реакции программы на перемещене мыши}

procedure TfrmGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if Lock

then

begin

GetCursorPos(mpos);

if not demonstr

then begin

f:=f-(mpos.x-(wrkX))/8;

t:=t+(mpos.y-(wrkY))/8;

end;

InvalidateRect(Handle,nil,False);

end

Размещено на Allbest.ru


Подобные документы

  • Этапы создания презентации: знакомство с программой, добавление графиков и диаграмм, рисование и вставка графических и анимационных объектов. Добавление графических клипов из Clip Gallery. Создание и запуск слайд-фильма. Настройка программы Power Point.

    контрольная работа [27,2 K], добавлен 07.12.2010

  • Вывод графических файлов на компонент Picture. Действия Visual Basic по умолчанию. Создание графического интерфейса пользователя. Циклический показ фотографий. Формирование списка изображений и их циклический вывод на экран с определенным интервалом.

    курсовая работа [3,2 M], добавлен 05.01.2013

  • Математическое описание операций преобразования плоских фигур. Выбор и обоснование языка программирования и среды разработки. Задание базовой фигуры. Разработка алгоритма работы программы. Проверка корректности работы программы в различных режимах.

    курсовая работа [567,6 K], добавлен 13.10.2014

  • Считывание информации из файла, анализ заголовка. Установка видеорежима и анализ его параметров. Разработка процедуры вывода изображения на экран. Методы вывода сообщений. Разработка алгоритма, удовлетворяющего требованиям задания и интерфейса программы.

    курсовая работа [23,6 K], добавлен 17.05.2013

  • Разработка программы с целью создания изображений графических примитивов на поверхности формы. Передача координат и плоскости рисования в функцию алгоритма разложения прямой линии. Расчет параметров для построения круга, особенности прорисовки эллипса.

    контрольная работа [220,7 K], добавлен 27.04.2012

  • Разработка игровой программы "Frag the monster", которая осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов (оружия). Обоснование выбора языка программирования - С++. Интерфейс и принцип работы программы.

    курсовая работа [3,2 M], добавлен 27.12.2011

  • Эффективность web-сайта в процессе развития компании, этапы его проектирования. Средства для создания web-сайтов. Разработка web-сайта для праздничного агентства "Креатив", его структура и функциональные возможности. Создание главного меню и галереи.

    курсовая работа [919,8 K], добавлен 20.01.2016

  • Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.

    курсовая работа [254,0 K], добавлен 02.07.2011

  • Разработка и реализация программы расчета заданных функций на языке программирования VBA. Математическая модель, параметры и характеристики задачи, критерии оценки эффективности созданного модуля. Разработка алгоритма и тестирование программного модуля.

    курсовая работа [488,7 K], добавлен 08.09.2010

  • Анализ задания и разработка алгоритма. Основные принципы создания программы. Схема взаимодействия процессов Process 1 и Process 4, в режиме задачи и в режиме ядра. Листинг программы и ее тестирование. Результат работы и выполнения программы в консоли.

    контрольная работа [395,9 K], добавлен 18.09.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.