Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Системы автоматизированного проектирования. Моделирование в машиностроении. Учебное пособие
.pdf
//Оси координат
glBegin (GL_LINES);
glColor3f (255, 0, 0); glVertex3d(0, 0, 0); glVertex3d(0.7, 0, 0); //X R
glColor3f (0, 255, 0); glVertex3d(0, 0, 0); glVertex3d(0, 0.7, 0); //Y G
glColor3f (0, 0, 255); glVertex3d(0, 0, 0); glVertex3d(0, 0, 1); //Z B
glEnd;
glColor3f (0, 0, 0);
gluQuadricDrawStyle (quadObj, GLU_LINE);
gluQuadricOrientation (quadObj, GLU_OUTSIDE);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluCylinder(quadObj, 0.60, 0.0, 0.95, 20, 20);
glPopMatrix;
SwapBuffers (Canvas.Handle);
end;
if radiobutton6.Checked then //Сфера
begin
glPushMatrix;
glRotatef(120, 1, 0, 0); // поворот объекта - ось X
glRotatef(180, 0, 1, 0); // поворот объекта - ось Y
glRotatef(120, 0, 0, 1); // поворот объекта - ось Z
glClearColor (255, 255, 255, 1);
glClear (GL_COLOR_BUFFER_BIT) ;
//Оси координат
Рисунок 5.6 – Постороение конуса
Построение сферы (рисунок 5.7):
41

glBegin (GL_LINES);
glColor3f (255, 0, 0); glVertex3d(0, 0, 0); glVertex3d(0.7, 0, 0); //X R
glColor3f (0, 255, 0); glVertex3d(0, 0, 0); glVertex3d(0, 0.5, 0); //Y G
glColor3f (0, 0, 255); glVertex3d(0, 0, 0); glVertex3d(0, 0, 0.5); //Z B
glEnd;
glColor3f (0, 0, 0);
gluQuadricDrawStyle (quadObj, GLU_LINE);
gluQuadricOrientation (quadObj, GLU_OUTSIDE);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluSphere (quadObj, 0.35, 20, 20);
glPopMatrix;
SwapBuffers (Canvas.Handle);
end;
end;
Рисунок 5.7 – Постороение сферы
Принимаемые параметры glBegin():
а последняя с первой.
отдельный треугольник.
GL_POINTS - рисует отдельные точки.
GL_LINES - задает примитив отрезок.
GL_LINE_STRIP - перечисляемые вершины соединяются одна за другой.
GL_LINE_LOOP - перечисляемые вершины соединяются одна за другой,
GL_TRIANGLES - вершины берутся тройками по которым строится
42

GL_TRIANGLE_STRIP - связанная группа треугольников, первые три
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
gluDeleteQuadric (quadObj);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
вершины образуют первый треугольник, вершины со 2-ой по 4-ую - второй
треугольник, с 3 по 5 – третий и т.д.
GL_TRIANGLE_FAN - связанная группа треугольников с общей, первой вершиной.
GL_QUADS - задает приметив- четырехугольник, перечисляемые вершины берутся по четыре.
GL_QUAD_STRIP - состоит из связанных четырех угольников.
Для корректной работы необходим также инициализировать обработ-
чики событий OnDestroy. Для этого необходимо в Object Inspector перейти на
вкладку Events, где щелкнуть по событию два раза.
В обработчик события добавить следующий код:
5.2.4 Задание на выполнение работы
Необходимо выполнить следующие действия:
– проверить работу данного программного кода, выполнить изменения
в нем, по указанию преподавателя;
– подписать координатные прямые;
– построить стрелки для координатных прямых;
– построить конус, тор;
– оформить отчет.
Содержание отчета:
– название работы;
– цель работы;
– перечень используемых команд;
– распечатка экранных форм;
– распечатка листинга программы.
5.2.5 Контрольные вопросы
Что такое OpenGL?
Сколько функций входит в состав OpenGL?
43

