Автор работы: Пользователь скрыл имя, 05 Февраля 2015 в 17:04, курсовая работа
Библиотека OpenGLпредставляет из себя интерфейс программирования трехмерной графики. Единицей информации является вершины, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или многоугольниками), устанавливает координаты и параметры камеры и ламп, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для программистов, которым необходимо создать небольшую трехмерную сцену
Министерство
образования и науки Российской Федерации
Рубцовский индустриальный институт (филиал)
ФГБОУ ВПО «Алтайский государственный
технический
университет им. И.И. Ползунова»
Кафедра “Прикладная математика”
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА КУРСОВОЙ РАБОТЫ
По инженерной и компьютерной графике
Шестеренки
тема работы
Руководитель работы E.А.Дудник
подпись дата инициалы, фамилия
Работу выполнил
студент гр.ИВТ-21 Л.В.Воробьёв
подпись дата инициалы, фамилия
Работа защищена с оценкой
Члены комиссии
подпись дата инициалы, фамилия
Рубцовск,
2014
Рубцовский индустриальный институт
Кафедра “Прикладная математика”
Студент Воробьёв Леонид Васильевич Группа ИВТ-21 Курс 3
Тема Шестеренки
стр.3
Нет
Руководитель работы E.А.Дудник
подпись дата инициалы, фамилия
ОГЛАВЛЕНИЕ
Написать программу «Шестеренки» с использованием графической библиотеки OpenGl, реализовать алгоритм кручения механизма, реализовать поворот камеры.
Обозначение в программе |
Предназначение |
tGear=class; |
Класс для хранения параметров шестеренки |
x,y:real; |
Координаты угла поворота камеры |
Radius:real; |
Радиус шестеренки |
Color1:real; |
Цвет RGB-red(Красный) |
Color2:real; |
Цвет RGB-green(Зеленый) |
Color3:real; |
Цвет RGB-blue(Голубой) |
Angle:real; |
Текущий угол поворота |
Speed:real; |
Скорость вращения шестеренки |
Mouse:integer; |
Тип нажатой кнопки мыши |
Spisok:tlist; |
Список шестеренок |
x1, y1:real; |
Координаты курсора |
Tt:tGear; |
Выбранная шестерня |
rg:Boolean; |
Режим расстановки или осмотра |
Procedure init; |
Инициализация графики |
Procedure reinit; |
Деинициализация графики |
Программа «Шестеренка» предназначена для реализации создания и кручения шестеренок, управления камерой, а также для ознакомления пользователя с графической библиотекой OpenGl.
Для работы программы необходимо наличие персонального компьютера (ПК), программы «Project1.exe».
Программа осуществляет свою работу в графическом режиме, создавая изображение на экране с разрешением 1024•768 пикселов (если это позволяет дисплей).
После запуска программы на терминал выводится окно программы, где видно поле для создания шестеренок. Добавление новой шестеренки происходит по двойному нажатию ЛКМ, увеличение/уменьшение шестеренок осуществляется при зажатом ПКМ. Переход в режим трёхмерной графики осуществляется по нажатию клавиши «пробел». Перемещение камеры осуществляется в режиме трёхмерной графики путем перемещения курсора. В режиме трёхмерной графики также возможно создание, масштабирование и перемещение шестеренок.
Если программа при работе “зависла” или выдала сведения об ошибке, то следует обратиться к разработчику программы.
Минимальные системные требования:
Среда разработки Delphi 7
Программа написана на объектно-ориентированном языке ObjectPascal
Unit1.pas – главный модуль программы, в нем содержится описание всех модулей программы.
procedureTForm1.FormCreate(
procedure TForm1.FormDestroy(Sender: TObject); - процедура для обработки событий при закрытии формы
procedure TForm1.Panel1Resize(Sender: TObject); - процедура для обработки событий при «растягивании» формы
procedure TForm1.Timer1Timer(Sender: TObject); - процедура для задачи вращения и передачи вращения другим шестеренкам
procedure DrawGear(g: tgear);-процедура рисования и перетаскивания шестеренок
procedure
TForm1.ApplicationEventsIdle(
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);-процедура обработки нажатия кнопки мыши
procedure TForm1.Panel1DblClick(Sender: TObject);-процедура добавления шестеренки при двойном клике ЛКМ
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);-процедура обработки движения мыши
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);-процедура обнуления координат указателя при отжатии кнопок мыши
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);-процедура обработки нажатий клавиш
procedure PixelFormat(hdc: HDC);-процедура задания формата пикселей
procedure TForm1.init;-процедура инициализации графики
procedure TForm1.reinit;-процедура деинициализации графики
Программа не требует настройки. Достаточно запустить файл «Project1.exe», или используя среду Delphi 7 скомпилировать файл «Project1.dproj»
Если программа «Project1.exe»не выдает сообщений об ошибке, значит программа работает правильно
Не предусмотрено
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, OpenGl, StdCtrls, Grids, ScktComp, Math,
ComCtrls, Sockets;
type
tGear = class // класс для хранения параметров шестеренки
x, y: real; // позиция
radius: real; // радиус
color1: real; // цвет RGB red
color2: real; // green
color3: real; // blue
angle: real; // текущий угол поворота
speed: real; // скорость
end;
TForm1 = class(TForm)
Panel1: TPanel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Panel1Resize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
procedure Panel1DblClick(Sender: TObject);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
public
DC: HDC;
hrc: HGLRC;
spisok: tlist; // список шестеренок
x1, y1: real; // координаты курсора
mouse: integer; // тип нажатой кнопки мыши
tt: tGear; // выбранная шестерня
rg: boolean; // режим расстановки или осмотра
procedure init; // иницилизация графики
procedure reinit; // деиницилизация графики
end;
var
Form1: TForm1;
//массивы для иницилизации освещения
pos1: array[0..3] of glfloat = (2, 2, 2, 0);
dif: array[0..3] of glfloat = (0.5, 0.5, 0.5, 1);
amb: array[0..3] of glfloat = (0.1, 0.1, 0.1, 1);
implementation
{$R *.dfm}
//возвращает расстояние между точками
function Dist2D(x4, y4, x5, y5: real): Real;
begin
Result := Sqrt(sqr(x4 - x5) + sqr(y4 - y5));
end;
//установка начальных
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := ApplicationEventsIdle; //если приложение свободно то выполнять процедуру ApplicationEventsIdle
mouse := 0; // мышь отжата
spisok := tlist.Create; // создаем пустой список шестеренок
init; // иницилизируем OpenGL
randomize; // чтоб случайные числа неповторялись
end;
//выполняется при закрытии программы
procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
reinit; // деиницилизируем графический режим
for i:=0 to spisok.Count-1 do tGear(spisok.Items[i]).Free; //удаляем шестеренки
spisok.Free; //удаляем список
end;
//при растягивании формы
procedure TForm1.Panel1Resize(Sender: TObject);
begin
//изменяем диапазон рисования
glViewPort(0, 0, panel1.ClientWidth, panel1.ClientHeight);
end;
//событие на таймере, каждые 30 мс
//передача вращения на другие шестерни
procedure TForm1.Timer1Timer(Sender: TObject);
var i, j, k: integer;
begin
// сначала всем шестерням кроме первой(у нее номер в списке=0) обнуляем скорость
for i := 1 to spisok.Count - 1 do tGear(spisok.Items[i]).speed := 0;
// потом проходим в цикле для каждой i-той шестерни по всем шестерням(j), столько раз (k) сколько всего шестерней
for k := 0 to spisok.Count - 1 do
for i := 0 to spisok.Count - 1 do
if tGear(spisok.Items[i]).speed <> 0 then // если скорость <> нулю ..
for j := 0 to spisok.Count - 1 do // то ищем кому ее можно передать
if j <> i then // и это не та же шестерня ...
if Dist2D(tGear(spisok.Items[j]).
tGear(spisok.Items[i]).x, tGear(spisok.Items[i]).y)
< (tGear(spisok.Items[j]).radius + tGear(spisok.Items[i]).radius + 0.06) then
if tGear(spisok.Items[j]).speed = 0 then // ..и скорость = нулю
tGear(spisok.Items[j]).speed := -tGear(spisok.Items[i]).speed *
((tGear(spisok.Items[i]).
for i := 0 to spisok.Count - 1 do //увеличиваем текущее положение, крутим шестерни
tGear(spisok.Items[i]).angle := tGear(spisok.Items[i]).angle + tGear(spisok.Items[i]).speed;
end;
//рисование
procedure DrawGear(g: tgear);
var quad: gluquadricobj;
I, n: INTEGER;
h : real;
begin
glLoadIdentity;
if form1.rg then // если режим осмотра то..
begin
glrotate(form1.y1 * 100, 1, 0, 0); // устанавливаем поворот
glrotate(-form1.x1 * 100, 0, 1, 0);
end else
glrotate(4, 1, 0, 0); // иначе чуть чуть развлрачиваем чтоб была видна трехмерность
quad := glunewquadric;
glcolor3f(g.color1, g.color2, g.color3);
gluquadricdrawstyle(quad, GLU_FILL);
gluQuadricNormals(quad, GLU_SMOOTH);
glEnable(GL_COLOR_MATERIAL);
//рисуем цилиндрами и дисками, квадратичными обьектами
glTranslatef(g.x, g.y, 0);
glRotate(g.angle, 0, 0, 1);
h := 0.1;
gluCylinder(quad, 0.015, 0.015, h, 30, 30);
gluCylinder(quad, g.radius * 0.2, g.radius * 0.2, h, 30, 30);
gluCylinder(quad, g.radius * 0.9, g.radius * 0.9, h, 30, 30);
gluCylinder(quad, g.radius * 1.0, g.radius * 1.0, h, 30, 30);
gludisk(quad, 0.015, g.radius * 0.2, 60, 60);
gludisk(quad, g.radius * 0.9, g.radius * 1.0, 60, 60);
glTranslatef(0, 0, h * 0.3);
gludisk(quad, g.radius * 0.2, g.radius * 0.9, 60, 60);
glTranslatef(0, 0, -h * 0.3);
n := round(g.radius * 180);//считаем кол-во зубчиков
//в цикле рисуем зубчики
for i := 1 to n do
begin
glPushMatrix;
glRotate(i * (360 / n), 0, 0, 1);
GLbegin(gl_quads);
glNormal3f(0, 0, -1);
GLvertex3f(g.radius, 0.007, 0);
GLvertex3f(g.radius + 0.03, 0.007, 0);
GLvertex3f(g.radius + 0.03, -0.007, 0);
GLvertex3f(g.radius, -0.007, 0);
glNormal3f(0, -1, 0);
GLvertex3f(g.radius + 0.03, 0.007, 0);
GLvertex3f(g.radius + 0.03, -0.007, 0);
GLvertex3f(g.radius + 0.03, -0.007, h);
GLvertex3f(g.radius + 0.03, 0.007, h);
glNormal3f(-1, 0, 0);
GLvertex3f(g.radius + 0.03, -0.007, 0);
GLvertex3f(g.radius, -0.007, 0);
GLvertex3f(g.radius, -0.007, h);
GLvertex3f(g.radius + 0.03, -0.007, h);
glNormal3f(1, 0, 0);
GLvertex3f(g.radius + 0.03, 0.007, 0);
GLvertex3f(g.radius, 0.007, 0);
GLvertex3f(g.radius, 0.007, h);
GLvertex3f(g.radius + 0.03, 0.007, h);
GLend;
glPopMatrix;
end;
gludeletequadric(quad);
end;
//процедура будет выполняться когда программа свободна
procedure TForm1.ApplicationEventsIdle(
var I: INTEGER;
begin
glLoadIdentity;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glclearcolor(0.30, 0.30, 1.00, 0);
for i := 0 to spisok.Count - 1 do // в цикле отрисовываем шестеренки
DrawGear(tGear(spisok.Items[i]
SwapBuffers(DC);
end;
//если нажимаем кнопку мыши
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);