Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комп_Граф / КГ_Мет_к_ЛР11.doc
Скачиваний:
71
Добавлен:
08.06.2015
Размер:
672.26 Кб
Скачать
    1. Рекомендации по программной организации данных для представления сложных объектов

ТМО позволяют синтезировать сложные фигуры из более простых, что приводит к появлению объектов с иерархической структурой (рис. 3.1). Объектами нижнего уровня являются используемые примитивы (Pr111 – Pr122), а объектами верхнего – конечные сложные фигуры (Fig1). Число уровней иерархии принципиально не ограничивается.

Рис. 3.1

Для представления таких объектов в программных модулях должны быть созданы соответствующие структуры данных. Наиболее гибким решением по реализации произвольных сложных структур данных является использование ссылок.

Примеры записи структур данных, приведенные ниже, даны на языке Pascal. Тип TColor считается определенным и назначается для переменных, задающих коды цветов.

Примитивы с фиксированным числом параметров описываются объектами с соответствующими полями. Например, для отрезков (векторов) можно использовать структуру вида

Type

Vector = record

x1, y1, x2, y2: Integer;

Color: TColor;

End;

Для описания правильных многоугольников можно использовать следующую структуру:

Type

TrPoligon = record

Name: String; {наименование многоугольника}

N: Integer; {количество сторон}

xс, yс: Integer; {центр описанной окружности}

R: Integer; {радиус описанной окружности}

Color: TColor;

End;

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

Ниже приведен пример возможного описания соответствующих типов данных в программе.

Type

PVertex: ^Vertex; {тип указателей на элементы списка}

Vertex = record {элемент списка вершин}

x, y: Integer;

Next: PVertex; {указатель на следующий элемент в списке}

End;

Poligon = record {тип для представления многоугольников}

Name: String; {наименование многоугольника}

PHead: PVertex; {указатель на начало списка вершин}

Color: TColor;

End;

Рис. 3.2

Достоинством списковой структуры является простота реализации операций по добавлению в любое место списка новых элементов и удалению элементов из списка.

Более сложные графические объекты, синтезируемые с помощью ТМО, удобнее представить в едином формате, не зависящем от конкретных операндов и вида ТМО.

Type

GrObject = record

Name: String; {наименование объекта}

TMO: byte; {код ТМО}

P1, P2: Pointer; {указатели на операнды ТМО}

Color: TColor;

End;

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

Type

PGrObject: ^GrObject; {тип указателей на элементы списка объектов}

GrObject = record {геометрический объект}

Name: String; {наименование объекта}

TMO: byte; {код ТМО или типа примитива}

P1, P2: Pointer; {указатели на операнды ТМО}

Next: PGrObject; {указатель на следующий объект в списке}

Color: TColor;

End;

Приведенный тип позволяет объединить в единый список и отдельные примитивы и фигуры любой сложности, полученные с помощью ТМО. Для примитивов один из указателей, например P1, необходимо использовать для ссылки на описание примитива, а второй – не использовать. Тогда, например, графический объект Fig1, структура которого приведена на рис. 3.1, и объект Fig2, созданный из двух примитивов, могут быть представлены структурой данных, приведенной на рис. 3.3. На рис. 3.3 переменная FirstPt типа PgrObject является указателем на начало списка фигур.

Рис. 3.3

Обычно над фигурами, полученными с помощью ТМО, также выполняются геометрические преобразования. Если для их реализации используется интегральная форма, то параметры геометрических преобразований, например, матрицу результирующего преобразования, следует размещать в дополнительном поле каждого объекта типа GrObject.

Соседние файлы в папке Комп_Граф