Какие возможности реализованы в OpenGL?
Что такое glBegin, какие значения параметров она может принимать?
Для чего необходимо описание формата пиксела?
С помощью какой команды осуществляется вращение изображения?
5.3 Построение векторных линий
5.3.1 Цель работы
Целью работы является построение линий, используя функции графической библиотеки OpenGL.
5.3.2 Параметрические уравнения прямых и кривых
Построение всех базовых элементов, сводиться к рисованию точек, которые в дальнейшем образуют рисунок. В случае компьютерной графики,
точками создаются линии, из которых могут быть построены простейшие
геометрические фигуры полигоны. Полигоны могут создавать собой сетку,
которая представляет в трехмерном пространстве какую-либо модель.
Уравнения неявного вида и помогают нам справиться с задачей в случаях, когда применение уравнений явного вида затруднительно или невозможно, они непригодны для непосредственного генерирования точек на кривых, а для определения точек пересечения вынуждают прибегать к численным методам. Существует еще один способ описания прямых и кривых, при
котором координаты х и у считаются равноправными: это уравнения пара-
метрического вида.
Например, окружность и многие другие линии имеют свое аналитическое выражение и записываются в разных формах. Нетрудно записать уравнение окружности в явном виде и решить его относительно координат, однако появится неоднозначность в выборе знака перед радикалом. Однако проще
представить самые различные линии функциями от некоторого параметра-
аргумента, а аргумент сопоставить со временем. При том линия представляется двумя уравнениями: координаты х и у представляются в виде функций
от некоторого вспомогательного параметра t, то есть х = x(t), y = y(t).
Параметрические линии могут быть гораздо более разнообразными,
чем описываемые явными уравнениями. Например, параметризация может
быть такой, чтобы при равномерном изменении параметра текущая точка с
постоянной скоростью двигалась по кривой. Так как такая линия определена
полнее, чем обычная, то мы можем различать совпадающие, то есть нало-
женные друг на друга, линии.
Например, параметрическим способом окружность х
2
+ у2 - 1 = 0 запи-
сывается в виде уравнений х =cos(t) и у = cos(t), где t принимает значения в
интервале 0 <= t < 2р. Хотя обычно нужно указывать область изменения па-
44

раметра t. это может стать преимуществом, если цель является - описать сегмент кривой. Например, параметрические уравнения и условие 2р/3 <= t <=
7р/6 дают полное описание дуги AВС окружности, представленной на рисунке 5.8.
Рисунок 5.8 – Параметрическое представление дуги ABC
Если x(t) и у(t) линейные функции от t, то рассматриваемая кривая будет прямой; в частности, прямая, проходящая через точки P1(x1,y1) и Р2(x2,y2),
определяется при помощи уравнений:
x = х1+ t(х2 – х1);
y =y1 + t(y2 – y1). (5.1)
Точка P(x,y) делит прямую, соединяющую точки Р1 и Р
, на отрезки в
2
отношении t:(1-t).
В отличие от неявных (нормированных) уравнений параметрическое
представление не является единственным, и совершенно различные функции
x(t) и y(t) могут представлять одну и ту же кривую. Для полноты информации
мы дадим здесь параметрические формулы для касательных и нормалей.
Касательная к кривой х = x(t) , у = y(t) в точке Р с параметром t = t1,
определяется уравнениями:
x = X(t) = x(t1) + tx'(t1);
y = y(t) = y(t1) + ty'(t1), (5.2)
где t — параметр на касательной,
x'(t1), y'(t1) - значения производных dx/dt и dy/dt в точке t = t1.
Нормаль, восстановленная к этой кривой, определяется уравнениями:
45

private
DC : HDC; //контекст устройства
hrc: HGLRC; //контекст воспроизведения
procedure TForm1.FormCreate(Sender: TObject);
begin
//Подпись координат осей в "шапке" таблицы
stringgrid1.Cells[0,0]:='X';
stringgrid1.Cells[1,0]:='Y';
DC:=GetDC(Handle); // Получаем контекст устройства
SetDCPixelFormat(DC); // Устанавливаем формат точки
hrc:=wglCreateContext(DC);//Создаем новый контекст воспроизведе-
ния
end;
х = х(t1) + ty'(t1);
у = у(t1) + tx'(t1). (5.3)
5.3.3 Ход работы
Создайте в среде программирования Delphi новый проект, содержащий
одну единственную форму Form1. В разделе uses подключите библиотеку
OpenGL как представлено на рисунке 5.9:
код:
Рисунок 5.9 – Подключение библиотеки OpenGL
В разделе private инициализировать следующие переменные:
В обработчик события OnFormCreate необходимо вписать следующий
46

