Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
whith-out _17_and_32.doc
Скачиваний:
24
Добавлен:
17.12.2018
Размер:
435.2 Кб
Скачать

23. Алгоритм Коэна-Сазерленда для отсечения отрезков

Алгоритм, позволяющий определить часть отрезка, которая пересекает прямоугольник. Был разработан Дэном Коэном и Айвеном Сазерлендом в Гарварде в 1966—1968 гг.

Алгоритм разделяет плоскость на 9 частей прямыми, которые образуют стороны прямоугольника. Каждой из 9 частей присваивается четырёхбитный код. Биты (от младшего до старшего) значат «левее», «правее», «ниже», «выше». Иными словами, у тех трёх частей плоскости, которые слева от прямоугольника, младший бит равен 1, и так далее. Алгоритм определяет код конечных точек отрезка. Если оба кода равны нулю, то отрезок полностью находится в прямоугольнике. Если битовое И кодов не равно нулю, то отрезок не пересекает прямоугольник (т.к. это значит, что обе конечные точки отрезка находятся с одной стороны прямоугольника). В прочих случаях, алгоритм выбирает конечную точку, находящуюся вне прямоугольника, находит ближайшую к ней точку пересечения отрезка с одной из линий, образующей стороны прямоугольника, и использует эту точку пересечения как новую конечную точку отрезка. Укороченный отрезок снова пропускается через алгоритм. Реализация алгоритма для трёхмерной модели идентична двумерной реализации, за исключением того, что вместо четырёхразрядного кода применяется шестиразрядный (дополнительные два бита глубины)

.

  1. Рассчитать коды конечных точек отсекаемого отрезка.

  2. В цикле повторять пункты 2-6:

  3. Если логическое И кодов конечных точек не равно 0, то отрезок целиком вне окна. Он отбрасывается и отсечение закончено.

  4. Если оба кода равны 0, то отрезок целиком видим. Он принимается и отсечение закончено.

  5. Если начальная точка внутри окна, то она меняется местами с конечной точкой.

  6. Анализируется код начальной точки для определения стороны окна с которой есть пересечение и выполняется расчет пересечения. При этом вычисленная точка пересечения заменяет начальную точку.

  7. Определение нового кода начальной точки.

26. Общий алгоритм Брезенхема. Алгоритм выбирает оптимальные растровые координаты для представления отрезка. Большее из приращений, либо Δx, либо Δy, выбирается в качестве единицы растра. В процессе работы одна из координат - либо x, либо y (в зависимости от углового коэффициента) - изменяется на единицу. Изменение другой координаты (на 0 или 1) зависит от расстояния между действительным положением отрезка и ближайшими координатами сетки. Такое расстояние есть ошибкой.

Алгоритм построен так, что требуется лишь знать знак этой ошибки. Следовательно, точка растра (1, 1) лучше аппроксимирует ход отрезка, чем точка (1, 0). Если угловой коэффициент меньше ½, то верно обратное. Для углового коэффициента, равного ½, нет какого-либо предпочтительного выбора. В данном случае алгоритм выбирает точку (1, 1). Так как желательно проверять только знак ошибки, то она первоначально устанавливается равной -½. Таким образом, если угловой коэффициент отрезка больше или равен ½, то величина ошибки в следующей точке растра может быть вычислена как е = -½ + Δy/Δx.

Чтобы реализация алгоритма Брезенхема была полной, необходимо обрабатывать отрезки во всех октантах. Это легко сделать, учитывая в алгоритме номер квадранта, в котором лежит отрезок и его угловой коэффициент. Когда абсолютная величина углового коэффициента больше 1, y постоянно изменяется на единицу, а критерий ошибки Брезенхема используется для принятия решения об изменении величины x. Выбор постоянно изменяющейся (на +1 или -1) координаты зависит от квадранта  var x,y,sy,sx,dx,dy,e,z,i: Integer;    change: boolean; begin  x:=x1;  y:=y1;  dx:=abs(x2-x1);    dy:=abs(y2-y1) ;  sx:=sign(x2-x1);   sy:=sign(y2-y1);  e:= 2*dy-dx;    if dy<dx then change:=false  else begin    z:=dx;    dx:=dy;    dy:=z;    change:=true  end;  for i:=1 to dx+dy do begin    if dy< dx then begin            if change then y:=y+sy      else x:=x+sx;              e:=e+2*dy;    end   else       if change then x:=x+sx       else y:=y+sy;    e:=e-2*dx    end;  Form1.Canvas.Pixels[x,y]:=clblack; // вывод точки, для примера end;

24. Алгоритмы растровой графики

