Базовые растровые алгоритмы.
Большинство графических устройств являются растровыми, представляя изображение в виде прямоугольной матрицы (сетки, целочисленной решетки) пикселей (растра), и большинство графических библиотек содержат внутри себя достаточное количество простейших растровых алгоритмов. На рисунке приведена система растровых алгоритмов.
Алгоритмы растеризации.
Связность – возможность соединения двух пикселей растровой линией, т. е. последовательным набором пикселей.
1. Четырехсвязность: пиксели считаются соседними, если либо их x-координаты, либо их y – координаты отличаются на единицу: .
2. Восьмисвязность: пиксели считаются соседними, если их x-координаты и y-координаты отличаются не более чем на единицу: , .
При переводе объектов в растровое представление существуют, алгоритмы, как использующие четырехсвязность, так использующие восьмисвязность.
Растровое представление отрезка.
Рассмотрим задачу построения растрового изображения отрезка, соединяющего точки и . Для простоты будем считать, что . Тогда отрезок описывается уравнением: или .
Отсюда получаем простейший алгоритм растрового представления отрезка:
void line(int xa, int ya, int xb, int yb, int color){
double k = ((double)(yb – ya)) / (xb – xa);
double b = ya – k * xa;
for (int x = xa; x <= xb; x++)
putpixel(x, (int)(k * x + b), color);
}
Приведенный простейший пошаговый алгоритм построения отрезка имеет ряд недостатков:
1. Выполняют операции над числами с плавающей точкой, а желательно было бы работать с целочисленной арифметикой;
2. На каждом шаге выполняется операция округления, что также снижает быстродействие.
Эти недостатки устранены в следующем алгоритме Брезенхейма.
Алгоритм Брезенхейма.
Как и в предыдущем случае, будем считать, что тангенс угла наклона отрезка принимает значение в диапазоне от 0 до 1. Рассмотрим i-й шаг алгоритма (см. рисунок). На этом этапе пиксель уже найден как ближайший к реальному отрезку. Требуется определить, какой из пикселов ( или ) будет установлен следующим.
В алгоритме используется управляющая переменная , которая на каждом шаге пропорциональна разности между S и T. Если S<T, то ближе к отрезку и выбираем ее, иначе выбирается .
Пусть изображаемый отрезок проходит из точки в точку . Исходя из начальных условий, точка ближе к началу координат. Тогда перенесем оба конца отрезка, так чтобы первый конец отрезка совпал с началом координат. Начальной точкой отрезка стала точка (0, 0), конечной точкой стала (dx, dy), где , .
Итеративная формула вычисления управляющего коэффициента по предыдущему значению имеет вид: . {Вычисляется она из подобия треугольников: .
Находим T, как
Помножим левую и правую часть этого выражение на dx. И заменяем , , = }.
С помощью управляющего коэффициента выбирается следующий пиксель или .
Если , тогда выбирается и , .
Если , тогда выбирается и , .
Начальные значения , т.к. .
Преимуществом алгоритма является то, что для работы алгоритма требуются минимальные арифметические возможности: сложение, вычитание и сдвиг влево для умножения на 2.
Если dy>dx, то необходимо будет использовать этот же алгоритм, но пошагово увеличивая y и на каждом шаге вычислять x.