Шаг 29.
Основы компьютерной графики. Базовые растровые алгоритмы. Алгоритмы вывода прямой линии (общие сведения)

    На этом шаге мы рассмотрим алгоритмы рисования горизонтальных и вертикальных линий.

    Рассмотрим растровые алгоритмы для отрезков прямой линии. Предположим, что заданы координаты (x1,y1 - х2,у2) концов отрезка прямой. Для вывода линии необходимо закрасить в определенный цвет все пиксели вдоль линии. Для того чтобы закрасить каждый пиксель, необходимо знать его координаты.

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

  for (x=x1; x<=x2; x++)
    SetPixel (x, y1); // Пиксель(х, y1);

    Вычисление текущих координат пикселя здесь выполняется как приращение по x (необходимо, чтобы х1<=х2), а вывод пикселя обеспечивается функцией SetPixel().

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

  for (y=y1; y<=y2; y++)
    SetPixel (x1, y); //Пиксель (x1, y);

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

    Можно поставить такой вопрос: какая линия рисуется быстрее - горизонталь или вертикаль? На первый взгляд - одинаково быстро. Если учитывать только математические аспекты, то скорость должна быть одной и той же при одинаковой длине линий, поскольку в обоих случаях выполняется равное количество идентичных операций. Однако если кроме расчета координат анализировать также вывод пикселей, то могут быть отличия. В растровых системах рисование пикселя обычно означает запись одного или нескольких бит в память, где сохраняется растр. И здесь уже не все равно - по строкам или по столбцам заполняется растр. Необходимо учитывать логическую организацию памяти компьютера, в которой хранятся биты или байты растра. Даже для компьютеров одного типа (например, персональных компьютеров) для различных поколений процессоров и памяти скорость записи по соседним адресам может существенно отличаться от скорости записи по не соседним адресам. В особенности это заметно, когда для растра используется виртуальная память с сохранением отдельных страниц на диске и (или) в оперативной памяти (RAM). При работе графических программ в среде операционной системы Windows часто случается так, что горизонтали рисуются быстрее вертикалей, поскольку в страницах памяти хранятся соседние байты. А может быть, что RAM достаточно, но скорости рисования все же различны.

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

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

    На следующем шаге мы рассмотрим прямое вычисление координат.




Предыдущий шаг Содержание Следующий шаг