Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчёт_кг.doc
Скачиваний:
4
Добавлен:
27.10.2018
Размер:
2.73 Mб
Скачать
  1. Описание векторных объектов

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

  1. Основные процедуры и функции

    1. procedure show_info – производит обновление строки статуса, т.е показывает текущие значения коэффициентов преобразования, которые хранятся в переменной scene_info;

    2. function need_norm:boolean – проверяет все координаты вершин и если хоть одна из них не принадлежит единичному кубу, т.е требуется нормировка, возвращает значение true;

    3. procedure emul – процедура умножения вектора координат на матрицу преобразования, в качестве параметров используется входной вектор, вектор в который будут записаны результаты преобразования и непосредственно сама матрица преобразования.

    4. procedure transform_pr – преобразует все координаты вершин, умножая их на матрицу преобразований, при этом используя ранее написанную процедуру emul; эта процедура используется для осуществления всех видов преобразований (сдвиг, масштаб, поворот).

    5. procedure norm_coord – процедура нормировки координат, сначала находится минимум по каждой координате и отнимается от всех остальных координат, затем по каждой координате находится максимум и каждая координата делится на соответствующий ей максимум, таким образом, происходит нормировка в единичный куб, пропорции объекта при этом сохраняются.

    6. procedure draw(window:integer) – процедура рисования. В качестве параметра window принимает номер окна, в котором следует изобразить фигуру. Каждое окно имеет свой буфер точек Window_points, который предварительно заполняется. Содержимое этого буфера – координаты точек после проекции фигуры на плоскости. Проекции получаются путем умножения координат вершин фигуры на соответствующие матрицы проекции при помощи процедуры emul; Затем просматривается список ребер и соединяются точки буфера, чьи индексы соответствуют началу и концу ребра.

    7. procedure copy_vert; procedure copy_edge; - копируют информацию о вершинах и ребрах соответственно из таблицы в массивы, с которыми работает программа.

    8. function table_is_right(var s:string;par:integer):boolean; - проверяет таблицы вершин и ребер на корректность. Par – параметр, указывающий какую таблицу проверять вершин или ребер. S – буфер, куда заносится сообщение об ошибке.

  1. Действия: сдвиг, масштаб, поворот

Все операции трансформации осуществляются путем умножения координат вершин на соответствующие матрицы преобразования. Общая матрица трансформации в программе transform. Сначала представляет собой единичную матрицу 4*4. Перед умножением на матрицу вершин, эта матрица обнуляется процедурой clear_matrix, а затем заполняется коэффициентами преобразования.

Сдвиг:

Матрицу сдвига:

T[1,1]:=1; T[2,1]:=0; T[3,1]:=0; T[4,1]:=0;

T[1,2]:=0; T[2,2]:=1; T[3,2]:=0; T[4,1]:=0;

T[1,3]:=0; T[2,3]:=0; T[3,3]:=1; T[4,1]:=0;

T[1,4]:=Dx; T[2,4]:=Dy; T[3,4]:=Dz;T[4,4]:=1;

Масштабирование:

Матрица масштабирования:

S[1,1]:=Sx; S[2,1]:=0; S[3,1]:=0; S[4,1]:=0;

S[1,2]:=0; S[2,2]:=Sy; S[3,2]:=0; S[4,1]:=0;

S[1,3]:=0; S[2,3]:=0; S[3,3]:=Sz; S[4,1]:=0;

S[1,4]:=0; S[2,4]:=0; S[3,4]:=0; S[4,4]:=1;

Поворот:

Матрица поворота имеет вид:

Rx[1,1]:=1; Rx[2,1]:=0; Rx[3,1]:=0; Rx[4,1]:=0;

Rx[1,2]:=0; Rx[2,2]:=cos(a); Rx[3,2]:=-sin(a); Rx[4,1]:=0;

Rx[1,3]:=0; Rx[2,3]:=sin(a); Rx[3,3]:=cos(a); Rx[4,1]:=0;

Rx[1,4]:=0; Rx[2,4]:=0; Rx[3,4]:=0; Rx[4,1]:=1;

Поворот по другим осям аналогичен.