Растром называется прямоугольная сетка точек, формирующих изображение на экране компьютера. Каждая точка растра характеризуется двумя параметрами: своим положением на экране и своим цветом, если монитор цветной, или степенью яркости, если монитор черно-белый. Поскольку растровые изображения состоят из множества дискретных точек, то для работы с ними необходимы специальные алгоритмы. Рисование отрезка прямой линии - одна из простейших задач растровой графики. Смысл ее заключается в вычислении координат пикселов, находящихся вблизи непрерывных отрезков, лежащих на двумерной растровой сетке.

Рис. 28. Растеризация отрезка прямой линии.

Термин “пиксел” образован от английского pixel (picture element - элемент изображения) - то есть точка на экране. Будем считать, что пикселы имеют целочисленные координаты. На первый взгляд кажется, что эта задача имеет простое решение. Пусть конечные точки отрезка имеют целочисленные координаты, и уравнение прямой, содержащей отрезок: y=kx+b. Не нарушая общности, будем также считать, что тангенс угла наклона прямой лежит в пределах от 0 до 1. Тогда для изображения отрезка на растре достаточно для всех целых x, принадлежащих отрезку, выводить на экран точки с координатами(x,ROUND(y)) .Однако в этом методе присутствует операция умножения kx. Хотелось бы иметь алгоритм без частого использования операции умножения вещественных чисел. Избавиться от операции умножения можно следующим образом. Поскольку k=,то один шаг по целочисленной сетке на оси x будет соответствовать

. Отсюда получаем, что y будет увеличиваться на величину k Итерационная последовательность выглядит следующим образом: Xi+1=xi+1 ; yi+1=yi+k

Когда k>0 то шаг по x будет приводить к шагу по y>1 , поэтому x и y следует поменять ролями, придавая y единичное приращение, а x будет увеличиваться на: единиц.

25. алгоритм рисования отрезка прямой по методу брезенчема #25

Алгоритм Брезенхе́ма— это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками.

трезок проводится между двумя точками — (x0,y0) и (x1,y1), где в этих парах указаны колонка и строка, соответственно, номера которых растут вправо и вниз. Сначала мы будем предполагать, что наша линия идёт вниз и вправо, причём горизонтальное расстояние x1 − x0 превосходит вертикальное y1 − y0, т.е. наклон линии от горизонтали — менее 45°. Наша цель состоит в том, чтобы для каждой колонки x между x0 и x1, определить, какая строка y ближе всего к линии, и нарисовать точку (x,y).

Общая формула линии между двумя точками:

Поскольку мы знаем колонку x, то строка y получается округлением к целому следующего значения:

Однако, вычислять точное значение этого выражения нет необходимости. Достаточно заметить, что y растёт от y0 и за каждый шаг мы добавляем к x единицу и добавляем к y значение наклона

которое можно вычислить заранее. Более того, на каждом шаге мы делаем одно из двух: либо сохраняем тот же y, либо увеличиваем его на 1.

Что из этих двух выбрать — можно решить, отслеживая значение ошибки, которое означает — вертикальное расстояние между текущим значением y и точным значением y для текущего x. Всякий раз, когда мы увеличиваем x, мы увеличиваем значение ошибки на величину наклона s, приведённую выше. Если ошибка превысила 0.5, линия стала ближе к следующему y, поэтому мы увеличиваем y на единицу, одновременно уменьшая значение ошибки на 1. В реализации алгоритма, приведённой ниже, plot(x,y) рисует точку, а abs возвращает абсолютную величину числа:

Пусть начало отрезка имеет координаты (X1,Y1), а конец(X1,X2) . Обозначим

Dx=(X2-X1),dy=(Y2-Y1) . Не нарушая общности, будем считать, что начало отрезка совпадает с началом координат, и прямая имеет вид

Где . Считаем что начальная точка находится слева. Пусть на (i-1) -м шаге текущей точкой отрезка является Pi-1=(r,q) . Выбор следующей точки Si или Ti зависит от знака разности (s-t). Если (s-t)<0 , то Pi=Ti=(r+1,q) и тогда

Xi+1=i+1;Yi+1=Yi , если же (s-t)≥0,то Pi=Ti=(r+1,q+1) и тогда Xi+1=i+1 ; Yi+1=Yi+1 ;

dx=(s-t)=2(rdy-qdx)+2dy –dx

Поскольку знак dx=(s-t) совпадает со знаком разности ) , то будем проверять знак выражения di=dx(s-t). . Так как r=Xi-1 и q=Yi-1 ,то

di+1= di+2dy -2dx(yi-yi-1) .

