- •Алгоритмы компьютерной графики
- •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.1. Определение факта выпуклости многоугольника
1-й метод. Вычисляем векторные произведения смежных сторон многоугольника. Векторное произведение V1 V2 = (VX1*VY2 – VY1*VX2)*k, где k – единичный вектор, перпендикулярный плоскости, несущей векторы сомножителей. Выводы: если все значения произведений равны нулю – многоугольник вырождается в отрезок; есть как положительные, так и отрицательные знаки произведений – многоугольник невыпуклый; все произведения либо неотрицательные, либо неположительные – многоугольник выпуклый.
2-й метод. Одна из вершин выбирается как базовая, вычисляются векторные произведения пар векторов, начинающихся в этой базе и заканчивающиеся в вершинах многоугольника. Выводы аналогичны предыдущему методу.
3-й метод. Для каждой i-й вершины окна перенести ее так, чтобы эта вершина совпадала с началом координат. Повернуть многоугольник так, чтобы (i + 1)-я вершина оказалась на положительной полуоси X. Вычислить знак ординаты (i + 2)-вершины. Если знаки ординат всех (i + 2)-х вершин либо неположительны, либо неотрицательны, то многоугольник выпуклый, иначе – невыпуклый (рис. 6.8 и 6.9). Достоинством последнего метода является то, что с его помощью можно разбить невыпуклый многоугольник на несколько выпуклых многоугольников, хотя разбиение может оказаться неоптимальным, и некорректно разбиваются многоугольники, стороны которых пересекаются между собой.
6.3.2. Вычисление уравнения внутренней нормали
Нормаль к стороне многоугольника можно вычислить, если вспомнить, что скалярное произведение пары перпендикулярных векторов равны нулю. Если nx и ny – неизвестные компоненты нормали к известному вектору (Vx, Vy) стороны многоугольника, то
n*V = (nx*i + ny*j)*(Vx*i+ Vy*j) = nx*Vx + ny*Vy = 0,
где i и j – единичные векторы, параллельные осям X и Y, следовательно,
nx*Vx = – ny*Vy,
так как нас интересует только направление нормали, то пусть ny = 1 и тогда nx = – (Vy / Vx)*i + j. Если вектор стороны многоугольника образован парой вершин Vi и Vi+1 и если скалярное произведение нормали и вектора от Vi до Vi + 2 положительно, то n – это внутренняя нормаль, иначе – внешняя, и получить внутреннюю нормаль можно, умножив ее на минус 1.
Рис. 6.8. Определение факта выпуклости многоугольника (вариант – многоугольник выпуклый)
Рис. 6.9. Определение факта выпуклости многоугольника (вариант – многоугольник не выпуклый)
З адание на лабораторную работу № 6 "Алгоритмы отсечения отрезков"
Постройте окно отсечения.
Постройте отрезок, пересекающий окно отсечения.
Произведите отсечение отрезка с помощью любого алгоритма.
Выделите другим цветом отсекаемую часть отрезка.
Повторите п.п. 2 и 3 для полностью видимых и невидимых отрезков.
Сравните эффективность различных алгоритмов отсечения.
Чем отличаются алгоритмы Коэна-Сазерленда и FC-алгоритм от алгоритма Кируса-Бека?