Новосибирский Государственный Технический Университет. Факультет автоматики и вычислительной техники Кафедра вычислительной техники (специальность 220100). учебное пособие

Вид материалаУчебное пособие
0.7.3  Алгоритм отсечения многоугольника Вейлера-Азертона
0.8  структуры данных
0.8.1  Последовательный доступ
Очереди и стеки
Подобный материал:
1   ...   16   17   18   19   20   21   22   23   ...   44

0.7.3  Алгоритм отсечения многоугольника Вейлера-Азертона


В предыдущих разделах были рассмотрены два алгоритма отсечения многоугольника, последовательно отсекающие произвольный (как выпуклый, так и невыпуклый) многоугольник каждой из сторон выпуклого окна. Зачастую же требуется отсечение по невыпуклому окну. Кроме того оба рассмотренных алгоритма могут генерировать лишние стороны для отсеченного многоугольника, проходящие вдоль ребра окна отсечения. Далее рассматриваемый алгоритм Вейлера-Азертона [41,,] свободен от указанных недостатков ценой заметно большей сложности и меньшей скорости работы.

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

В случае пересечения границ и отсекаемого многоугольника и окна возникают точки двух типов:

 входные точки, когда ориентированное ребро отсекаемого многоугольника входит в окно,

 выходные точки, когда ребро отсекаемого многоугольника идет с внутренней на внешнюю стороны окна.

Общая схема алгоритма Вейлера-Азертона для определения части отсекаемого многоугольника, попавшей в окно, следующая:
  1. Строятся списки вершин отсекаемого многоугольника и окна.
  2. Отыскиваются все точки пересечения. При этом расчете касания не считаются пересечением, т.е. когда вершина или ребро отсекаемого многоугольника инцидентна или совпадает со стороной окна (рис. 0.3.29 и 0.3.30).
  3. Списки координат вершин отсекаемого многоугольника и окна дополняются новыми вершинами - координатами точек пересечения. Причем если точка пересечения Pk находится на ребре, соединяющем вершины Vi, Vj, то последовательность точек Vi, Vj превращается в последовательность Vi, Pk, Vj. При этом устанавливаются двухсторонние связи между одноименными точками пересечения в списках вершин отсекаемого многоугольника и окна.
    Входные и выходные точки пересечения образуют отдельные подсписки входных и выходных точек в списках вершин.
  4. Определение части обрабатываемого многоугольника, попавшей в окно выполняется следующим образом:
    Если не исчерпан список входных точек пересечения, то выбираем очередную входную точку.
    Двигаемся по вершинам отсекаемого многоугольника пока не обнаружится следующая точка пересечения; все пройденные точки, не включая прервавшую просмотр, заносим в результат; используя двухстороннюю связь точек пересечения, переключаемся на просмотр списка вершин окна.
    Двигаемся по вершинам окна до обнаружения следующей точки пересечения; все пройденные точки, не включая последнюю, прервавшую просмотр, заносим в результат.
    Используя двухстороннюю связь точек пересечения, переключаемся на список вершин обрабатываемого многоугольника.
    Эти действия повторяем пока не будет достигнута исходная вершина - очередная часть отсекаемого многоугольника, попавшая в окно, замкнулась. Переходим на выбор следующей входной точки в списке отсекаемого многоугольника.




Рис. 0.3.27: Случаи не считающиеся пересечением.




Рис. 0.3.28: Частные случаи пересечения.

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

 исходная точка пересечения пересечения берется из списка выходных точек,

 движение по списку вершин окна выполняется в обратном порядке, т.е. так чтобы внутренняя часть отсекателя была слева.

На рис. 0.3.31 иллюстрируется отсечение многоугольника ABCDEFGHI окном PQRS по алгоритму Вейлера-Азертона.




Рис. 0.3.29: Отсечение по алгоритму Вейлера-Азертона.

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

0.8  СТРУКТУРЫ ДАННЫХ


В данном разделе рассмотрены три основных способа работы с данными: последовательный доступ, непосредственный доступ, и списки. Данные могут быть организованы в виде:

 элементов данных (data item) - единичная информация, перерабатываемая системой,

 запись (record) - совокупность некоторого числа элементов данных,

 файл (file) - совокупность некоторого числа записей.

В общем случае структура данных образуется посредством упорядочивания записей и связей между ними в файл. В зависимости от требуемых операций данные в файле организуются различным образом.

0.8.1  Последовательный доступ


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

Выбор требуемой записи в файле с последовательной организацией возможен только путем его сканирования от начала до требуемой записи.

Удаление и/или вставка не последней записи приводят к большим перемещениям данных (рис. 0.4.32, 0.4.33).




Рис. 0.1.1: Удаление записи из файла с последовательным доступом




Рис. 0.1.2: Вставка записи в файл с последовательным доступом

Очереди и стеки


Частными, широко используемыми случаями последовательного доступа, являются очереди и стеки. Наиболее широко используются стеки.

Очередь - файл данных с дисциплиной обслуживания первым пришел - первым обслужен (FIFO - First Input First Output) (рис 0.4.34).




Рис. 0.1.3: Работа с очередью

Стек (магазин, гнездовая память, память LIFO) - файл данных с дисциплиной обслуживания первым пришел - последним обслужен (LIFO - Last Input First Output).

Состояние стека определяется значением указателя стека, инициируемом при его создании. Для работы с созданным стеком достаточны две операции:

 PUSH - помещение записи в стек,

 POP - получение записи из стека.

Эти операции заносят/читают данные и модифицируют значение указателя стека. Стек может быть организован двумя способами, отличающимися правилами продвижения указателя стека:
  1. Указатель стека указывает на последнюю занесенную запись.
    До занесения указатель стека уменьшается на длину записи (рис. 0.4.35).
    После чтения указатель стека увеличивается на длину записи (рис. 0.4.36).




Рис. 0.1.4: Запись данных в стек типа 1




Рис. 0.1.5: Чтение данных из стека типа 1
  1. Указатель стека указывает на свободное место в стеке.
    После занесения указатель стека увеличивается на длину записи (рис. 0.4.37).
    Перед чтением указатель стека уменьшается на длину записи. (рис. 0.4.38).




Рис. 0.1.6: Запись данных в стек типа 2




Рис. 0.1.7: Чтение данных из стека типа 2

Наиболее часто используется первый способ организации стека.