50376 (Построение трехмерной модели вазы), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Построение трехмерной модели вазы", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50376"

Текст 2 страницы из документа "50376"

Рисунок 3 - Обобщенная структурная диаграмма программы

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

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

Процедура преобразования отвечает за перевод мировых координат в видовые, а потом из видовых в экранные.

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

Процедура составления полигонов выполняет преобразования координат в экранные, составление полигонов из массива точек и сортировку полученных полигонов в Z буфере с учётом их расположения по глубине сцены.

Блок вращения меняет значения углов обзора в соответствии с нажатиями на клавиши позиционирования и вызывает процедуру отрисовки.

3.2 Введенные типы данных и их предназначение

При реализации программы были определены некоторые специализированные типы данных (таблица 1).

Таблица 1 - Типы данных.

Тип

Значение

Предназначение

T3DPoint

record

Содержит 3 координаты точки в трехмерном пространстве, координаты точки на экране, номер точки и нормаль к этой точке имеющая три координаты.

TPolygon

record

Содержит указатели на вершины полигона, то есть содержит переменные типа P3DPoint. нормаль к полигону, номер полигона, цвет и среднюю точку.

3.3 Введенные основные переменные и их предназначение

При реализации программы были определены некоторые переменные (таблица 2).

Таблица 1 - Переменные

Переменная

Значение

Предназначение

w,v1

array [1.. nPoint] of T3DPoint

мировые, видовые координаты вершин

v

array [1.. nPoint] of TPoint

экранные координаты точек

polygons

array [1.. nTPolygon] of TPolygon

массив объектов фигуры

teta

extended

Отвечает за угол поворота относительно оси Y. Имеет фиксированное значение teta:=pi/9.

phi

extended

Отвечает за угол поворота относительно оси X. Имеет фиксированное значение phi:=pi*4/3.

buf

TBitmap

Вспомогательная поверхность в ней создается движение сферы

blink_buf

TBitmap

Вспомогательная поверхность для быстрого закрашивания фоном (хранит в себе фон изображения)

A, B, C, D

переменные типа word типа TPolygon (record)

Определяют номера вершин четырехугольника в полигоне. Диапазон значений - 0.. nTPolygon

ro

real

Определяет расстояние от объекта наблюдения до фигуры. Имеет фиксированное значение

3.4 Текстовое описание основных процедур и функций и их блок-схемы

Процедура FormCreate

Задаются углы поворота, радиусы паралеллей, их количество и высота вазы. Вычисляются видовые координаты вершин вазы (пересечения параллелей и меридианов). Рассчитывается количество полигонов. Создаётся фон типа TBitmap, на котором будет рисоваться фигура (рисунок 4).

Процедура FormKeyDown

В этой процедуре отслеживаются нажатые клавиши с последующим выполнений соответствующих команд.

При помощи процедуры KeyDown задается угол поворота объекта. При нажатии клавиш Up, Down, Left, Right объект поворачивается в заданном направлении (рисунок 5).

Рисунок 5 – Блок-схема процедуры FormKeyDown

Процедура Sort

Для каждого полигона высчитывается вектор нормали и приводится к единичной форме; сортировка массива полигонов по минимальным значениям средних координат (рисунок6).

Рисунок 6 – Блок-схема процедуры Sort

Процедура ViewTransformation

В этой процедуре вычисляются видовые и экранные координаты точек, задаются полигоны. В процедуре мировые координаты переводятся в видовые, в свою очередь которые преобразовываются в экранные координаты точек (рисунок7).

Рисунок 7 – Блок-схема процедуры ViewTransformation

Процедура Draw

Поочередная прорисовка полигонов, то есть который грань дальше от нас прорисовывается первой и т.д (рисунок 8).

Рисунок 8 – Блок-схема процедуры Draw

Функция tone

Функция, задающая плоскость цвета.

В зависимости от угла между направлением взгляда и нормалью цвет должен изменяться. Значение координаты nz нормали для видимой грани изменяется в диапазоне [-1, 0), цвет грани задан в виде RGB компонентов. И, следовательно, для получения цвета грани нужно умножить каждую компоненту на абсолютное значение nz. Для получения компонент цвета воспользовались функциями GetRValue, GetGValue, GetBValue.

3.5 Алгоритм взаимодействия процедур

Рисунок 9 – Алгоритм взаимодействия процедур

4. Тестирование программы

Интерфейс программы представляет собой форму, на которой представлена ваза. Форма имеет фон, для лучшего восприятия.

После запуска программы на экране не наблюдается ничего. Для наблюдения эффектов предлагается использовать следующие кнопки клавиатуры: ВНИЗ: Поворот вокруг оси x вниз; ВЛЕВО: Поворот вокруг оси y влево; ВВЕРХ: Поворот вокруг оси x вверх; ВПРАВО: Поворот вокруг оси y вправо.

Вид окна программы представлен на рисунке 10.

При нажатии на клавиши "влево", "вправо", "вверх", "вниз" происходит соответствующее перемещение фигуры.

Рисунок 10 - Вид окна программы

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

