- •Алгоритмы компьютерной графики
- •1 . Генерация векторов
- •1.1. Цифровой дифференциальный анализатор (цда)
- •1.2. Алгоритм Брезенхема
- •З адание на лабораторную работу № 1 "Генерация векторов"
- •2. Фильтрация. М одифицированный алгоритм Брезенхема
- •2 .1. Модифицированный алгоритм Брезенхема
- •2.2. Улучшение качества изображения фильтрацией
- •З адание на лабораторную работу № 2 "Фильтрация. Модифицированный алгоритм Брезенхема "
- •3 . Алгоритмы генерации окружности
- •3.1. Целочисленный алгоритм Брезенхема
- •3.2. Алгоритм Мичнера для построения окружности
- •З адание на лабораторную работу № 3 "Алгоритмы генерации окружности"
- •4. Алгоритмы построчного заполнения м ногоугольников
- •З адание на лабораторную работу № 4 "Алгоритмы построчного заполнения многоугольников"
- •5. Заливка области с затравкой
- •5 .1. Заливка области с затравкой
- •5.2. Простой алгоритм заливки
- •5.3 Построчный алгоритм заливки с затравкой
- •З адание на лабораторную работу № 5 "Заливка области с затравкой "
- •6 . Алгоритмы отсечения отрезков
- •6.1. Двумерный алгоритм Коэна-Сазерленда
- •6.2. Двумерный fc-алгоритм
- •6.3. Алгоритм Кируса-Бека
- •6.3.1. Определение факта выпуклости многоугольника
- •6.3.2. Вычисление уравнения внутренней нормали
- •З адание на лабораторную работу № 6 "Алгоритмы отсечения отрезков"
- •7 . Алгоритмы отсечения многоугольников
- •7.1 Алгоритм Сазерленда-Ходжмена
- •7.2. Алгоритм отсечения многоугольников Вейлера-Азертона
- •З адание на лабораторную работу № 7 "Алгоритмы отсечения многоугольников"
- •Заключение
- •Оглавление
6.3. Алгоритм Кируса-Бека
Алгоритм Кируса-Бека относится к классу алгоритмов с параметрическим представлением отрезка и окна отсечения. При создании надежного алгоритма отсечения необходимо иметь хороший метод определения местоположения относительно окна точки, принадлежащей отрезку, – внутри, на границе или вне окна. Для этого в алгоритме Кируса-Бека используется вектор нормали.
Возьмем выпуклую двумерную область R (рис. 6.5) – она должна быть выпуклым многоугольником. Внутренняя нормаль в точке a, лежащей на границе R, удовлетворяет условию:
nвн*(b – a) 0,
где b – любая точка, лежащая на границе R.
Рис. 6.5. Определение местоположения точки относительно окна отсечения в алгоритме Кируса-Бека
Так как скалярное произведение двух векторов равно:
V1*V2 = V1*V2*cos(),
где - меньший из двух углов, образованных V1 и V2. Причем, если = /2, то V1*V2 = 0 и вектора V1 и V2 перпендикулярны. Угол между nвн и любым вектором между точками a и b всегда принадлежит интервалу –/2 /2 и, следовательно, cos() всегда 0 и скалярное произведение nвн*(b – a) неотрицательно (для внешней (наружной) нормали скалярное произведение nнар*(b – a) всегда неположительно).
Параметрическое представление отрезка имеет вид:
P(t) = P1 + (P2 – P1)*t; 0 t 1.
Если f – граничная точка выпуклой области R, а n – внутренняя нормаль к одной из ограничивающих эту область плоскостей, то для любой конкретной величины t (т.е. для любой точки отрезка P1P2) из условия n*(P(t) – f) < 0 следует, что вектор (P(t) – f) направлен вовне области R, из условия n*(P(t) – f) = 0 следует, что вектор (P(t) – f) принадлежит плоскости, которая проходит через f, и перпендикулярен нормали, из условия n*(P(t) – f) > 0 следует, что вектор (P(t) – f) направлен внутрь области R (рис. 6.6).
Из всех условий взятых вместе следует, что бесконечная прямая пересекает замкнутую область (выпуклую двумерную) ровно в двух точках и уравнение n*(P(t) – f) = 0 имеет только одно решение и точка P(t) будет точкой пересечения отрезка с граничной плоскостью.
Из всего вышесказанного и вытекает алгоритм Кируса-Бека.
Параметрическое описание отрезка (как уже отмечалось выше) имеет вид:
P(t) = P1 + (P2 – P1)*t; 0 t 1.
Рис. 6.6. Исходные данные для алгоритма Кируса-Бека
Скалярное произведение внутренней нормали на вектор, начинающийся в произвольной точке отрезка и заканчивающийся в другой точке, лежащей на той же границе окна (ni*(P(t) – fi ); i = 1,2…) будет положительным, равным нулю или отрицательным в зависимости от того, будет ли избранная точка отрезка лежать с внутренней стороны границы, на самой границе или с ее внешней стороны. Это справедливо для любого ребра. Подставим P(t) для нахождения пересечения:
ni*[P1 + (P2 – P1)*t – fi] = 0
Или в другой форме:
ni*[P1 – fi] + ni*[P2 – P1]*t = 0
Вектор (P2 – P1) – определяет ориентацию отрезка, а вектор (P1 – fi) пропорционален расстоянию от первого конца отрезка до избранной граничной точки. Обозначим D = (P2 – P1) – директриса или ориентация отрезка, а wi = (P1 – fi) – весовой множитель, тогда:
t*(ni*D) + wi*ni = 0 t = –(wi*ni) / (ni*D); D 0; i = 1, 2, 3, …
Равенство D нулю означает, что P2 = P1, т.е. вырождение отрезка в точку и при этом если wi*ni < 0, то точка вне окна отсечения, если wi*ni = 0, то точка находится на границе окна отсечения, если wi*ni > 0, то точка внутри окна отсечения. Вычисляем t, если значение лежит за пределами интервала 0 t 1, то можно его проигнорировать. Может получиться более двух значений t в допустимом интервале. Эти значения следует разбить на две группы: нижнюю и верхнюю в зависимости от того, к началу или к концу отрезка будет ближе вычисленная точка. Необходимо найти наибольшую из нижней группы и наименьшую из верхней группы. При этом если ni*D > 0, то найденное значение t рассматривается в качестве возможного нижнего предела, иначе – верхнего. Блок – схема алгоритма приведена на рис. 6.7.
Рис. 6.7. Алгоритм Кируса-Бека
Для успешной реализации алгоритма Кируса-Бека необходимо знать, выпуклый многоугольник или нет, и определить уравнение внутренней нормали.