Пусть на предыдущем шаге di<0 , тогда(yi-yi-1)=0 и di+1= di+2dy . Если же на предыдущем шаге di≥0 , тогда(yi-yi-1)=1 и di+1= di +2dx(yi-yi-1)

Осталось узнать как вычислить di . Так как при i=1

(x0,y0)=(0,0),→ di=2dy-dx

Далее приводится листинг процедуры на языке Паскаль, реализующей алгоритм Брезенхема.

26. Общий алгоритм Брезенхема. Алгоритм выбирает оптимальные растровые координаты для представления отрезка. Большее из приращений, либо Δx, либо Δy, выбирается в качестве единицы растра. В процессе работы одна из координат - либо x, либо y (в зависимости от углового коэффициента) - изменяется на единицу. Изменение другой координаты (на 0 или 1) зависит от расстояния между действительным положением отрезка и ближайшими координатами сетки. Такое расстояние есть ошибкой.

Алгоритм построен так, что требуется лишь знать знак этой ошибки. Следовательно, точка растра (1, 1) лучше аппроксимирует ход отрезка, чем точка (1, 0). Если угловой коэффициент меньше ½, то верно обратное. Для углового коэффициента, равного ½, нет какого-либо предпочтительного выбора. В данном случае алгоритм выбирает точку (1, 1). Так как желательно проверять только знак ошибки, то она первоначально устанавливается равной -½. Таким образом, если угловой коэффициент отрезка больше или равен ½, то величина ошибки в следующей точке растра может быть вычислена как е = -½ + Δy/Δx.

Чтобы реализация алгоритма Брезенхема была полной, необходимо обрабатывать отрезки во всех октантах. Это легко сделать, учитывая в алгоритме номер квадранта, в котором лежит отрезок и его угловой коэффициент. Когда абсолютная величина углового коэффициента больше 1, y постоянно изменяется на единицу, а критерий ошибки Брезенхема используется для принятия решения об изменении величины x. Выбор постоянно изменяющейся (на +1 или -1) координаты зависит от квадранта  var x,y,sy,sx,dx,dy,e,z,i: Integer;    change: boolean; begin  x:=x1;  y:=y1;  dx:=abs(x2-x1);    dy:=abs(y2-y1) ;  sx:=sign(x2-x1);   sy:=sign(y2-y1);  e:= 2*dy-dx;    if dy<dx then change:=false  else begin    z:=dx;    dx:=dy;    dy:=z;    change:=true  end;  for i:=1 to dx+dy do begin    if dy< dx then begin            if change then y:=y+sy      else x:=x+sx;              e:=e+2*dy;    end   else       if change then x:=x+sx       else y:=y+sy;    e:=e-2*dx    end;  Form1.Canvas.Pixels[x,y]:=clblack; // вывод точки, для примера end;

27. Алгоритм Брезенхема для генерації окружності У растр потрібно розкладати як лінійні, а й інші, більш складні функції. Розкладаннюконічних перерізів, тобто кіл, еліпсів, парабол, гіпербол, було присвячено значнукількість робіт. Найбільшу увагу, зрозуміло, приділено кола. Один з найбільшефективних і простих для розуміння алгоритмів генерації окружності належитьБрезенхему. Для початку зауважимо, що необхідно згенерувати тільки одну восьмучастину кола. Решта її частини можуть бути отримані послідовними відбитками. Якщо згенерований перший октант (від 0 до 45 ° протигодинникової стрілки), то другий Октант можна отримати дзеркальним відображеннямвідносно прямої у = х, що дає в сукупності перший квадрант. Перший квадрант відбивається відносно прямої х = 0 для отримання відповідної частини кола у другому квадранті. Верхня півколо відбивається відносно прямої у = 0 для завершення побудови.

Для виведення алгоритму розглянемо першу чверть кола з центром в початкукоординат. Зауважимо, що якщо робота алгоритму починається в точці х = 0, у = R, то при генерації окружності за годинниковою стрілкою в першому квадраті у ємонотонно спадною функцією аргументів . Аналогічно, якщо вихідною точкою є у = 0, х == R, то при генерації окружності проти годинникової стрілки х будемонотонно спадною функцією аргументу у. У нашому випадку вибирається генерація за годинниковою стрілкою з початком в точці х = 0, у = R. Передбачається, що центр кола та початкова точка перебувають точно в точках растру. Для будь-якої заданої точки на колі при генерації за годинниковою стрілкою існує тільки три можливості вибрати наступний піксел, найкращим чином наближує окружність: горизонтально вправо, по діагоналі вниз і вправо, вертикально вниз.  Алгоритм вибирає піксель, для якого мінімальний квадрат відстані між одним з цих пікселів і окружністю.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]