- •Введение
- •1. Машинная графика и обработка изображения с помощью эвм
- •2. Типы графических устройств
- •2.1. Графические дисплеи на запоминающей трубке
- •2.2. Векторные графические дисплеи с регенерацией изображения
- •2.3. Растровые графические дисплеи с регенерацией изображения
- •2.4. Диалоговые устройства
- •3. Основы растровой графики
- •3.1. Алгоритмы вычерчивания отрезков
- •3.2. Цифровой дифференциальный анализатор
- •3.3. Алгоритм Брезенхема
- •3.4. Целочисленный алгоритм Брезенхема
- •3.5. Общий алгоритм Брезенхема
- •3.6. Алгоритм Брезенхема для генерации окружности
- •4. Растровая развертка изображения
- •4.1. Растровая развертка в реальном времени
- •4.2. Групповое кодирование
- •4.3. Клеточное кодирование
- •4.4. Буферы кадра
- •4.5. Изображение отрезков
- •4.6. Изображение литер
- •4.7. Растровая развертка сплошных областей и заполнение многоугольников
- •1 X 8 – внутри многоугольника;
- •1 Х 4 – внутри многоугольника;
- •6 Х 8 – внутри многоугольника;
- •4.8. Простой алгоритм с упорядоченным списком ребер
- •4.9. Алгоритм заполнения по ребрам
- •4.10. Алгоритм со списком ребер и флагом
- •4.11. Алгоритм заполнения с затравкой
- •4.12. Построчный алгоритм заполнения с затравкой
- •4.13. Основные методы устранения ступенчатости
- •4.14. Аппроксимация полутонами
- •5. Отсечение
- •5.1. Двумерное отсечение
- •5.2. Алгоритм отсечения Сазерленда-Коэна
- •5.3. Алгоритм разбиения средней точкой
- •5.4. Обобщение: отсечение двумерного отрезка выпуклым окном
- •5.5. Алгоритм Кируса–Бека
- •5.6. Внутреннее и внешнее отсечение
- •5.7. Определение факта выпуклости многоугольника
- •5.8. Разбиение невыпуклых многоугольников
- •5.9. Трехмерное отсечение
- •5.10. Определение выпуклости трехмерного тела
- •5.11. Отсечение невыпуклых тел
- •5.12. Отсечение многоугольников
- •5.13. Последовательное отсечение многоугольника – алгоритм Сазерленда – Ходжмена
- •5.14. Невыпуклые отсекающие области – алгоритм
- •5.15. Литеры
- •6. Удаление невидимых линий и поверхностей
- •6.1. Алгоритм плавающего горизонта
- •6.2. Алгоритм Робертса
- •6.3. Алгоритм Варнока
- •6.4. Алгоритм Вейлера–Азертона
- •6.5. Алгоритм, использующий z-буфер
- •6.6. Алгоритмы, использующие список приоритетов
- •6.7. Алгоритм построчного сканирования
- •6.8. Алгоритм построчного сканирования, использующий
- •Библиографический список рекомендуемой литературы
- •Оглавление
- •1. Машинная графика и обработка изображения с помощью эвм….……..3
5.4. Обобщение: отсечение двумерного отрезка выпуклым окном
В описанных выше алгоритмах предполагалось, что отсекающее окно является координатно-ориентированным прямоугольником. Однако во многих случаях окно не таково. Кирус и Бек предложили алгоритм отсечения окном произвольной выпуклой формы.
Прежде чем описывать алгоритм Кируса-Бека рассмотрим отсечение параметрически заданного отрезка прямоугольным окном. Параметрическое уравнение отрезка P1P2 имеет вид:
P(t)=P1+(P2– P1)t, 0≤t≤1, (1)
где t – параметр. Параметрическое описание отрезка не зависит от выбора системы координат. Это свойство делает параметрическое представление особенно полезным для определения пересечения отрезка со стороной произвольного выпуклого многоугольника.
В двумерной декартовой системе координат уравнение (1) сводится к паре одномерных параметрических уравнений вида:
0≤t≤1.
(2)
y(t)=y1+(y2– y1)t,
В случае прямоугольного отсекающего окна одна из координат пересечения отрезка с каждой стороной известна. Необходимо вычислить только вторую координату. Из уравнения (1) получаем:
t=(P(t)–P1)/(P2– P1).
А из уравнения (2) следует, что значения t, соответствующие пересечениям со сторонами окна, равны:
-
для левой стороны t=(xл–x1)/(x2–x1), 0≤t≤1,
-
для правой стороны t=(xп–x1)/(x2–x1), 0≤t≤1,
-
для нижней стороны t=(yн–y1)/(y2–y1), 0≤t≤1,
-
для верхней стороны t=(yв–y1)/(y2–y1), 0≤t≤1.
Здесь через xл, xп, yн, yв обозначены координаты левой, правой, нижней и верхней сторон окна. Если решения этих уравнений дают значение t за пределами интервала 0≤t≤1, то такие решения отбрасываются, поскольку они соответствуют точкам, лежащим вне заданного отрезка.
5.5. Алгоритм Кируса–Бека
Для создания надежного алгоритма отсечения необходим хороший метод определения местоположения относительно окна (внутри, на границе, вне его) точки, принадлежащей отрезку. Для этой цели в алгоритме Кируса–Бека используется вектор нормали (рис.13).
Возьмем выпуклую отсекающую область R. Доказано, что внутренняя нормаль n в произвольной точке a, лежащей на границе R, удовлетворяет условию:
n(b–a)≥0, (3)
где b – любая точка на границе R, т.к. cos Q всегда положителен.
Возвращаясь к определению пересечения отрезка со стороной окна, вновь возьмем параметрическое представление отрезка P1P2 уравнением (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 следует, что вектор направлен внутрь R. Из всех этих условий, взятых вместе, следует, что бесконечная прямая пересекает замкнутую выпуклую область в двух точках. Далее, пусть эти две точки не принадлежат одной граничной плоскости или ребру. Тогда уравнение n(P(t)–f)=0 имеет только одно решение. Если точка f лежит на той граничной плоскости или ребре, для которых n является внутренней нормалью, то точка на отрезке P(t) будет точка пересечения этого отрезка с указанной граничной плоскостью.
Таким образом запишем формализованный алгоритм Кируса–Бека:
P(t)=P1+(P2–P1)t, 0≤t≤1, (4)
ni(P(t)–fi), i=1, 2, 3,… (5)
Решение уравнения будет положительно, равно нулю или отрицательно - в зависимости от того, будет ли избранная точка отрезка лежать с внутренней стороны границы, на самой границе или с ее внешней стороны. Подстановка (4) в (5) дает условие пересечения отрезка с границей области:
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
Если Wi*ni<0, то эта точка вне окна. Если Wi*ni=0, то эта точка на границе. Если Wi*ni>0, то эта точка внутри окна. Последнее уравнение используется для получения значений t соответствующих пересечениям отрезка с каждой стороной окна. Если значение t лежит за пределом интервала 0≤t≤1, то оно игнорируется.