Алгоритмы компьютерной графики Пешков Анатолий Тимофеевич, БГУИР. 1 отображение просранства пользователя и машинного носителя 4
Скачать 1.86 Mb.
|
2 АЛГОРИТМЫ ГЕНЕРИРОВАНИЯ ЛИНИЙ.При формировании любой линии предъявляются следующие очевидные требования: линия должна начинаться и заканчиваться в заданных точках; контрастность и яркость вдоль всей длины формируемой линии должны быть одинаковыми и не зависеть от крутизны и длины линии; необходимо отражать характер линии (отрезки прямой должны быть прямыми, формируемые дуги должны иметь форму дуги и т. д.); формирование отдельных точек должно выполняться с минимальными затратами времени, так как количество точек, так правило, достаточно велико. Не все перечисленные требования могут быть выполнены. Из-за принципиальных особенностей средств графического ввода-вывода, носитель, на котором формируется или с которого считывается графическая информация, рассматривается в виде матрицы дискретных элементов, называемых пикселами, визуальные параметры (яркость, цветность и т.п.) которых могут изменяться. Поэтому формируемые линии, строго говоря, не могут начинаться и заканчиваться точно в математически определенных точках носителя. Ошибка положения формируемых точек определяется уровнем дискретизации или количеством дискретных точек, на которое разбивается носитель. Максимальная погрешность положения точки определяется шагом между двумя соседними пикселами. По этой же причине даже отображение отрезка прямой линия, строго говоря, не является прямой, как это показано на приведенном ниже рисунке (рис.2-1). Линия представляется набором горизонтальных (или вертикальных) цепочек пикселов, которые с учетом шага дискретизации наилучшим образом отражают характер генерируемой прямой линии. В общем случае, если не принимать специальные меры, яркость линии на отдельных участках будет зависеть от крутизны этих участков. Рис.2-1 Удовлетворение требовния минимальных затрат времени на определение координат одной точки формируемой линии обеспечивается за счет использования приближенных методов вычислений, применения целочисленной арифметики, использования специальных алгоритмов, реализуемых программно или на специальных графических процессорах. 2.1 Генерирование отрезка прямой. алгоритм БрезенхемаГенерирование отрезка прямой осуществляется точка за точкой, начиная от заданной начальной точки. При формировании очередной точки используется характер изменения ее координат, определяемый положением конечной точки относительно начальной точки. Формируемые координаты очередной точки определяются за счет модификации координат предыдущей точки. Одна координата используется как аргумент и ее модификация всегда одинаково и равно единице. Изменение второй координаты осуществляется таким образом, чтобы очередная точка имела бы положение, наиболее близкое по отношению к положению, рассчитанному на основании аналитической зависимости. Отрезок прямой задается начальной точкой Т1 с координатами x1,y1 и конечной точкой Т2 с координатами x2,y2. Исходя из заданных концевых точек, рассчитывается крутизна отрезка: m=y/x, где: x = x2 – x1 ; y = y2 – y1. Рассмотрим простейший случай, когда x >=0, y >=0, x >=y , и для этого случая разработаем алгоритм формирования отрезка прямой. Возьмем в качестве аргумента x, а в качестве функции y. Учитывая характер рассматриваемого случая, можно утверждать, что претендентами на роль следующей за последней найденной точкой с координатами xi, yi будут точки, имеющие координаты X, отличающиеся от координаты X последней найденной точки на «+1», а координата Y одного претендента равна координате Y найденной точки, а другого – с приращением «+1» (Рис. Генерирование отрезка прямой. алгоритм Брезенхема-2). Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑2 В качестве следующей точки из двух претендентов выбирается тот, который ближе располагается к расчетному положению. Для очередной формируемой (i+1)-ой точки ее отклонение i+1 от рассчетной точки определяется следующим образом (см. Рис. Генерирование отрезка прямой. алгоритм Брезенхема-2): i+1 =i +m. Отсюда можно записать: Процедура выбора следующей точки иллюстрируется ниже приведенным рисунками Рис. Генерирование отрезка прямой. алгоритм Брезенхема-2 - Error: Reference source not found. На Error: Reference source not found приведена последовательность пикселов, с помощью которых отображается формируемый отрезок. На рис. Error: Reference source not found приведена кривая, соответствующая погрешности (отклонению от расчетного положения) формирования отрезка на каждой формируемой точке. Для того чтобы избавиться от сравнения отклонения с дробным числом 1/2, вводится постоянное смещение отклонения на -1/2. В этом случае кривая погрешности будет иллюстрироваться Error: Reference source not found4, а процесс выбора следующей точки из двух претендентов происходит по правилу: Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑3 Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑4 Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑5 Выше изложенное позволяет представить алгоритм формирования отрезка прямой для рассматриваемого частного случая в виде граф-схемы, приведенной на следующем рисунке (Рис. Генерирование отрезка прямой. алгоритм Брезенхема-6): Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑6 Для того, чтобы избавиться от длинных операций и действительных величин, введем замену: e = 2x. В приведенном алгоритме анализируется не величина переменной , а только ее знак. Учитывая то, что в рассматриваемом частном случае положения формируемого отрезка приращение x всегда положительно, вводимая переменная «e» будет иметь тот же знак, что и . Поэтому в алгоритме на рис.2.1-5 анализ переменной «» можно заменить анализом переменной «е». С учетом этой замены граф-схема алгоритма будет иметь вид, приведенный на следующем рисунке (Рис. Генерирование отрезка прямой. алгоритм Брезенхема-7). Введенная замена приводит к тому, что в приведенном на рис. 2.1-6 алгоритме отсутствуют длинные операции. Кроме того, все операнды являются целыми числами, а следовательно вычисления будут выполняться с использованием чисел с фиксированной точкой, что будет требовать меньших затрат времени, чем в случае действительных операндов, которые должны представляться в форме с плавающей запятой. Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑7 Для того, чтобы распространить приведенный алгоритм для общего случая положения отрезка, проанализируем особенности рассмотренного частного случая положения отрезка, и разработаем, такую оболочку для рассмотренного алгоритма, которая позволит адаптировать его ко всем возможным ситуациям общего случая положения отрезка. Для общего положения формируемого отрезка на плоскости, приращения аргумента и функции могут быть как на «+1», так и на «-1». Кроме того, крутизна m =y/x может быть больше или меньше единицы. На рис.Рис. Генерирование отрезка прямой. алгоритм Брезенхема-8 приведено формирование из пикселов отрезков, крутизна которых больше единицы. На Рис. Генерирование отрезка прямой. алгоритм Брезенхема-8b) в качестве аргумента используется координата X. На Рис. Генерирование отрезка прямой. алгоритм Брезенхема-8a) в качестве аргумента используется координата Y. На Рис. Генерирование отрезка прямой. алгоритм Брезенхема-8b) яркость (плотность пикселов на единицу длины отрезка) для всех отрезков, независимо от значения их крутизны, одинаковая. Из Рис. Генерирование отрезка прямой. алгоритм Брезенхема-8a) видно, что яркость отображения отрезка будет тем меньше, чем больше крутизна отрезка, что недопустимо. Поэтому в случаях, когда крутизна формируемого отрезка больше единицы, в качестве аргумента необходимо использовать координату Y. Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑8 Все возможные значения крутизны и приращений координат приведены на следующем рисунке (Рис.2.1-8). Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑9 Исходя из приведенного рисунка, для того, чтобы использовать рассмотренный алгоритм формирования отрезка прямой во всх случаях, необходимо снабдить его оболочкой, которая должна: выбирать в качестве аргумента координату X тогда, когда положение формируемого отрезка соответствует октантам 1, 3, 4, 7 (рис.2.1-8) ; выбирать в качестве аргумента координату Y тогда, когда положение формируемого отрезка соответствует октантам 2, 5, 6, 8 (рис.2.1-8) ; модифицировать координату Y на «+1» в октантах 1, 2, 3, 4; модифицировать координату Y на «-1» в октантах 4, 5, 6, 7, 8; модифицировать координату X на «+1» в октантах 1, 2, 7, 8; модифицировать координату X на «-1» в октантах 4, 5, 6, 7, 8. Для построения алгоритма для общего случая положения отрезка введем переменную-флажок «С», которой будем приписывать значение «0», если в качестве аргумента выбирается X, и «1», если в качестве аргумента выбирается Y. Для обеспечения требуемой модификации аргумента и функции (на «+1» или на «-1»), определим функцию знака sign(z), которая принимает следующие значения: В этом случае граф-схема алгоритма формирования отрезка прямой (алгоритма Брезенхема) будет имеет вид, приведенный на следующем рисунке (рис.2.1- 9). На рис.2.1- 9 используется обозначения, принятые на рис.2.1- 6. Кроме того, введены дополнительные обозначения: Sx – знак приращения X от начальной к конечной точке формируемого отрезка; Sy– знак приращения Y от начальной к конечной точке формируемого отрезка. Отделбные фрагменты приведенного алгоритма выполняют следующие действия. Блок операторов 1 обеспечивает установку начальных значений для переменных, используемых в рассматриваемом алгоритме. Блок операторов 2 обеспечивает в зависимости от заданного положения отрезка выбор в качестве аргумента или координаты X, или координаты Y. Кроме того, в этом блоке устанавливается соответствующее значение для флага C. Блок операторов 3 обеспечивает анализ завершения формирования отрезка. Отрезок считается сформированным, если значение параметра цикла «i» превысило число точек, составляющих отрезок. Количество точек равно x, которое в данной точке алгоритма равно количеству аргументов (по координате X или Y в зависимости от наклона отрезка). Блок операторов 4 обеспечивает определение, какая координата (X или Y) используется в качестве функции, и модифицирует эту координату. Блок операторов 5 обеспечивает определение, какая координата (X или Y) используется в качестве аргумента, и модифицирует эту координату. Рис. Генерирование отрезка прямой. алгоритм Брезенхема‑10 Отличительной особенностью данного алгоритма является то, что при формировании координат отдельных точек, из которых формируется заданный отрезок, используются только простейшие операции (операции сложения и логические операции). Кроме того, действия выполняются над целочисленными операндами, что позволяет использовать арифметику с фиксированной точкой. Все это свидетельствует о том, что при реализации данного алгоритма имеют место минимальные затраты времени. |