Список литературы

  1. Порев В.Н. Компьютерная графика – СПб.: БХВ – Петербург, 2002. – 432 с.: ил.

  2. Шикин А.В., Боресков А.В. Компьютерная графика. Полигональные модели. – М.: ДИАЛОГ – МИФИ, 2001. – 464с.

  3. Л. Аммерал Принципы программирования в машинной графике. Пер. с англ. – М.: "Сол Систем", 1992. – 224 с.: ил.

Приложение

Листинг программы

unit prog;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls,Math;

type

TForm1 = class(TForm)

procedure KeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);

procedure FormCreate(Sender:TObject);

procedure FormPaint(Sender:TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

T3DPoint=record

x,y,z:extended

end;

TPolygon=record

A,B,C,D:word;

clr:TColor;

end;

const

step=30;//количество точек на одной параллели

nPOINT=step*10+1;

nPOLYGON=step*10+step;

col1=255+255*$100+204*$10000; //цвет стенок(полигонов) вазы

col2=209+154*$100+65*$10000; //цвет дна вазы

var

Form1:TForm1;

Buf,Blinc_Buf:TBitMap;

polygons:array[1..nPolygon] of Tpolygon;

w,v1:array[1..nPOINT] of T3DPoint;//мировые (world),видовые (view) координаты вершин

v:array[1..nPOINT] of TPoint;//экранные (screen) координаты вершин

S:array[1..nPOLYGON] of extended;

n:array[1..nPOLYGON] of T3DPoint; //массив нормалей

teta,phi,d,ro,r:real;

implementation

{$R *.dfm}

function tone(clr:TColor;nz:extended):TColor; //плоскость цвета

begin

tone:=rgb(round(nz*GetRValue(clr)),

round(nz*GetGValue(clr)),

round(nz*GetBValue(clr)))

end;

procedure ViewTransformation;

var i: integer;

begin

for i:=1 to nPOINT Do

begin

v1[i].x:=Round(w[i].x*(-sin(teta))+w[i].y*(cos(teta)));

v1[i].y:=Round(w[i].x*(-cos(phi)*cos(teta))-w[i].y*(cos(phi)*sin(teta))+

w[i].z*( sin(phi)));

v1[i].z:=Round(w[i].x*(-sin(phi)*cos(teta))-w[i].y*( sin(phi)*sin(teta))-

w[i].z*(cos(phi)))+ro;

v[i].x:=Round(Form1.ClientWidth div 2+v1[i].x );

v[i].y:=Round(Form1.ClientHeight div 2+v1[i].y);

end;

end;

procedure Sort;

var

i:integer;

begin

for i:=1 to nPOLYGON do

begin

s[i]:=(v1[polygons[i].a].z+v1[polygons[i].b].z+v1[polygons[i].c].z)/3;

//координаты вектора нормали

n[i].x:=v1[polygons[i].a].y*(v1[polygons[i].b].z-v1[polygons[i].c].z)+

v1[polygons[i].b].y*(v1[polygons[i].c].z-v1[polygons[i].a].z)+

v1[polygons[i].c].y*(v1[polygons[i].a].z-v1[polygons[i].b].z);

n[i].y:=v1[polygons[i].a].z*(v1[polygons[i].b].x-v1[polygons[i].c].x)+

v1[polygons[i].b].z*(v1[polygons[i].c].x-v1[polygons[i].a].x)+

v1[polygons[i].c].z*(v1[polygons[i].a].x-v1[polygons[i].b].x);

n[i].z:=v1[polygons[i].a].x*(v1[polygons[i].b].y-v1[polygons[i].c].y)+

v1[polygons[i].b].x*(v1[polygons[i].c].y-v1[polygons[i].a].y)+

v1[polygons[i].c].x*(v1[polygons[i].a].y-v1[polygons[i].b].y);

if (sqrt(sqr(n[i].x)+sqr(n[i].y)+sqr(n[i].z)))<>0 then

n[i].z:=n[i].z/(sqrt(sqr(n[i].x)+sqr(n[i].y)+sqr(n[i].z)))

else n[i].z:=0;

end;

end;

procedure Draw;

var

j,i1,i:integer;

f: real;

begin

Sort;

f:=0;

buf.Canvas.Draw(0,0,blinc_buf); //рисуем в основном буфере фон

for i1:=1 to nPOLYGON do

begin

//Опред.невидимости грани (слегка затеняем внутреннюю поверхность)

if (n[i1].z>0) then n[i1].z:=n[i1].z*0.60;

end;

for i1:=1 to nPOLYGON do

begin

for i := 1 to nPOLYGON do

if s[i]>f then begin j:=i;f:=s[i];end;

with polygons[j] do

begin

Buf.Canvas.Brush.Color:=tone(clr,ABS(n[j].z)); //цвет полигона

Buf.Canvas.Pen.Color:=tone(clr,ABS(n[j].z*0.96));//цвет границ полигонов

Buf.Canvas.Polygon([v[A],v[B],v[C],v[D]]); //прорисовка полигона

end;

s[j]:=0;

f:=0;

end;

Form1.Canvas.Draw(0,0,buf); //прорисовываем буфер на экране(форме)

end;

procedure TForm1.KeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);

begin

CASE KEY of

VK_UP: phi:=phi+pi*0.05;

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5138
Авторов
на СтудИзбе
443
Средний доход
с одного платного файла
Обучение Подробнее