46548 (571830), страница 2
Текст из файла (страница 2)
Як подальший розвиток анімаційних форматів можна розглядати формати мультимедіа. Вони розроблені для того, щоб зберігати в одному файлі дані різних типів (графіку, звук, відеоінформацію тощо). Формати IFF, RIFF (та його спеціальний випадок — формат AVI), QuickTime (QTIF, в операційній системі Windows — формат MOV), MPEG (а саме MPEG-1, MPEG-2, MPEG-4, MPEG-21) й інші належать до форматів мультимедіа. Формати графічних файлів можна також розділити на такі класи:
• ті, що зберігають зображення в растровому вигляді (BMP, DIB, RLE, TIFF, PCX, PSD, JPEG, PNG, LWF, TGA, MrSID, Scitex CT (.sct), RAW, IFF, CAM, CLP, CPT, CUR, DCM, DCX, IMG, FIF, KDC, LBM, KDC, PBM, PIC, PGM, RAS, RBS, PCD, PIC, PIX, SUN, STING, XPM і ін.);
• ті, що зберігають зображення у векторному вигляді (AutoCAD DXF, Microsoft SYLK, Shockwave Flash і ін.);
• ті, що можуть сполучати растрові й векторні представлення (EPS, РІСТ, CDR, АІ, FH7 й ін.);
• метафайли (CGM, PDF, EMF, WMF, графіка Excel, файли Adobe Table Editor, PLT- та HPGL-графіка, OLE-об'єкти, DXF-графіка, рисунки Lotus РІС та інші), котрі, крім інформації про растрові та/або векторні зображення, містять також інформацію про команди візуалізації.
3. Використовуючи команди надбудови над OpenGl створити тривимірну фігуру та забезпечити її поворот при натисненні на кнопку пробіл
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, Menus;
type
TfrmGL = class(TForm)
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 FormKeyPress(Sender: TObject; var Key: Char);
private
DC : HDC; //контекст пристрою
hrc: HGLRC; //контекст відображення
ry : GLfloat; //зміна координати по У
tx : GLfloat; //зміна координати по Х
end;
var
frmGL: TfrmGL;
mode : (POINT, LINE, FILL) = FILL; //режими відображення обєкта
mx,my:byte; //коефіцієнти збільшення/зменшення
implementation
uses DGLUT;
{$R *.DFM}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очищення буферу кольору
glPushMatrix; //заповнюємо систему координат
glScalef (my/mx, my/mx, my/mx); //виконуємо маштабування
glRotatef (ry, 0.0, 1.0, 0.0); //виконуємо потовот
glTranslatef (tx, 0.0, 0.0); //виконуємо перенесення
case mode of //вибираємо режим відображення
POINT : glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);
LINE : glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
FILL : glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
end;
glutSolidSphere (1.5, 20, 20); //будуємо сферу
glScalef (mx/my, mx/my, mx/my); //повертаємо систему в початкове полож
glPopMatrix; //повертаємо систему в попереднє положення
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
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glColor3f (1.0, 0.0, 0.0);
ry := 0.0;
tx := 0.0;
mx:=10;
my:=10;
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
If Key = VK_LEFT then begin
ry := ry + 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_RIGHT then begin
ry := ry - 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin
tx := tx - 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin
tx := tx + 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = 49 then begin
mode := POINT;
InvalidateRect(Handle, nil, False);
end;
If Key = 50 then begin
mode := LINE;
InvalidateRect(Handle, nil, False);
end;
If Key = 51 then begin
mode := FILL;
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -5.0); // перенос объекта - ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect(Handle, nil, False);
end;
4. Для попереднього практичного завдання вашого варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“
Потім для точного виконання завдання виконала слідуючий алгоритм дій при цьому використала згідно варіанту клавіші «+» та «-», що по умові завдання виконують наближення та відділення фігури на фоні:
procedure TfrmGL.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = '-' then mx:=mx+1;
if key = '+' then mx:=mx-1;
InvalidateRect(Handle, nil, False);
end;
end.
Список використаної літератури
-
С.В.Глушаков, Г.А.Крабе. Компютерная графика, Харьков 2002
-
Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004.
-
OpenGl, технология ставшая символов, Учебник в примерах.
-
Конспект лекцій.
-
Мережа Інтернет.