( 1 ^
F(x,y) = -2W ау +--ау + 2Н(ах + I - ах) = 2Н -W. (10.8)
V 2 )
Замечание. Если бы мы предварительно не умножили функцию на 2, то результат был бы Я- 0,5У/, что сделало бы невозможным использование целых значений всех участвующих величин!
Таким образом, перед началом процесса мы полагаем F= 2Н - \V, х = ал,у = а . Затем на каждом шаге делаем следующее.
1. Присваиваем пикселу (.г, у) нужное значение цвета.
2. Увеличиваем х на 1; если F< 0, то добавляем к Fвеличину 2Я; в противном случае увеличиваем у на 1 и добавляем к F величину -2( W - II).
Листинг 10.5. Алгоритм средней точки (частный случай)
bresenhamdntPoint a. IntPoint b) {
// restriction: а.х < b.x and 0 < H/W < 1 // ограничения: а.х < b.x и 0 < H/W < 1
int у = а.у. W = b.x - а.х. Н = Ь.у - а.у:
int F = 2 * Н - W; // current error term // текущая невязка
for (int х = а.х: х <= b.x: // inner loop // внутренний цикл
{
setPixeKx. у): if(F < 0)
F += 2 * H:
// set up for next pixel // устанавливаем для следующего пиксела else{
у++:
F += 2 * (Н - W); Все вышеизложенное и определяет алгоритм Брезенхема для данного частного случая (см. листинг 10.5). Поскольку в этом алгоритме предусмотрена повторная инициализация для каждой новой прямой, то он является повторяемым: повторное рисование какой-либо прямой другим цветом полностью замещает первую прямую; например, рисование цветом фона целиком удаляет ранее нарисованную прямую.
Средства для растровой графики
Алгоритм Брезенхема предельно прост, в его внутреннем цикле содержатся только несколько операций сравнения и сложения. Для достижения максимальной скорости его легко реализовать на языке ассемблера. Этот алгоритм часто реализуется аппаратно в графических устройствах специального назначения; где обеспечивается еще большая его скорость.
Пример 10.4.1
Полезно проследить за изменением функции .г7 на конкретном примере. Пусть (ах, а ) = (4,1), а (Ьх, Ьу) = = (16,4). Тогда 1У-12иЯ-3. Поскольку наклон данной прямой равен 1/4, мы ожидаем, что значение у будет увеличиваться только примерно на каждом четвертом шаге по х. Начальное значение Нравно (-6). При каждом увеличении х мы делаем одно из двух: если значение функции ¥ отрицательно, то добавляем к ней 6; в противном случае вычитаем из нее 18 и увеличиваем у.