Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 994 / 126 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 5:

Основные графические примитивы OpenGL и их свойства

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

Четырехугольники

Библиотека OpenGL реализуется два примитива для рисования четырехугольников: несвязанные четырехугольники и четырехугольники с общей гранью.

Несвязанные четырехугольники

Для формирования данного примитива с использованием библиотеки OpenTK на C# в качестве параметра метода Begin класса GL необходимо указать значение Quads перечисления BeginMode. В Object Pascal для этого необходимо процедуре glBegin в качестве параметра указать константу GL_QUADS.

Для формирования каждого очередного четырехугольника используются четыре вершины. Если задано меньше 4 вершин, то четырехугольник не формируется. Порядок обхода вершин определяется последовательностью задания вершин. На рис. 4.8 отображены два четырехугольника, которые заданы с помощью 8 вершин ( пример 4.7 и пример 4.8).

GL.Begin(BeginMode.Quads);
  // первый четырехугольник
  GL.Vertex3(-0.9, -0.6, 0);
  GL.Vertex3(-0.9, 0.6, 0);
  GL.Vertex3(-0.3, 0.6, 0);
  GL.Vertex3(-0.3, -0.6, 0);
  // второй четырехугольник
  GL.Vertex3(0.3, -0.6, 0);
  GL.Vertex3(0.3, 0.6, 0);
  GL.Vertex3(0.9, 0.6, 0);
  GL.Vertex3(0.9, -0.6, 0);
GL.End(); 
Листинг 4.7. Пример формирования несвязанных четырехугольников с использованием библиотекие OpenTK на C#
glBegin(GL_QUADS);
  // первый четырехугольник
  glVertex3f(-0.9, -0.6, 0);
  glVertex3f(-0.9, 0.6,  0);
  glVertex3f(-0.3, 0.6, 0);
  glVertex3f(-0.3, -0.6,  0);
  // второй четырехугольник
  glVertex3f(0.3, -0.6, 0);
  glVertex3f(0.3, 0.6,  0);
  glVertex3f(0.9, 0.6, 0);
  glVertex3f(0.9, -0.6,  0);
glEnd;
Листинг 4.8. Пример формирования несвязанных четырехугольников на Object Pascal
Схема формирования  несвязанных четырехугольников

Рис. 4.8. Схема формирования несвязанных четырехугольников

В плоскости XY четырехугольники могут формироваться с помощью команды

Rect [d f I s][v]. 

В C# команда реализуется с помощью набора статических методов класса GL, например:

void Rect(double x1, double y1, double x2, double y2);
void Rect(ref double v1, ref double v2);

В Object Pascal эта команда реализуется с помощью ряда процедур, таких как:

procedure glRectd (x1, y1, x2, y2: GLdouble);
procedure glRectfv (v1, v2: PGLfloat);
Четырехугольники с общей гранью

Данный примитив задается на C# с помощью значения QuadStrip перечисления BeginMode и константы GL_QUAD_STRIP на Object Pascal, которые передаются в качестве параметра команде Begin.

Для построения первого четырехугольника требуется 4 вершины. Для формирования каждого последующего четырехугольника требуется задать очередные две вершины. Если вершин недостаточно для построения очередного четырехугольника, то они игнорируются.

Порядок обхода вершин для определения лицевой и обратной граней отличается от несвязанных четырехугольников. Порядок обхода ориентирован на вариант, когда вершины четырехугольников задаются парами в циклической конструкции, например, аналогично пример 4.9 и пример 4.10.

GL.Begin(BeginMode.QuadStrip);
for (int i = 0; i <= 2; ++i)
{
  GL.Vertex3(-0.9 + 0.8 * i, -0.6, 0);
  GL.Vertex3(-0.9 + 0.8 * i, 0.6, 0);
}
GL.End();
Листинг 4.9. Пример формирования четырехугольников с общей гранью на C#
glBegin(GL_QUAD_STRIP);
  for I := 0 to 2 do
  begin
    glVertex3f(-0.9 + 0.8*i, -0.6, 0);
    glVertex3f(-0.9 + 0.8*i,  0.6, 0);
  end;
glEnd;
Листинг 4.10. Пример формирования четырехугольников с общей гранью на Object Pascal
Схема формирования  четырехугольников с общей гранью

Рис. 4.9. Схема формирования четырехугольников с общей гранью

Порядок обхода вершин не совпадает с порядком задания вершин. Порядок обхода вершин первого четырехугольника 1-2-4-3. Порядок обхода для последующих четырехугольников ( рис. 4.9): от предпоследней вершины (3) к последней вершине (4) последнего четырехугольника, затем к последней новой вершине (6) и к предпоследней новой вершине (5). В результате направление обхода вершин всех четырёхугольников совпадает с направлением обхода вершин первого четырехугольника.

Многоугольники

Данный примитив задается на Object Pascal с помощью константы GL_POLYGON и на C# - с помощью значения Polygon перечисления BeginMode, которые передаются в качестве значения параметра команде Begin.

Порядок обхода вершин многоугольника для определения лицевой и обратной граней соответствует порядку задания вершин. Примитив может использоваться только для создания выпуклых многоугольников.

Пример формирования многоугольника приведен в пример 4.11 (C#) и пример 4.12 (Object Pascal). На рис. 4.10 отображена схема обхода вершин многоугольника.

GL.Begin(BeginMode.Polygon);
GL.Vertex3(-0.9, -0.6, 0);
GL.Vertex3(-0.9, 0.6, 0);
GL.Vertex3(0, 0.6, 0.3);
GL.Vertex3(0.9, 0, 0);
GL.Vertex3(0, -0.6, -0.3);
GL.End();
Листинг 4.11. Пример формирования многоугольника с использованием библиотеки OpеnTK на C#
glBegin(GL_POLYGON);
  glVertex3f(-0.9, -0.6, 0);
  glVertex3f(-0.9,  0.6, 0);
  glVertex3f(0,  0.6, 0.3);
  glVertex3f(0.9,  0, 0);
  glVertex3f(0, -0.6, -0.3);
glEnd;
Листинг 4.12. Пример формирования многоугольника на Object Pascal
Схема формирования  многоугольника

Рис. 4.10. Схема формирования многоугольника
< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?