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

ALL

.pdf
Скачиваний:
278
Добавлен:
12.02.2018
Размер:
15.74 Mб
Скачать

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

Рассмотрим графические примитивы, которые используются наиболее часто в современных графических системах, — это линии и фигуры.

Алгоритмы вывода прямой линии

Рассмотрим растровые алгоритмы для отрезков прямой линии. Пусть, что заданы координаты

(х1,у1 – х2,у2) концов отрезка прямой. Для вывода линии необходимо закрасить в определенный цвет все пиксели вдоль линии, то есть необходимо знать их координаты.

• Наиболее просто нарисовать отрезок горизонтальной линии:

• fог (х=х1; х<= х2; х++)

• Пиксел(х, у1);

• Вычисление текущих координат пикселя здесь выполняется как приращение по х (где, х1<=:х2), а

вывод пикселя обеспечивается функцией Пиксел()*.

*Поскольку в языке С, С++ для

• Аналогично рисуется отрезок вертикали:

названия функции нельзя использовать

кириллицу, то будем дальше

 

использовать ее как комментарий.

В цикле выполняются простейшие операции над целыми числами — приращение на единицу и проверка на "< =". Операция рисования отрезка выполняется быстро и просто. Ее используют как базовую операцию для других операций. Какая линия рисуется быстрее — горизонталь или вертикаль?

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

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

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

АЛГОРИТМЫ ПОСТРОЕНИЯ ПРЯМЫХ ЛИНИЙ

Горизонтали и вертикали представляют собой частный случай линий. Рассмотрим линию общего вида. Для нее также необходимо вычислять координаты каждого пикселя.

Прямолинейный отрезок определяется координатами его концов.

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

При изо6ражении пикселей в общем случае приблизительно передается ее форма. Например, координаты прямой (10,48; 20,51), преобразуются в координаты пикселя (10, 21).

В итоге все линии, кроме горизонтальных и вертикальных, показано на рис.

Рис. Эффект лесенки.

УРАВНЕНИЕ ПРЯМОЙ

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

• y =mх + b,

(1)

где m — тангенс угла наклона прямой, а b — точка пересечения с осью у.

Если для концов отрезка заданы точки с координатами (x0, y0) и (xend, yend), то значение тангенса угла наклона m и точки b пересечения прямом с осью у (рис. 3.6):

• m = (yend – y0) / (xend – x0)

(2)

• b = y0 – m x0

(3)

Алгоритмы изображения прямой линий построены на уравнениях (1), (2) и (3).

• Для любого заданного интервала координат x ( х) вдоль прямой линии из уравнения (2)

 

можно найти соответствующий интервал координат у ( y) как

yend

y = m х.

(4)

 

Аналогично можно найти интервал координат x ( х),

y0

соответствующий заданному y

х = y/m

(5)

 

 

 

 

 

 

 

x0

xend

В растровых системах прямые линии строятся по пикселям, и размер шага в горизонтальном и

вертикальном направлении ограничивается разрешением пикселей.

Т.е. нужно "провести выборку" точек прямой линии с дискретными значениями и определить, пиксели, самые близкие к данной прямой для каждого элемента выборки. (рис. Прямолинейный отрезок с выбранными дискретными точками на оси x между x0 и xend.).

Прямое вычисление координат

Пусть заданы координаты конечных точек отрезка прямой. Найдем координаты точки внутри отрезка (рис. 3.1).

Рис.. Отрезок прямой

Запишем отношения катетов для подобных треугольников;

Тогда

то есть х = f(у)

А также

то есть у = F (х) .

В зависимости от угла наклона прямой выполняется цикл по оси х или по у (рис. 3.2).

Рис. 3.2. Алгоритм вывода отрезка прямой линии

Прямое вычисление координат

Приведем пример записи этого алгоритма на языке программирования С, С++. Для сокращения текста рассмотрим фрагмент программы,

где выполняется цикл по оси х, причем х1 < х2:

Здесь все операции выполняются над целыми числами. Двойные скобки необходимы для того, чтобы деление выполнялось после умножения. Недостатки такой программы

— в цикле выполняется много лишних операций, присутствуют операции деления и умножения. Это обуславливает малую скорость работы. Много лишних операций в цикле. Можно вынести вычисление (у2-у1 )/(х2 –х1) из цикла, поскольку это значение не изменяется. Однако для этого уже необходимо использовать операции с плавающей точкой:

Поскольку используются операции с плавающей точкой, то попробуем еще уменьшить количество операций в цикле. Если раскрыть скобки в выражении у = y1 + (x – х1)k; то получим у = у1 + хk – х1k. Здесь значение (у1 – х1k) является константой — эти операции также вынесем из тела цикла.

Прямое вычисление координат

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

Если рассматривать цикл вычисления у, по соответствующим значениям хi = х1, х1+1, ..., х2 как итеративный процесс, то можно поставить такой вопрос: чему равна разность (yi+1 – yi)? Она равна yi+1 – yi = x1 + (хi+1 – х1) k – х1 – (хi - х1) k = (хi+1 – хi) k = k:; поскольку хi+1 – хi = 1.

