Разработка программы создания виртуальной фотогалереи
Создание помещения галереи, установка параметров графических объектов и вывод на экран комнат фотогалереи, а также осуществление просмотра галереи в автоматическом режиме. Разработка алгоритма перемещения по фотогалерее. Структура модуля 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