Пусть отрезок задан крайними точками (лгь.Уі) и (х2,у2) (рис. 7.39). Будем считать, что значения координат округлены до ближайшего целого, т.е. отрезок начинается и заканчивается точно в центре соответствующего пикселя". Коэффициент наклона отрезка определяется соотношением т . " >'i = ЪУ_ х, - .V, Ах

Будем считать, что 0 < т < 1. При других вариантах значения т можно использовать симметричную модификацию алгоритма. В основе алгоритма лежит запись кода цвета в ячейку буфера, представляющую определенный пиксель, для каждого значения ix с помощью функции write pixel, по мере того как х изменяется от X] до х2. Между элементарными приращениями Ьх и by координат отображающей точки, которая "перемещается" от одной конечной точки отрезка к другой, существует связь:

by = т Ьх.

Если на каждом шаге увеличивать значение х на 1, т.е. принять Ьх = 1, то координату у отображающей точки нужно увеличить на величину by = т. Хотя каждое очередное значение х представляет целое число, очередное значение у таковым не является, поскольку т в общем случае - дробь. Поэтому значение у нужно округлить и найти таким образом подходящий пиксель, предсцівляющий текущее положение отображающей точки (рис. 7.40). В результате наш алгоритм будет выглядеть следующим образом:

for(ix=xl, ix <= х2, ix++) {

y+=m;
write_pixel(x, round(y) , line_color);
}

Здесь функция round() выполняет округление действительного числа до ближайшего целого. Причина, по которой мы ограничили значение коэффициента наклона единицей, становится ясной при взгляде на рис. 7.41. Тот алгоритм, который мы сейчас рассматриваем, отыскивает значение координаты у отображающей точки, задаваясь приращениями ее координаты х. При больших значениях коэффициента наклона координаты х и у должны "поменяться В OpenGL считается, что координаты центров пикселей представляют собой полусумму соседних целых чисел. В таком выборе есть определенный резон - см. упр. 7.19.

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


⇐ Предыдущая| |Следующая ⇒