Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3280 / 442 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 3:

Алгоритмы растеризации отрезков, окружностей и эллипсов

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

3.3. Изображение отрезка с нецелочисленными координатами концов

Для отрезка с нецелочисленными координатами концов будем строить соответствующую 4-связную линию на растре.

Рисование отрезка с нецелочисленными координатами концов.

Рис. 3.5. Рисование отрезка с нецелочисленными координатами концов.

Существует два подхода.

  1. Округлить координаты концов до целочисленных и воспользоваться алгоритмом для целочисленного случая. Недостаток: может вызывать существенные искажения (особенно в случае отрезков небольшой длины).
  2. Перейдем к нашему каноническому случаю, который теперь характеризуется тем, что отрезок лежит в первом октанте, но координаты A(x_A, y_A) в этом случае: x_A \in [0, 1), y_A \in [0, 1). Параметризуем наш отрезок стандартным образом:
    (x, y) = A + t \cdot \frac{B-A}{c},   t \in [0, c],

    где A и B - концевые точки, c > 0 - некий масштабный коэффициент. Сделаем c достаточно большим целым числом, чтобы уменьшить ошибки округления. Тогда рассмотрим

    \Delta h = \frac{c}{x_B-x_A}
    - приращение t, при сдвиге на 1 пиксель по x ;

    \Delta v = \frac{c}{y_B-y_A}
    - приращение t, при сдвиге на 1 пиксель по y.

    Будем сравнивать текущие значения h и v, а затем, в зависимости от этого, делать шаг по x или y и придавать соответствующие приращения h и v. Алгоритм закончится, когда h или v превысит c.

Изменение параметров h и v.

Рис. 3.6. Изменение параметров h и v.
x = 0; y = 0; // Канонический случай: начальная точка
// лежит в [0, 1) (+)  [0, 1)

/* Приращения t, соответствующие смещениям от начальной
точки до границ первого пикселя. */

h = delta_h * (1 - xA); // delta_h0
v = delta_v * (1 - yA); // delta_v0

while( (h < c) AND (v < c) )
{
       plot(x, y);
   
       if( h < v )
       {
            // Сдвиг по горизонтали
            x++; h += delta_h;
       }
       else if( h > v )
      {
            // Сдвиг по вертикали
            y++; v += delta_v;
       }
       else
      {
            // h = v : Вырожденный случай (см. рис. 3.5)
            // рисуем произвольный из двух возможных пикселей,
            // например, верхний:
            plot(x,y+1);
            x++; y++;
            h += delta_h; v += delta_v;      
      }
}
Листинг 3.4. Алгоритм отображения отрезка с нецелочисленными координатами концов

Замечание. Приведенный выше алгоритм легко обобщается на n -мерный случай.

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >