Автор работы: Пользователь скрыл имя, 05 Февраля 2015 в 17:04, курсовая работа
Библиотека OpenGLпредставляет из себя интерфейс программирования трехмерной графики. Единицей информации является вершины, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или многоугольниками), устанавливает координаты и параметры камеры и ламп, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для программистов, которым необходимо создать небольшую трехмерную сцену
var i: integer;
dd: real;
begin
if Button = mbleft then mouse := 1; //сохраняем код нажатой кнопки: 1- левая, 2 правая
if Button = mbright then mouse := 2;
tt := nil;
for i := 0 to spisok.Count - 1 do //проверяем есть ли под курсором шестерня
begin
dd := Dist2D(x1, y1, tGear(spisok.Items[i]).x, tGear(spisok.Items[i]).y);
if dd < tGear(spisok.Items[i]).radius then // если есть...
tt := tGear(spisok.Items[i]); //.. то сохраняем в tt ссылку на выбранную шестерню
end;
end;
// если двойной шелчек мышью, то добавляем новую шестерню
procedure TForm1.Panel1DblClick(Sender: TObject);
var temp: tGear;
begin
temp := tGear.create; // создаем экземпляр класса
// и устанавливаем параметры
temp.x := x1; // координаты
temp.y := y1;
temp.radius := 0.1; // радиус
temp.color1 := random; // цвет
temp.color2 := random;
temp.color3 := random;
temp.angle := 1; // угол
temp.speed := 0; // скорость =нулю
if spisok.Count = 0 then temp.speed := 3; //если первая шестеренка то ее срость =3
spisok.Add(temp); //добавляем шестерню в список
end;
//если двигаем мышью....
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
//переводим координаты на
x1 := (x - panel1.Width div 2) / (panel1.Width div 2);
y1 := (-(y - (panel1.Height div 2)) / (panel1.Height div 2));
if (mouse = 1) and (tt <> nil) then // если при этом нажата ЛЕВАЯ кнопка и выбрана шестерня то..
begin
tt.x := x1; //.... изменяем ее координаты
tt.y := y1;
end;
if (mouse = 2) and (tt <> nil) then //если при этом нажата ПРАВАЯ кнопка и выбрана шестерня то..
tt.radius := Dist2D(x1, y1, tt.x, tt.y); // .... изменяем ее радиус
end;
//если отжимаем кнопку мыши, то обнуляем переменные
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
mouse := 0;
tt := nil;
end;
//обработка нажатий клавиатуры
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key = 32 then rg := not rg; //если нажали пробел то смена режима - расстановка, просмотр
if key = 112 then // если нажали F1 томеняем режим , полноэкранный - обычный
if BorderStyle= bsNone then
begin
reinit;
BorderStyle := bsSizeable;
WindowState := wsNormal;
init;
end else
begin
reinit;
BorderStyle := bsNone;
WindowState := wsMaximized;
init;
end;
end;
// установка формата пикселей
procedure PixelFormat(hdc: HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: integer;
begin
with pfd do
begin
nsize := sizeof(TPixelFormatDescriptor)
cblueshift := 0; calphabits := 0; calphashift := 0; caccumbits := 0; caccumredbits := 0; caccumgreenbits := 0; caccumbluebits := 0; caccumalphabits := 0;
cdepthbits := 32; cstencilbits := 0; cauxbuffers := 0; ilayertype := PFD_MAIN_PLANE; breserved := 0; dwlayermask := 0; dwvisiblemask := 0; dwdamagemask := 0;
end;
npixelformat := choosepixelformat(hdc, @pfd); setpixelformat(hdc, npixelformat, @pfd);
end;
// иницилизация графики
procedure TForm1.init;
begin
dc := getdc(panel1.Handle);
pixelformat(dc);
hrc := wglcreatecontext(dc);
wglmakecurrent(dc, hrc);
glenable(GL_DEPTH_TEST);
glenable(GL_AUTO_NORMAL);
glenable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
gllightmodel(gl_light_model_
glEnable(GL_LIGHTING);
gllightfv(gl_light1, gl_position, @pos1);
gllightfv(gl_light1, gl_diffuse, @dif);
gllightfv(gl_light1, gl_ambient, @amb);
glEnable(GL_LIGHT1);
glViewPort(0, 0, panel1.ClientWidth, panel1.ClientHeight);
end;
// деиницилизация графики
procedure TForm1.reinit;
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
DeleteDC(DC);
end;
end.