Зададим формат пиксела, предварительно объявив процедуру в разделе
procedure TForm1.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags:=PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat:=ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
procedure AxisXY; // Процедура построения осей для отрезка и гипер-
болы
var
lbX,lbY:TLabel;
begin
// Устанавливаем текущий контекст воспроизведения
wglMakeCurrent(form1.Canvas.Handle, unit1.Form1.hrc);
glViewPort (-590, -400, 1200, 830); // Устанавливаем область отоб-
ражения
glClearColor (255, 255, 255, 1); // Устанавливаем цвет фона
glClear (GL_COLOR_BUFFER_BIT); // Очистка экрана
glEnable(GL_POINT_SMOOTH); // Устанавливаем режим сглажи-
вания
//Оси
glBegin (GL_LINES);
glColor3f (255, 0, 0); glVertex2f(0, 0); glVertex2f(0.99, 0); //X
glColor3f (0, 255, 0); glVertex2f(0, 0); glVertex2f(0, 1); //Y
glEnd;
//Стрелки
//Y
glBegin (GL_POLYGON);
glVertex2f (0,0.99);
glVertex2f (-0.01,0.94);
glVertex2f (0,0.95);
type:
Прописать процедуру AxisXY, в ней визуализируются координатные
оси и буквы для их обозначения. Код этой процедуры выглядит следующим
образом:
47

glVertex2f (0.01,0.94);
glEnd;
//X
glColor3f (255, 0, 0);
glBegin (GL_POLYGON);
glVertex2f (1,0);
glVertex2f (0.95,-0.01);
glVertex2f (0.96,0);
glVertex2f (0.95,0.01);
glEnd;
//Подписи осей
//Y
lbY:=TLabel.Create(form1);
lbY.Parent:=form1;
lbY.Left:=24;
lbY.Top:=24;
lbY.Caption:='Y';
lbY.Font.Color:=$00FF00;
//X
lbX:=TLabel.Create(form1);
lbX.Parent:=form1;
lbX.Left:=595;
lbX.Top:=405;
lbX.Caption:='X';
lbX.Font.Color:=$0000FF;
end;
Расположение компонентов на форме представлено на рисунке 5.10.
Рисунок 5.10 – Пример размещения компонентов на форме
48

Обработчик кнопки Button1 будет содержать код, реализующий визу-
procedure TForm1.Button1Click(Sender: TObject);
begin
// Устанавливаем текущий контекст воспроизведения
wglMakeCurrent(Canvas.Handle, hrc);
glViewPort (-590, -400, 1200, 830); // Устанавливаем область отоб-
ражения
glClearColor (255, 255, 255, 1); // Устанавливаем цвет фона
glClear (GL_COLOR_BUFFER_BIT); // Очистка экрана
glEnable(GL_POINT_SMOOTH); // Устанавливаем режим сглажи-
вания
AxisXY; // Строим оси
glColor3f (0, 0, 0); // Цвет отрезка
glBegin (GL_LINES); // Параметр объединения двух вершин в отрезок
// Задание координат первой точки
glVertex2f(StrToInt(edit1.Text)/100,StrToInt(edit3.Text)/100);
// Задание координат второй точки
glVertex2f(StrToInt(edit2.Text)/100,StrToInt(edit4.Text)/100);
glEnd;
SwapBuffers(Canvas.Handle); // Выводим сцену на экран
wglMakeCurrent(0, 0); // Обнуляем текущий контекст воспроизведения
button3.Enabled:=false;//Делаем неактивной кнопку "Построить" для
параболы
button5.Enabled:=false;//Делаем неактивной кнопку "Построить" для
гиперболы
end;
ализацию прямой (рисунок 5.11):
Рисунок 5.11 – Пример построения прямой
49

Обработчик кнопки Button2 будет содержать код, реализующий со-
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=-15 to 15 do // Создаем координаты для построения параболы
и записываем их в таблицу
begin
stringgrid1.RowCount:=33; // Увеличиваем количество строк таблицы
до 33-х
stringgrid1.Cells[0,i+16]:=FloatToStrF(i/60,ffFixed, 4, 4); // Координаты
"Х"
stringgrid1.Cells[1,i+16]:=FloatToStrF
(15*StrToFloat(stringgrid1.Cells[0,i+16])*StrToFloat(stringgrid1.Cells[0,i
+16]),
ffFixed, 4, 4); // Координаты "Y"
end;
button3.Enabled:=true; // Делаем активной кнопку "Построить" для па-
раболы
button5.Enabled:=false;// Делаем неактивной кнопку "Построить" для
гиперболы
end;
здание координат для построения параболы и записи их в таблицу (рисунок
5.12):
Рисунок 5.12 – Координаты для построения параболы, записанные в таблицу
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
