Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комп_граф.doc
Скачиваний:
22
Добавлен:
07.05.2019
Размер:
729.09 Кб
Скачать

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 + (P2P1)*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 + (P2P1)*t; 0  t  1.

Рис. 6.6. Исходные данные для алгоритма Кируса-Бека

Скалярное произведение внутренней нормали на вектор, начинающийся в произвольной точке отрезка и заканчивающийся в другой точке, лежащей на той же границе окна (ni*(P(t) – fi ); i = 1,2…) будет положительным, равным нулю или отрицательным в зависимости от того, будет ли избранная точка отрезка лежать с внутренней стороны границы, на самой границе или с ее внешней стороны. Это справедливо для любого ребра. Подставим P(t) для нахождения пересечения:

ni*[P1 + (P2P1)*t fi] = 0

Или в другой форме:

ni*[P1 fi] + ni*[P2P1]*t = 0

Вектор (P2P1) – определяет ориентацию отрезка, а вектор (P1fi) пропорционален расстоянию от первого конца отрезка до избранной граничной точки. Обозначим D = (P2P1) – директриса или ориентация отрезка, а wi = (P1fi) – весовой множитель, тогда:

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. Алгоритм Кируса-Бека

Для успешной реализации алгоритма Кируса-Бека необходимо знать, выпуклый многоугольник или нет, и определить уравнение внутренней нормали.