Главная » Free Pascal » Растеризация векторных изображений Free Pascal

0

Такие устройства отображения, как дисплеи и принтеры, обычно используют растровую технологию воспроизведения графических объектов. При этом изо-

бражение состоит из большого количества отдельных цветных точек — пиксе- лов. Однако информацию об отображаемом объекте гораздо выгоднее хранить в векторном формате — коэффициентов соответствующих аналитических уравне- ний, координат концов отрезков, координат вершин многоугольников и т. п. Во- первых, так экономится объем оперативной памяти. Во-вторых, такие операции как масштабирование и повороты фигур в векторном формате осуществляются без потери качества.

Поэтому одна из первых задач в системах отображения — растеризация — связана с преобразованием векторных данных в растровый формат. Она использует довольно простой математический аппарат, но ее лобовое решение приводит к большому объему вычислений, в которых значительная доля операций приходится на умножение (деление) вещественных чисел. Одним из первых исследователей, предложивших эффективный алгоритм вычисления координат точек растрового отрезка, проходящего через две заданные точки, с использованием только целочис- ленных операций сравнения и сложения (вычитания), был Брезенхейм (Bresenham

J. E., 1965 г.). Позднее (1977) он же распространил подобную схему на вычисление растровых координат точек на дуге окружности. Существенно позже аналогичная схема была предложена и для растеризации дуг эллипсов. Перечисленные алгорит- мы оказались настолько удачными, что их встраивают в аппаратуру современных графических ускорителей.

Воспроизведение утолщенных линий

Задача воспроизведения утолщенных линий на растровой сетке не такая уж и тривиальная, как может показаться. Лобовое ее решение путем построения не- скольких симметричных эквидистант1 относительно осевой линии приводит к появлению семейства мелких точек, сквозь которые просвечивают фоновые пик- селы.

На вид толстых линий оказывает влияние и форма пишущего узла (апертура пера), из-за которой на стыках прямоугольных отрезков могут наблюдаться раз- личного рода зазубрины — выступы, впадины. Чтобы построить качественную прямоугольную рамку с толщиной линии w, приходится строить отрезки, концы которых выступают на w/2 относительно координат осевой линии. Многие гра- фические системы, включая и Windows GDI, предоставляют пользователю воз- можность задать такие характеристики пера, как стиль сочленения смежных от- резков (joint style) и тип окончания отрезка (end cap) — закругленный, перпендикулярный осевой, параллельный одной из осей координат в зависимости от наклона отрезка.

1 Эквидистанта — равноудаленная линия, например, отстоящая на один или несколько пикселов от заданной линии.

Сглаживание зазубрин

При увеличенном изображении наклонных линий на экране можно наблюдать многочисленные изломы между смежными пикселами. Визуальному устранению таких дефектов содействует размещение в уголках изломов дополнительных пик- селов, окрашиваемых полутоновыми цветами. Этот прием сглаживания контуров в англоязычной литературе получил название antialiasing (дословно — противодей- ствие ступенчатости). В открывающейся операторной скобке языка OpenGL можно встретить аргументы, так или иначе связанные с этим приемом (англ. smooth — сглаживание):

± glBegin(GL_POINT_SMOOTH) — сглаживание углов квадратных точек;

± glBegin(GL_LINE_SMOOTH) — сглаживание контуров отрезков прямых;

± glBegin(GL_POLYGON_SMOOTH) — сглаживание контуров многоугольников.

Устранение невидимых частей изображения

Существует довольно много разных по сложности и быстродействию алгорит- мов удаления невидимых точек, линий и поверхностей. Среди них метод прямой (от источника освещения) и обратной (от позиции наблюдателя) трассировки лучей (ray tracing), излучательности (radiosity), сортировка по глубине, Z-буфер и др.

Наиболее простая идея, которая нашла свое воплощение и в аппаратуре, зало- жена в алгоритмах Z-буфера. Название этих методов связано с выбором направле- ния оси z, которая из картинной плоскости (т. е. плоскости экрана) направлена на наблюдателя. Считается, что его позиция достаточно удалена от экрана, и лучи, направленные от картинной плоскости в строну наблюдателя, можно рассматри- вать как пучок прямых, параллельных оси z. Для каждой точки объекта, располо- женного перед картинной плоскостью, ее Z-координата совпадает с расстоянием от этой точки до плоскости экрана. Поэтому, если на одном и том же луче находятся две или более точки объекта, то видимой окажется та, которая расположена ближе к наблюдателю, т. е. та, которая имеет большую Z-координату. Поэтому сравнение Z-координат пикселов, проектируемых в одну и ту же точку на картинной плоско- сти, решает проблему видимости изображения.

На практике простейший алгоритм Z-буфера реализуется с помощью двух бу- феров одинакового размера. Один из них предназначен для хранения двумерной матрицы цветностей пикселов картинной плоскости. При использовании 24-битной кодировки RGB-компонентов и разрешении экрана 1024 768 для такой матрицы потребуется порядка 4 Мбайт. Второй буфер используется для хранения 32- разрядных целочисленных  значений  Z-координат  точек  отображаемого  объекта. В начальный момент буфер цветности заполняется кодом фонового цвета, а буфер Z-координат — нулями. При анализе очередного пиксела изображения его Z-координата сравнивается с соответствующим расстоянием ранее обработанного

пиксела, уже записанного в Z-буфер. Если новое расстояние больше, то код цвет- ности пиксела заносится в соответствующую позицию буфера цветности, а новая координата Z подменяет предыдущее Z-значение. В противном случае обрабаты- ваемая точка считается невидимой.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии