Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Системы автоматизированного проектирования. Моделирование в машиностроении. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
//Оси координат
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]