glBegin (GL_LINE_STRIP); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); Третий примитив прямой линии в OpenGL - это GL_LINE_LOOP, который дает замкнутую ломаную линию. К последовательности отрезков из предыдущего примера добавляется еще один отрезок, соединяющий последнюю точку последовательности с первой точкой ломанной линии. Если выбрать этот вариант построения линии, для данного списка концов отрезков будет получено изображение, представленное на рис. 3.4, в.
glBegin (GL_LINE_LOOP); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); Как отмечалось ранее, элементы рисунка описываются во внешней системе координат, т.е. в конечном счете отображаются в систему координат устройства вывода. Затем геометрическая информация о рисунке подвергается преобразованию в стандарт развертки и переводится в положения пикселей. В следующем разделе рассмотрены алгоритмы преобразования стандартов развертки, позволяющие реализовывать функции прямых линий OpenGL.
АЛГОРИТМЫ ПОСТРОЕНИЯ ПРЯМЫХ ЛИНИЙ
Прямолинейный отрезок на сцене определяется координатами его концов. Чтобы изобразить прямую линию на растровом мониторе, графическая система сперва должна спроектировать положения концов отрезка, переведя их в целочисленные значения экранных координат, и определить ближайшие положения пикселей, лежащих вдоль линии, соединяющей эти концы отрезка. Затем в буфер кадра загружается цвет ли-
Рис. 3.5. Эффект зубчатых линий (“лесенки”), возникающий, когда линия изображается как ряд пикселей
Рис. 3.6. Прямая линия, соединяющая концы отрезка с координатами
(*Е0> У о) И (£end> 2/end)
нии с соответствующими координатами пикселей. Считывая информацию из буфера кадра, видеоконтроллер изображает пиксели на экране. В ходе этого процесса происходит цифровая обработка прямой линии и преобразование ее в целочисленные значения координат, которые в общем случае только приблизительно передают настоящую форму линии. Рассчитанные координаты прямой (10,48; 20,51), например, преобразуются в координаты пикселя (10; 21). Такое округление значений координат до целых чисел приводит к тому, что все линии, кроме горизонтальных и вертикальных, изображаются в виде зубцов (“лесенки”), как показано на рис. 3.5. Характерная зубчатая форма растровых линий особенно заметна в системах с невысоким разрешением. Их внешний вид можно несколько улучшить с помощью систем с высокой разрешающей способностью. Более эффективные методы сглаживания растровых линий основываются на подборе интенсивности пикселей, находящихся на этой линии (раздел 4.17).
АЛГОРИТМ ЦЦА
Цифровой дифференциальный анализатор (ЦДА) - это алгоритм преобразования стандартов развертки прямой линии, основанный на вычислении либо 5у, либо 5х по уравнению (3.4) или уравнению (3.5). Прямая разбивается на единичные отрезки по одной координате, а для другой координаты определяются соответствующие целые значения, ближайшие к данной прямой.
♦include <stdlib.h>