Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТветы на зачет.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.52 Mб
Скачать

Алгоритмы отсечения многоугольников

Сводится к отсечению линий при условии выпуклости многоугольника. Факт выпуклости или невыпуклости двумерного полигонального окна можно установить путем вычисления векторных произведений его смежных сторон. Выводы, которые можно сделать из анализа знаков этих произведений, таковы:

  • Все знаки равны нулю - многоугольник вырождается в отрезок.

  • Есть как положительные, так и отрицательные знаки - многоугольник невыпуклый.

  • Все знаки неотрицательные - многоугольник выпуклый, а внутренние нормали ориентированы влево от его контура.

  • Все знаки неположительны - многоугольник выпуклый, а внутренние нормали ориентированы вправо от его контура.

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

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

  • Для каждой i-й вершины многоугольника надо так его перенести, чтобы она совпала с началом координат.

  • Повернуть многоугольник относительно координат по часовой стрелке так, чтобы (i+1)-я вершина оказалась на положительной полуоси x.

  • Проанализировав знак ординаты (i + 2)-й вершины. Если он неотрицателен, то многоугольник в (i + 1)-й вершине. Если же этот знак отрицателен, то многоугольник невыпуклый; разбить его.

  • Многоугольник разрезается вдоль положительной полуоси x, т.е. ищутся такие его стороны, которые пересекаются с осью x. Образуются два новых многоугольника: один состоит из вершин, лежащих выше оси x и ближайшей к началу координат точки пересечения с x > xi + 1, а второй - из вершин, лежащих ниже оси x и уже упомянутой точки пересечения.

Алгоритм рекурсивно применяется к полученным многоугольникам до тех пор, пока все они не станут выпуклыми.

Алгоритмы растровой развертки отрезков

  • Цифровой дифференциальный анализатор. Решается дифференциальное уравнение вида dY/dX = Py/Px, где Py = Yk - Yn - приращение координат отрезка по оси Y, а Px = Xk - Xn - приращение координат отрезка по оси X. При этом ЦДА формирует дискретную аппроксимацию непрерывного решения этого дифференциального уравнения. В обычном ЦДА, используемом, как правило, в векторных устройствах, тем или иным образом определяется количество узлов N, используемых для аппроксимации отрезка. Затем за N циклов вычисляются координаты очередных узлов. Получаемые значения Xi, Yi преобразуются в целочисленные значения координаты очередного подсвечиваемого пикселя либо округлением, либо отбрасыванием дробной части. Генератор векторов, использующий этот алгоритм, имеет тот недостаток, что точки могут прописываться дважды, что увеличивает время построения. Кроме того из-за независимого вычисления обеих координат нет предпочтительных направлений и построенные отрезки кажутся не очень красивыми.

  • А лгоритм Брезенхема. Так как приращения координат, как правило, не являются целой степенью двойки, то в ЦДА-алгоритме требуется выполнение деления, что не всегда желательно, особенно при аппаратной реализации. Брезенхем предложил алгоритм, не требующий деления, как и в алгоритме несимметричного ЦДА, но обеспечивающий минимизацию отклонения сгенерированного образа от истинного отрезка, как в алгоритме обычного ЦДА. Основная идея алгоритма состоит в том, что если угловой коэффициент прямой < 1/2, то естественно точку, следующую за точкой (0,0), поставить в позицию (1,0) (рис. а), а если угловой коэффициент > 1/2, то - в позицию (1,1) (рис. б). Для принятия решения куда заносить очередной пиксел вводится величина отклонения Е точной позиции от середины между двумя возможными растровыми точками в направлении наименьшей относительной координаты. Знак Е используется как критерий для выбора ближайшей растровой точки. Если Е < 0, то точное Y-значение округляется до последнего меньшего целочисленного значения Y, т.е. Y-координата не меняется по сравнению с предыдущей точкой. В противном случае Y увеличивается на 1.

  • Модифицированный алгоритм Брезенхема. Основная идея алгоритма состоит в том, чтобы для ребер многоугольника устанавливать яркость пикселя пропорционально площади пикселя, попавшей внутрь многоугольника.