Разность (yi+1 – yi) — константа, равная k. Исходя из этого, можно построить цикл таким образом:

В теле цикла есть только одна операция для вычисления координаты у (если не учитывать <=

и ++).

Если сравнивать последний вариант с предыдущим, то последний лучше по быстродействию.

Прямое вычисление координат

Также существенно отличаются способы вычисления координаты у. В последнем варианте значение у вычисляется прибавлением приращения К на каждом шаге, и на последнем шаге цикла (когда х = х2) должно стать у = у2.

1.Необходимо учесть, что в компьютере дробные числа представляются в формате с плавающей точкой не точно.

2.Кроме погрешности представления чисел существует ошибка выполнения арифметических операций с плавающей точкой. Ошибка зависит от разрядности мантисс, и самая малая — для long double, но все равно не нулевая. С каждым шагом цикла ошибки накапливаются, и на последнем шаге у может быть не равно у1. Это необходимо учитывать при использовании алгоритма.

Положительные черты прямого вычисления координат:

1. Простота, ясность построения алгоритма.

2. Возможность работы с нецелыми значениями координат отрезка. (Как вы считаете, какой вариант из четырех корректно вычисляет координаты пикселей, если х1, у1, х2, у2 — дробные?)

Недостатки:

1. Использование операций с плавающей точкой или целочисленных операций умножения и деления обуславливает малую скорость. Однако это зависит от процессора и для различных типов компьютеров может быть по разному. Для старых компьютеров разница могла быть в десятки раз, отсюда алгоритмы только на основе целочисленных операций.

2. При вычислении координат путем добавления приращений может накапливаться ошибка вычислений координат.

АЛГОРИТМ ЦДА

Цифровой дифференциальный анализатор (ЦДА) — алгоритм преобразования стандартов

развертки прямой линии, основанный на вычислении либо y, либо x по уравнению (4) или уравнению (5). ( y = m х. (4), х = y/m (5) )

Прямая разбивается на 1 отрезки по одной координате, а для другой координаты

 

 

 

 

 

 

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

yen

 

d

Рассмотрим прямую линию с положительным тангенсом угла наклона (m > 0),

y0

 

 

 

 

 

 

 

 

 

1.

Если m 1, прямая разбивается на единичные отрезки по координате x ( x = 1),

 

 

 

 

 

 

 

x0 xen

и последовательно вычисляются значения у

 

 

 

d

yk+1 = yk + m

(6)

 

 

 

 

 

Индекс k (целое) изменяется от 0 (первая точка) и увеличивается на 1 до тех пор, пока не будет достигнута последняя точка. Поскольку m может быть любым действительным числом между 0,0 и 1,0, каждое рассчитанное значение у следует округлять до ближайшего целого числа, соответствующего положению пикселя на экране в обрабатываемом столбце x.

2.Для прямых линий с m > 1,0, координаты x и y меняются ролями. Прямая разбивается на единичные отрезки: по у ( y= – 1), и последовательно вычисляются значения x

• xk+1 = xk + 1/m

(7)

В этом случае значение x округляется до ближайшего значения координаты пикселя в текущей строке развертки y.

Для уравнений (6) и (7) считаем, что линии обрабатываются от левого конца до правого

Если обработка в обратном направлении, т.е. первая точка справа, то либо x= – 1 и

• yk+1 = yk – m,

(8)

либо (если m > 1) y = –1 при

• xk+1 = xk – 1/m

(9)

АЛГОРИТМ ЦДА

Аналогичные вычисления выполняются для пикселей прямой с отрицательным тангенсом угла наклона m < 0. только используют модуль.

Если абсолютное значение m < 1, а начальная точка находится слева, мы полагаем x = 1 и вычисляем значения y с помощью уравнения (6).

Если начальная точка расположена справа (для такого же тангенса угла наклона), мы

полагаем x = – 1 и находим положения y с помощью уравнения (8). Для отрицательного тангенса угла наклона m > 1 используем y = –1 и уравнение (9) или y = 1 и уравнение (7).

ЭТОТ АЛГОРИТМ СВЕДЕН А СЛЕДУЮЩЕЙ ПРОЦЕДУРЕ

На входе два целочисленных значения экранных координат концов отрезка пряной (x0, y0) (xEnd, yEnd).

Параметрам dx и dy присваиваются значения горизонтальной и вертикальной разностей между точками, обозначающими концы отрезка.

Разность с большей абсолютной величиной определяет значение параметра steps. Начиная с координат пикселя (x0, y0), определяем смещение, необходимое на каждом шаге для того, чтобы найти следующее положение пикселя на этой прямой. Этот процесс повторяется steps раз.

Если величина dy > dx , а x0 < xEnd. то значения приращения по направлениям x = 1 и по y = m соответственно.

Если dx > dy , х0 > xEnd, то для создания следующей точки на прямой используются –1 и –m,

Обработка в обратном направлении для y – приращение 1, а в направлении x ~ приращение

1/m

Соседние файлы в предмете Компьютерная Графика