Программирование трехмерных изображений в VisualBasic.NET
ВВЕДЕНИЕ
Актуальность
Одной из самых динамично развивающихся областей компьютерных технологий
на сегодняшний день является компьютерная графика.
Компьютерная графика применяется:
· в управлении и экономике
· в задачах логистики (например, для построения трехмерной
модели складов)
· для виртуального отображения пространственного расположения
указанного объекта (например, контейнера на полке)
При помощи разработки трехмерных изображений можно улучшить и ускорить
процесс проектирования и создания технически сложных объектов: зданий, станков,
сложных объектов. Построение трехмерных изображений на мониторе компьютера
позволяет сэкономить большие материальные средства. Кроме того, данная тема
является недостаточно проработанной в современной экономике, и поэтому она
представляет наибольший интерес для экономистов. Предметом исследования
является программа по вращению трехмерных изображений на языках VB.NET и VRML.
Целью данной курсовой работы является разработка программ на языках Visual Basic.NET и VRML, позволяющих вращать трехмерные
изображения, являющиеся моделями какого-либо реального объекта, для обозрения
его со всех сторон.
Поставленная цель раскрывается через следующие задачи:
¾ исследовать область применения трехмерных изображений в
экономике;
¾ изучить принцип построения трехмерной графики на VB.NET и VRML;
¾ разработать программы на языках VB.NET и VRML “Вращение куба”.
. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ ПОСТРОЕНИЯ ТРЕХМЕРНЫХ ИЗОБРАЖЕНИЙ
1.1 Понятие трехмерной графики
Трёхмерная графика - раздел компьютерной графики, совокупность приемов и
инструментов (как программных, так и аппаратных), предназначенных для
изображения объёмных объектов. Больше всего применяется для создания
изображений на плоскости экрана или листа печатной продукции в архитектурной визуализации,
кинематографе, телевидении, компьютерных играх, печатной продукции, а также в
науке и промышленности.
Трёхмерное изображение на плоскости отличается от двумерного тем, что
включает построение геометрической проекции трёхмерной модели сцены на плоскость
(например, экран компьютера) с помощью специализированных программ. При этом
модель может, как соответствовать объектам из реального мира (автомобили,
здания, ураган, астероид), так и быть полностью абстрактной (проекция
четырёхмерного фрактала).
Ве́кторная гра́фика - способ представления объектов
и изображений в компьютерной графике, основанный на использовании элементарных
геометрических объектов, таких как точки, линии, сплайны и многоугольники.
Термин используется в противоположность к растровой графике, которая
представляет изображение как матрицу фиксированного размера, состоящую из точек
(пикселей) со своими параметрами.
1.2 Области применения трехмерной графики
Трехмерное моделирование сегодня применяется в очень многих сферах. В
первую очередь, это строительство. Это может быть модель будущего дома,
офисного здания, любого промышленного объекта. Визуализация активно применяется
в дизайн-проектах интерьеров.
D модели очень популярны в сайтостроительстве. Программы и технологии
трехмерного моделирования широко применяются в производстве, например, в
производстве корпусной мебели, и в строительстве, например, для создания
фотореалистичного дизайн-проекта будущего помещения.
Трехмерные модели незаменимы для презентаций, выставок, а также используются
в работе с клиентами, когда необходимо наглядно показать, каким будет итоговый
результат.
Компьютерная графика стала основным средством взаимодействия человека с
ЭВМ. Важнейшими сформировавшимися областями приложений являются:
· компьютерное моделирование, которое явилось исторически первым широким
приложением компьютерной графики,
· системы автоматизации научных исследований, системы
автоматизации проектирования, системы автоматизации конструирования, системы
автоматизации производства, автоматизированные системы управления
технологическими процессами,
· бизнес,
· искусство,
· средства массовой информации,
· досуг.
1.3 Преимущества трехмерного моделирования
Преимуществ у трехмерного моделирования перед другими способами
визуализации довольно много. Трехмерное моделирование дает точную модель,
максимально приближенную к реальности.
В трехмерную модель очень легко вносить любые изменения. Можно изменять
проект, убирать одни детали и добавлять новые.
Из трехмерной модели легко можно выделить чертеж каких-либо компонентов
или конструкции целиком. В результате снижаются временные затраты на
проектирование, уменьшаются издержки.
Специальные программы дают возможность интеграции с любым другим
профессиональным программным обеспечением, например, с приложениями для
инженерных расчетов, программами для станков или бухгалтерскими программами.
Внедрение подобных решений на производстве дает существенную экономию ресурсов,
значительно расширяет возможности предприятия, упрощает работу и повышает ее
качество.
В некоторых ситуациях необходимо заменить исследуемую систему (оригинал)
каким-то объектом, сходную с оригиналом по поведению или описанию (моделью). В
этом случае можно использовать трехмерную графику.
1.4 Пакеты инженерной графики для работы с трехмерными объектами
Программные пакеты, позволяющие создавать трёхмерную графику, то есть
моделировать объекты виртуальной реальности и создавать на основе этих моделей
изображения, очень разнообразны.
¾ Rhinoceros 3D
(Преимущественно используется в промышленном дизайне, архитектуре,
корабельном проектировании, ювелирном и автомобильном дизайне, в CAD/CAM
проектировании, быстром прототипировании, реверсивной разработке, а также в
мультимедиа и графическом дизайне)
¾ NevercenterSilo
(инструмент 3D моделирования с широкими возможностями - от «лепки»
высокополигонных скульптурных органических форм до построения точных
технических объектов.Такая идеология программы позволяет с успехом осуществлять
самый широкий круг проектов для самых разных задач - от персонажей компьютерных
игр до архитектуры)
¾ AutoCADCivil 3D
(Среди новых возможностей продукта - работа с напорными трубопроводными
сетями, улучшенная топосъемка, создание основных карт и проектирование
железнодорожных путей. Улучшена работа многих функций проектирования транспортных
сооружений - формирования коридоров, 3D-навигации, выполнения запросов и
определения границ поверхностей. AutoCADCivil 3D позволяет оптимизировать
проекты инфраструктуры.)
¾ AutoCAD
(Двух- и трёхмерная система автоматизированного проектирования и
черчения, разработанная компанией Autodesk.Программа включает в себя полный
набор инструментов для комплексного трёхмерного моделирования)
a. Форматы хранения пакетов инженерной
графики
COLLADA - формат, разработанный для обмена между 3D приложениями. (Реализована
поддержка таких программ, как Maya;3ds Max; Poser (v.7.0); Lightwave 3D
(version 9.5); Cinema 4D (MAXON); SoftimageXSI; Houdini; MeshLab; CityScape,
CityEngine, SketchUp, Blender и другие)
SKP
(*.skp)- это формат для пакетов SketchUp. SketchUp - программа для быстрого
создания и редактирования трёхмерной графики.)
U3D (*.u3d) - универсальный формат файла
трёхмерной графики, использующий сжатие данных. (Формат файла определён
консорциумом 3D IndustryForum, объединившим различные группы компаний и
организаций, включая Intel, Boeing, HP, AdobeSystems, BentleySystems,
RightHemisphere и другие, для которых основной задачей является продвижение
трёхмерной графики в различных сферах промышленности, имеющих специализацию в
производстве, строительстве и промышленном проектировании.)
VRML-
это текстовый формат файлов, где, например, вершины и грани многогранников
могут указываться вместе с цветом поверхности, текстурами, блеском,
прозрачностью и так далее.
X3D (*.x3d) -это стандарт ISO, предназначенный для работы с трёхмерной
графикой в реальном времени.(*.x)
-формат файла для хранения 3D объектов, созданный компанией Microsoft.Этот
формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты
нормалей), текстурные координаты, описание материалов, пути и названия к
текстурам, которые используются.
1. Возможности
работы с трехмерной графикой на языках VB.NET и VRML
Visual Basic .NET (VB.NET) - это объектно-ориентированный язык
программирования, который можно рассматривать как очередной виток эволюции
Visual Basic (VB), реализованный на платформе Microsoft .NET. VB.NET не имеет
обратной совместимости с более ранней версией (Visual Basic 6.0). Развитие
проектов старых версий (*.vbp) возможно только после предварительной конвертации
их в формат VB.NET специальным мастером (Migration Wizard); однако, как
правило, после конвертации требуется существенная ручная доработка текстов.
1.5 Основы программирования на языке VB.NET
Краткий перечень возможных типов переменных Visual Basic.Net:
· Double - это числовой тип. Применятся для хранения чисел в
экспоненциальной форме. Для хранения переменной отводится 8 байт. Отрицательные
значения находятся в промежутке от - 1,79769313486231E+308 до
-4,94065645841247E-324. Положительные значения входят в промежуток от
4,94065645841247E-324 до 1,79769313486231E+308.
· Integer - предназначен для обработки целочисленных значений.
Переменная подобного типа занимает 4 байта. Возможные значения находятся в
промежутке от - 2 147 483 648 до 2 147 483 647.
· Single - предназначен для хранения чисел в экспоненциальной
форме. Для хранения переменной отводятся 4 байта. Отрицательные возможные
значения переменной такого типа расположены в промежутке от 3,402823E+38 до
-1,401298E-45. Положительные значения укладываются в промежуток от 1,401298E-45
до 3,402823E+38.
· String - строковый тип. Предназначен для хранения строк
различной длинны. Возможная длинна строки, может, доходит до 2-х миллионов
символов кодировки Unicode. Объем памяти для хранения переменной выделяется в
зависимости от длинны строки.
· Byte - числовой тип. Для хранения переменной отводиться 1
байт. Значения переменной может находиться в промежутке от 0 до 255. Знак не
используется.
По зоне видимости различают локальные и глобальные переменные. Первые
доступны только конкретной подпрограмме, вторые - всей программе.
Объявление локальных переменных:DimcPX, cPYAsSingle
Объявление глобальных переменных: PrivatecPX, cPYAsSingle
Типы данныx пишутся после As.
Объявление функций:Sub имя()
тело функции
EndSub
Основные операторы:
IF...Then
Оператор записывается одной строкой. Применяется он, как правило, для
выполнения одной инструкции. Синтаксис его выглядит так:условие Then действие
то есть при выполнении данного условия выполняется указанное
действие....Next
Этот цикл применяется при необходимости точного указания
количества итераций. Хотя это можно сделать и в других циклах. Синтаксис
оператора выглядит примерно так:
Forn =
0 To 100 Step
Инструкция
Число n указывает на итерацию, с которой начинается выполнение
инструкций, а 100 - это общее количество итераций. Выход из цикла
осуществляется с помощью оператора ExitFor.
С помощью методов класса Math можно выполнить любые математические
вычисления.
math.Sin(а)
Синус числа а
math.Cos(a)
Косинус числа а
Массивы
Объявление одномерного массива:(3) AsInteger
Областью видимости этого массива является процедура. После имени массива
стоят скобки, в которых указано количество элементов. Отсчет начинается с 0.
Тип данных - Integer. Таким образом, это одномерный массив, состоящий из
четырех элементов, имеющих данные типа Integer. Данный массив состоит из
четырех целых чисел. Элементам массива необходимо присвоить значения. Делается
это следующим образом:
Dimmas(2)
AsInteger
mas(0)
= 1(l) = 3(2) =
Создание
двухмерной графики.
Прежде чем приступить к созданию трехмерной графики рассмотрим коротко
общие правила создания графики средствами VISUAL BASIC NET.
Рисование на языке VISUAL BASIC NET
Событие - это вызов объектом внешней по отношению к данному объекту
процедуры. Событие может совершаться, если в состоянии объекта произошли
изменения, например щелчок кнопки Button.
Для создания строки нужного кода используется любой параметр. Этот
параметр можно рассматривать как переменную, имеющую своим значением результат
пользовательского события, например, доступ к классу Graphics, который содержит
классы и методы служащие для создания графики.
Создаем объект p класса Graphics:p As Graphics = Me.CreateGraphics-
ключевое слово, которое дает возможность обратиться к конкретным экземпляром
класса или структуры, в которых код выполняется в данный момент. Me ведет себя
как любой объект переменной или переменной структуры, ссылаясь на текущий
экземпляр.- метод управления или форма для получения ссылки на графический
объект.
Теперь, используя объктр p, можно рисовать фигуры.
p.DrawPolygon () - рисуетмногоугольник.
p.Rectangle(110,
110, 200, 200)
рисует прямоугольник из точки(110,110) с шириной и длиной 200.
Есть и другой способ рисования:
Конструктор точки выглядит так:pt As Point
pt = New Point(100, 100)
Затем конструктор размеров:
Dim sz As New Size(150, 150)
И конструктор прямоугольникаrct2 As Rectangle
rct2 = New Rectangle(pt, sz)
Конструктор пераpn As Pen = New Pen(Color.Black, 3)
Теперь рисуем прямоугольник (методом DrawRectangle)
e.Graphics.DrawRectangle (pn, rct2)
Создание
трехмерной графики с использованием математических формул.
Система координат
При построении моделей используется та система координат, которую
предлагает нам компьютер. В дальнейшем необходимо будет разработать собственную
систему координат. Но любая созданная система координат будет создаваться на
базе уже существующей, то есть экранной системы.
Соответственно, горизонтальная составляющая координат (ось X) направлена слева направо, а
вертикальная составляющая (ось Y) -
сверху вниз. При создании трехмерной графики приходится учитывать третье
измерение. Для определения кажущейся удаленности объектов служит третье
измерение (ось Z).
Создание трехмерного объекта
Объемный рисунок - это всего лишь видимость. Созданное трехмерное
изображение остается двухмерным, так как экран монитора остается плоским.
Изменение координаты Z
влечет за собой изменение координат X и Y в двухмерном измерении.
Главнейшим из элементов является точка (Point), являющаяся вершиной графического объекта.
Координаты точек задают направление и размеры любой линии рисунка, будь то
ребра куба или стороны ничтожно малых треугольников, из которых состоят грани
того же куба.
Зададим координаты двух точек, расположенных в трехмерном пространстве и
посмотрим, как изменяются вертикальная и горизонтальная координата в
зависимости от изменения координаты Z. Координату, определяющую глубину расположения рисунка можно
рассматривать как величину условную, ее изменение влечет за собой всего лишь
изменение координат X и Y.
Выявим математическую зависимость между координатами точек. Это
необходимо для того, чтобы размеры между отдельными элементами рисунка были
строго пропорциональны друг другу. Таким образом, определив величину координаты
Z, можно определить соответствующие ей
величины горизонтальных и вертикальных координат. Это будет выглядеть так:
) (1)
(2)
Так же необходимо использовать коэффициент, определяющий соотношение
размеров отдельных объектов в зависимости от степени их предполагаемого
удаления от экрана. Величину коэффициента можно задать практически любую.
Главное, чтобы величина этого коэффициента была одинакова для всех элементов
рисунка.
(3)
(4)
Если мы хотим получить точку с координатами (X1, Y1, Z1), то нам следует создать для ее
отображения точку с координатами X и Y. Имеются ввиду реальные координаты,
то есть те, которые использует компьютер. Данные формулы справедливы только для
того случая, когда точка, определяющая начало созданной вами системы координат
совпадает с началом отсчета компьютерной системы координат. Точка, являющаяся
началом нарисованной системы координат, определена нами в трехмерном
пространстве как имеющая следующие координаты: X =0, Y = 0,
Z = 0.
Реальные ее координаты равны: X = 20 и Y = 300. Так как при расчетах действий
программы компьютер будет учитывать только собственную (экранную) систему
координат. Поэтому необходимо установить прочную связь между всеми системами
координат участвующими в работе создаваемой вами программы. Применительно к
нашему случаю надо добавлять к координатам выбранной точки реальные координаты
начала созданной трехмерной системы координат.
Приведенные выше формулы в окончательном виде будут выглядеть так:
(5)
(6)
X0 и Y0 - это реальные координаты точки,
определяющей начало созданной нами трехмерной системы координат
Движение
объектов.
Понятие движение в данном случае подразумевает три действия: перемещение,
поворот, сжатие или растяжение объекта. Так как любой объект компьютерной
графики можно рассматривать как совокупность вершин и жестко привязанных к ним
ребер и граней, то любые действия над объектом следует рассматривать как
действия над вершинами объекта. То есть для изменения положения графического
объекта необходимо соответствующим образом изменить положение всех его вершин.
При построении рисунка координаты центральной точки будем считать равными
нулю и, соответственно, координаты всех вершин рисунка отсчитываются от нуля.
Предположим нам нужно записать в коде горизонтальные координаты точек отстоящих
друг от друга на расстоянии в сто пикселов. Тогда код, определяющий эти
координаты, будет выглядеть так
(7)
(8)
Эти точки находятся на равном расстоянии, соответственно, слева и справа
от центра экрана. А при переводе в трехмерные координаты обязательно следует
указать координаты центральной точки:
(9)
(10)
Вращение вершин фигуры вокруг OX
(11)
(12)
(13)
Вращение вокруг OY
(14)
(15)
(16)
Вращение вокруг Oz
(17)
(18)
(19)
Затем их необходимо перевести в экранные координаты вершин, учитывая ось
Z
(20)
(21)
В VRML приняты следующие единицы измерения:
· Расстояние и размер: метры
· Углы: радианы
· Остальные значения: выражаются, как
часть от 1.
· Координаты берутся в трехмерной
декартовой системе координат.
Так как Vrml-документ представляет собой обычный
тестовый файл, то для того, чтобы VRML-браузер распознал файл с VRML-кодом, в
начале файла ставится специальный заголовок:
#VRML V2.0 ascii.0-определяет версию программы, на
которой просматривается кодопределяет кодировку текста программы
Shape - это объект, описывающий некую геометрию. Например:{Box { }Appearance
{Material {0 0 1
}
}
}
Эта программа описывает обычный прямоугольник.
У каждого обекта в языке VRML
существуют свойства: geometry - геометрия и appearance - внешний вид.
Что бы задать геометрию, полю geometry присвоено значение объекта Box. После в скобках указывается size-размер, например {1 1 1}.
Что бы задать внешний вид, полю appearance необходимо присвоить значение
объекта, например Appearance. Объект Appearance обладает собственными полями.
Ему присвоено значение объекта Material, и уже в нём используется поле
diffuseColor, значение которого определяет цвет конуса. Цвет задаётся как
комбинация трёх составляющих: красный (0), зелёный(0) и синий(1).
2. Реализация программ на языках VB.NET и VRML «Вращение куба»
2.1 Принцип работы программы «Вращение куба» на языке VB.NET
После открытия программы Microsoft VisualStudio 2005
нужно создать новый проект, выбрав среди языков программированияVisualBasic, затем WindowsApplication.
На экране появилось окно- форма, на который в дальнейшем будет
отображаться и вращаться куб. Теперь с помощью TextBox создаются четыре кнопки,
с помощью которых будет вращаться куб вверх, вниз, вправо и влево.
Сначала в самом теле программы необходимо объявить все глобальные
переменные(до стандартной функции Form_Load).
В программе объявлены глобальные переменные, определяющие центр экрана,
угол поворота куба, все координаты вершин куба (в двумерном и трехмерном
пространстве), параметры куба (ширина, высота, глубина), массив для считывания
данных с файла.
Далее, после Form_Load, создается функция vvod() для
считывания параметров куба с текстового файла формата *.txt.
В этой функции считывание строк с файла осуществляет оператор
sw.ReadLine(), а разбиение Mid(a, j, 1), гдеa-строка,
j-номер символа, с которого записывать.
Функция val() осуществляет присвоение значений переменным, так же
вычисляет координаты центра в трехмерных координатах, используя формулы.
(22)
(23)
Вместо половины ширины экрана использовано произвольное значение 300.
Функция val() позволяет вращать влево и вправо куб при помощи формул
(24)
(25)
Таким образом, переменная angle1 отвечает за поворот вниз, а angle за
поворот вверх.
Функция val1()
используется при повороте вправо и влево, соответственно переменными angle1 и
angle, которые при каждом нажатии на кнопки, либо увеличиваются , либо
уменьшаются.
С помощью кнопок Button_Click составлены четыре процедуры, в которых
происходит вращение.
В Button1_Click и Button3_Click вызывается функция val() для присвоения
значений переменным и изменения угла. Затем в функции вычисляются координаты
всех вершин куба с помощью формул. Рассмотрим одну из вершин:
(26)
(27)
(28)
Все координаты отсчитываются относительно центра экрана, с использованием
заданных с файла параметров куба (ширины, высоты и глубины).
Далее осуществляется вращение каждой вершины с помощью формул вращения
вокруг осей, описанных в предыдущей главе.
Далее создается объект p для
рисования и очистка экрана.
Dim p As Graphics = Me.CreateGraphics
p.Clear(Color.White)
Затем с помощь DrawPolygon выводится изображение куба на форму в виде 6 прямоугольников.
В Button2_Click и Button4_Click отличается от предыдущего тем, что
вначале вызывается функция val1(), которая осуществляет поворот влево и вправо.
Так как программа считывает данные с файла, необходимо создать текстовый
файл в каталоге программы WindowsApplication7\bin\Debug\ . В этом файле в
первой строке требуется указать три координаты прямоугольника через пробел
(строку необходимо начать с пробела и после написания трех координат тоже
поставить пробел). Например: 234 250 300.
2.2 Принцип работы программы «Вращение куба» на языке VRML
Программа написана в конструкторе Vrmlpad. В заголовке указана версия программы-просмотра кода
- 2.0, в кодировке Юникод.
С помощью объекта Shape
и его свойства geometry
Box нарисован прямоугольник с размерами
ширина - 1, длина - 1, высота - 1. Свойство diffuseColor окрашивает прямоугольник в зеленый цвет.
Файл имеет расширение *.vrml и
может быть просмотрен в любом плагине для браузера, например в CORTONA3D
ЗАКЛЮЧЕНИЕ
В курсовой работе разработана программа, которая выполняет вращение куба,
параметры которого задаются из файла, с учетом перспективы.
Несколько планов на доработку кода программы:
¾ Фигуру куба можно доработать до модели здания. Для этого
нужно куб разбить на необходимое количество горизонтально расположенных
прямоугольников-этажей. Такая программа может выполнять задачи, связанные
необходимостью сэкономить материалы, то есть, например, будет рисовать наиболее
короткий путь проложения электрической проводки
¾ Так же фигуру куба можно использовать как склад. Для этого
нужно разбить куб на необходимое количество кубиков, которые будут
соответствовать ящикам на складе. Такая программа будет выполнять задачи с
поиском необходимого ящика, который, возможно, будет лежать в самой
труднодоступной области.
язык трехмерный
инженерный графика
СПИСОК
ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ
1. Трусов
M. А. VisualBasic .NET. Создание графических объектов и основы
программирования- M.: HT Пресс, 2006. - 160 с.
2. Джамбруно
М..Трёхмерная графика и анимация. В 2 т. Т. 2 - М.: Вильямс, 2002. - 640 с.
. Сайлер
Б. Использование VisualBasic 6. /
Брайан Сайлер, ДжеффСпоттс- М.: Вильямс, 2007. - 832 с.
. ИвановВ.
П.. Трёхмерная компьютерная графика /В. П. Иванов, А. С. Батраков; под ред. Г.
М. Полищука. - М.:Радио и связь, 1995. - 224 с.
. Жарков
В.А. Компьютерная графика, мультимедиа и игры на VisualC#2005.-М.:Жарков Пресс,2005.-812с.
. Сафронов
И. Visual Basic в задачах и примерах./ И.Сафронов- БХВ-Петербург. - СПб:
«БХВ-Петербург», 2008. - 400 с.
. Ананьев
А. Самоучитель VisualBasic 6.0/А.Ананьев,А.Федоров-М.: BHV - Санкт -
Петербург,2000.- 624 с.
8. Графические форматы
[Электронный ресурс]: Свободная экциклопедия - Режим доступа к энциклопедии.:
<http://ru.wikipedia.org/wiki> - Загл. с экрана.- яз. рус. ,англ. и др.
. Visual Basic .NET
[Электронный ресурс]: Свободная экциклопедия - Режим доступа к энциклопедии. :
<http://ru.wikipedia.org/wiki> - Загл. с экрана.- яз. рус., англ. и др.
10. VRML-с чего начать [Электронный ресурс]: Свободный ресурс-
Режим доступа: <http://vrml.org.ru/htm/first/>- Загл. с экрана- яз. рус.
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ 1
Программа на языке VisualBasic .NET “Вращение
куба”
Class Form1CenterPX, CenterPY, CenterPZ As Single 'центрcPX, cPY As
Singleangle As Singleangle1 As Singleax1, ay1, az1, ax1R, ay1R, az1R, ax1D,
ay1D, az1D As Single 'координатывершинкубаax2, ay2, az2, ax2R, ay2R, az2R,
ax2D, ay2D, az2D As Singleax3, ay3, az3, ax3R, ay3R, az3R, ax3D, ay3D, az3D As
Singleax4, ay4, az4, ax4R, ay4R, az4R, ax4D, ay4D, az4D As Singleax5, ay5, az5,
ax5R, ay5R, az5R, ax5D, ay5D, az5D As Singleax6, ay6, az6, ax6R, ay6R, az6R,
ax6D, ay6D, az6D As Singleax7, ay7, az7, ax7R, ay7R, az7R, ax7D, ay7D, az7D As
Singleax8, ay8, az8, ax8R, ay8R, az8R, ax8D, ay8D, az8D As SingleCHIR, VIC,
GLUB As Integer 'параметрыкубаar(1000) As Integer 'массивдлявводачиселсфайлаx1,
y1, z1 As Singlen As Integer = 300z0 As Single = 300Sub Form1_Load(ByVal sender
As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadSubSub vvod()
''вводчиселсфайла
'открываетфайлдлячтенияsw As IO.StreamReader = New
IO.StreamReader("D:\22.txt", True)a As Stringj As Long, st As String,
c As Integer = 0, i As Integer
= sw.ReadLine()
= 1 ' первый пробел в строкеj = 1 To Len(a) 'Mid(a, j, 1) = " "
Then= c + 1Preserve ar(c) ' изменение размера массива числами()(c) = Mid(a, st,
3)= j + 1If
.Close()Sub
val()()= ar(2)= ar(3)= ar(4)
''экранныекоординат= 300 * CenterPX / CenterPZ= 300 * CenterPY /
CenterPZ= 40= 40= 40= angle + 2= angle1 - 2Subval1()()= ar(2)= ar(3)= ar(4)
'координатыцентра= 300 : CenterPY = 300 : CenterPZ = 300
''экранныекоординат= 300 * CenterPX / CenterPZ= 300 * CenterPY /
CenterPZ= 40= 40= 40= angle - 2= angle1 + 2Sub
Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
''вниз()
'координаты вершин верхней грани= -0.5 * CHIR : ay1 = -0.5 * GLUB : az1 =
0.5 * VIC= 0.5 * CHIR : ay2 = -0.5 * GLUB : az2 = 0.5 * VIC= 0.5 * CHIR : ay3 =
0.5 * GLUB : az3 = 0.5 * VIC= -0.5 * CHIR : ay4 = 0.5 * GLUB : az4 = 0.5 * VIC
'координатывершиннижнейграни= -0.5 * CHIR : ay5 = -0.5 * GLUB : az5 =
-0.5 * VIC= 0.5 * CHIR : ay6 = -0.5 * GLUB : az6 = -0.5 * VIC= 0.5 * CHIR : ay7
= 0.5 * GLUB : az7 = -0.5 * VIC= -0.5 * CHIR : ay8 = 0.5 * GLUB : az8 = -0.5 *
VIC
'вращение вершин вокруг OX
'верхняя граньR = ax1R = az1 * Math.Sin(angle1) + ay1 * Math.Cos(angle1)R
= az1 * Math.Cos(angle1) - ay1 * Math.Sin(angle1)
R = ax2R = az2 * Math.Sin(angle1) + ay2 * Math.Cos(angle1)R = az2 *
Math.Cos(angle1) - ay2 * Math.Sin(angle1)
R = ax3R = az3 * Math.Sin(angle1) + ay3 * Math.Cos(angle1)R = az3 *
Math.Cos(angle1) - ay3 * Math.Sin(angle1)
R = ax4R = az4 * Math.Sin(angle1) + ay4 * Math.Cos(angle1)R = az4 *
Math.Cos(angle1) - ay4 * Math.Sin(angle1)
R = ax5R = az5 * Math.Sin(angle1) + ay5 * Math.Cos(angle1)R = az5 *
Math.Cos(angle1) - ay5 * Math.Sin(angle1)
R = ax6R = az6 * Math.Sin(angle1) + ay6 * Math.Cos(angle1)R = az6 *
Math.Cos(angle1) - ay6 * Math.Sin(angle1)
R = ax7R = az7 * Math.Sin(angle1) + ay7 * Math.Cos(angle1)R = az7 *
Math.Cos(angle1) - ay7 * Math.Sin(angle1)
R = ax8R = az8 * Math.Sin(angle1) + ay8 * Math.Cos(angle1)R = az8 *
Math.Cos(angle1) - ay8 * Math.Sin(angle1)
' в экранные координаты вершинD = cPX + n * ax1R / (z0 + az1R)D = cPY + n
* ay1R / (z0 + az1R)
D = cPX + n * ax2R / (z0 + az2R)D = cPY + n * ay2R / (z0 + az2R)
D = cPX + n * ax3R / (z0 + az3R)D = cPY + n * ay3R / (z0 + az3R)
D = cPX + n * ax4R / (z0 + az4R)D = cPY + n * ay4R / (z0 + az4R)
D = cPX + n * ax5R / (z0 + az5R)D = cPY + n * ay5R / (z0 + az5R)
D = cPX + n * ax6R / (z0 + az6R)D = cPY + n * ay6R / (z0 + az6R)D = cPX +
n * ax7R / (z0 + az7R)D = cPY + n * ay7R / (z0 + az7R)
D = cPX + n * ax8R / (z0 + az8R)D = cPY + n * ay8R / (z0 + az8R)
'Создаем объект p класса Graphics:p As Graphics =
Me.CreateGraphics.Clear(Color.White)
pont() As Point = {New Point(ax1D, ay1D), New Point(ax2D, ay2D), New
Point(ax3D, ay3D), New Point(ax4D, ay4D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont)
pont1() As Point = {New Point(ax5D, ay5D), New Point(ax6D, ay6D), New
Point(ax7D, ay7D), New Point(ax8D, ay8D)}.DrawPolygon(New Pen(Color.Green, 1),
pont1)
pont3() As Point = {New Point(ax1D, ay1D), New Point(ax5D, ay5D), New
Point(ax8D, ay8D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Color.Green, 1),
pont3)
pont4() As Point = {New Point(ax2D, ay2D), New Point(ax6D, ay6D), New
Point(ax5D, ay5D), New Point(ax1D, ay1D)}.DrawPolygon(New Pen(Color.Green, 1),
pont4)
pont5() As Point = {New Point(ax3D, ay3D), New Point(ax7D, ay7D), New
Point(ax6D, ay6D), New Point(ax2D, ay2D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont5)
pont6() As Point = {New Point(ax8D, ay8D), New Point(ax4D, ay4D), New
Point(ax3D, ay3D), New Point(ax7D, ay7D)}.DrawPolygon(New Pen(Drawing.Color.Green,
1), pont6)
Sub
Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
'вправо
()
'координаты вершин верхней грани= -0.5 * CHIR : ay1 = -0.5 * GLUB : az1 =
0.5 * VIC= 0.5 * CHIR : ay2 = -0.5 * GLUB : az2 = 0.5 * VIC= 0.5 * CHIR : ay3 =
0.5 * GLUB : az3 = 0.5 * VIC= -0.5 * CHIR : ay4 = 0.5 * GLUB : az4 = 0.5 * VIC
'координатывершиннижнейграни= -0.5 * CHIR : ay5 = -0.5 * GLUB : az5 =
-0.5 * VIC= 0.5 * CHIR : ay6 = -0.5 * GLUB : az6 = -0.5 * VIC= 0.5 * CHIR : ay7
= 0.5 * GLUB : az7 = -0.5 * VIC= -0.5 * CHIR : ay8 = 0.5 * GLUB : az8 = -0.5 *
VIC
'вращение вершин вокруг Oy
'верхняя грань
R = ax1 * Math.Cos(angle) - az1 * Math.Sin(angle)R = ax1 *
Math.Sin(angle) + az1 * Math.Cos(angle)R = ay1
R = ax2 * Math.Cos(angle) - az2 * Math.Sin(angle)R = ax2 *
Math.Sin(angle) + az2 * Math.Cos(angle)R = ay2
R = ax3 * Math.Cos(angle) - az3 * Math.Sin(angle)R = ax3 *
Math.Sin(angle) + az3 * Math.Cos(angle)R = ay3
R = ax4 * Math.Cos(angle) - az4 * Math.Sin(angle)R = ax4 *
Math.Sin(angle) + az4 * Math.Cos(angle)R = ay4
'нижняяграньR = ax5 * Math.Cos(angle) - az5 * Math.Sin(angle)R = ax5 *
Math.Sin(angle) + az5 * Math.Cos(angle)R = ay5
R = ax6 * Math.Cos(angle) - az6 * Math.Sin(angle)R = ax6 *
Math.Sin(angle) + az6 * Math.Cos(angle)R = ay6
R = ax7 * Math.Cos(angle) - az7 * Math.Sin(angle)R = ax7 *
Math.Sin(angle) + az7 * Math.Cos(angle)R = ay7
R = ax8 * Math.Cos(angle) - az8 * Math.Sin(angle)R = ax8 *
Math.Sin(angle) + az8 * Math.Cos(angle)R = ay8
' в экранные координаты вершинD = cPX + n * ax1R / (z0 + az1R)D = cPY + n
* ay1R / (z0 + az1R)D = cPX + n * ax2R / (z0 + az2R)D = cPY + n * ay2R / (z0 +
az2R)
D = cPX + n * ax3R / (z0 + az3R)D = cPY + n * ay3R / (z0 + az3R)
D = cPX + n * ax4R / (z0 + az4R)D = cPY + n * ay4R / (z0 + az4R)
D = cPX + n * ax5R / (z0 + az5R)D = cPY + n * ay5R / (z0 + az5R)
D = cPX + n * ax6R / (z0 + az6R)D = cPY + n * ay6R / (z0 + az6R)
D = cPX + n * ax7R / (z0 + az7R)D = cPY + n * ay7R / (z0 + az7R)
D = cPX + n * ax8R / (z0 + az8R)D = cPY + n * ay8R / (z0 + az8R)
'Создаем объект p класса Graphics:p As Graphics =
Me.CreateGraphics.Clear(Color.White)
pont() As Point = {New Point(ax1D, ay1D), New Point(ax2D, ay2D), New
Point(ax3D, ay3D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Drawing.Color.Green,
1), pont)
pont1() As Point = {New Point(ax5D, ay5D), New Point(ax6D, ay6D), New
Point(ax7D, ay7D), New Point(ax8D, ay8D)}.DrawPolygon(New Pen(Color.Green, 1),
pont1)
pont3() As Point = {New Point(ax1D, ay1D), New Point(ax5D, ay5D), New
Point(ax8D, ay8D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Color.Green, 1),
pont3)
pont4() As Point = {New Point(ax2D, ay2D), New Point(ax6D, ay6D), New
Point(ax5D, ay5D), New Point(ax1D, ay1D)}.DrawPolygon(New Pen(Color.Green, 1),
pont4)
pont5() As Point = {New Point(ax3D, ay3D), New Point(ax7D, ay7D), New
Point(ax6D, ay6D), New Point(ax2D, ay2D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont5)
pont6() As Point = {New Point(ax8D, ay8D), New Point(ax4D, ay4D), New
Point(ax3D, ay3D), New Point(ax7D, ay7D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont6)
Sub
Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
''вниз()
'координаты вершин верхней грани= -0.5 * CHIR : ay1 = -0.5 * GLUB : az1 =
0.5 * VIC= 0.5 * CHIR : ay2 = -0.5 * GLUB : az2 = 0.5 * VIC= 0.5 * CHIR : ay3 =
0.5 * GLUB : az3 = 0.5 * VIC= -0.5 * CHIR : ay4 = 0.5 * GLUB : az4 = 0.5 * VIC
'координатывершиннижнейграни= -0.5 * CHIR : ay5 = -0.5 * GLUB : az5 =
-0.5 * VIC= 0.5 * CHIR : ay6 = -0.5 * GLUB : az6 = -0.5 * VIC= 0.5 * CHIR : ay7
= 0.5 * GLUB : az7 = -0.5 * VIC= -0.5 * CHIR : ay8 = 0.5 * GLUB : az8 = -0.5 *
VIC
'вращение вершин вокруг OX
'верхняя граньR = ax1R = az1 * Math.Sin(angle1) + ay1 * Math.Cos(angle1)R
= az1 * Math.Cos(angle1) - ay1 * Math.Sin(angle1)
R = ax2R = az2 * Math.Sin(angle1) + ay2 * Math.Cos(angle1)R = az2 *
Math.Cos(angle1) - ay2 * Math.Sin(angle1)
R = ax3R = az3 * Math.Sin(angle1) + ay3 * Math.Cos(angle1)R = az3 *
Math.Cos(angle1) - ay3 * Math.Sin(angle1)
R = ax4R = az4 * Math.Sin(angle1) + ay4 * Math.Cos(angle1)R = az4 *
Math.Cos(angle1) - ay4 * Math.Sin(angle1)
R = ax6R = az6 * Math.Sin(angle1) + ay6 * Math.Cos(angle1)R = az6 *
Math.Cos(angle1) - ay6 * Math.Sin(angle1)
R = ax7R = az7 * Math.Sin(angle1) + ay7 * Math.Cos(angle1)R = az7 *
Math.Cos(angle1) - ay7 * Math.Sin(angle1)
R = ax8R = az8 * Math.Sin(angle1) + ay8 * Math.Cos(angle1)R = az8 *
Math.Cos(angle1) - ay8 * Math.Sin(angle1)
' в экранные координаты вершинD = cPX + n * ax1R / (z0 + az1R)D = cPY + n
* ay1R / (z0 + az1R)
D = cPX + n * ax2R / (z0 + az2R)D = cPY + n * ay2R / (z0 + az2R)
D = cPX + n * ax3R / (z0 + az3R)D = cPY + n * ay3R / (z0 + az3R)
D = cPX + n * ax4R / (z0 + az4R)D = cPY + n * ay4R / (z0 + az4R)
D = cPX + n * ax5R / (z0 + az5R)D = cPY + n * ay5R / (z0 + az5R)
D = cPX + n * ax6R / (z0 + az6R)D = cPY + n * ay6R / (z0 + az6R)
D = cPX + n * ax7R / (z0 + az7R)D = cPY + n * ay7R / (z0 + az7R)
D = cPX + n * ax8R / (z0 + az8R)D = cPY + n * ay8R / (z0 + az8R)
'Создаем объект p класса Graphics:p As Graphics =
Me.CreateGraphics.Clear(Color.White)
pont() As Point = {New Point(ax1D, ay1D), New Point(ax2D, ay2D), New
Point(ax3D, ay3D), New Point(ax4D, ay4D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont)
pont1() As Point = {New Point(ax5D, ay5D), New Point(ax6D, ay6D), New
Point(ax7D, ay7D), New Point(ax8D, ay8D)}.DrawPolygon(New Pen(Color.Green, 1),
pont1)
pont3() As Point = {New Point(ax1D, ay1D), New Point(ax5D, ay5D), New
Point(ax8D, ay8D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Color.Green, 1),
pont3)
pont4() As Point = {New Point(ax2D, ay2D), New Point(ax6D, ay6D), New
Point(ax5D, ay5D), New Point(ax1D, ay1D)}.DrawPolygon(New Pen(Color.Green, 1),
pont4)
pont5() As Point = {New Point(ax3D, ay3D), New Point(ax7D, ay7D), New
Point(ax6D, ay6D), New Point(ax2D, ay2D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont5)
pont6() As Point = {New Point(ax8D, ay8D), New Point(ax4D, ay4D), New
Point(ax3D, ay3D), New Point(ax7D, ay7D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont6)Sub
Sub Button4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button4.Click
'вправо()
'координаты вершин верхней грани= -0.5 * CHIR : ay1 = -0.5 * GLUB : az1 =
0.5 * VIC= 0.5 * CHIR : ay2 = -0.5 * GLUB : az2 = 0.5 * VIC= 0.5 * CHIR : ay3 =
0.5 * GLUB : az3 = 0.5 * VIC= -0.5 * CHIR : ay4 = 0.5 * GLUB : az4 = 0.5 * VIC
'координатывершиннижнейграни= -0.5 * CHIR : ay5 = -0.5 * GLUB : az5 =
-0.5 * VIC= 0.5 * CHIR : ay6 = -0.5 * GLUB : az6 = -0.5 * VIC= 0.5 * CHIR : ay7
= 0.5 * GLUB : az7 = -0.5 * VIC= -0.5 * CHIR : ay8 = 0.5 * GLUB : az8 = -0.5 *
VIC
'вращение вершин вокруг Oy
'верхняя грань
R = ax1 * Math.Cos(angle) - az1 * Math.Sin(angle)R = ax1 *
Math.Sin(angle) + az1 * Math.Cos(angle)R = ay1
R = ax2 * Math.Cos(angle) - az2 * Math.Sin(angle)R = ax2 *
Math.Sin(angle) + az2 * Math.Cos(angle)R = ay2R = ax3 * Math.Cos(angle) - az3 *
Math.Sin(angle)R = ax3 * Math.Sin(angle) + az3 * Math.Cos(angle)R = ay3
R = ax4 * Math.Cos(angle) - az4 * Math.Sin(angle)R = ax4 *
Math.Sin(angle) + az4 * Math.Cos(angle)R = ay4
'нижняяграньR = ax5 * Math.Cos(angle) - az5 * Math.Sin(angle)R = ax5 *
Math.Sin(angle) + az5 * Math.Cos(angle)R = ay5
R = ax6 * Math.Cos(angle) - az6 * Math.Sin(angle)R = ax6 *
Math.Sin(angle) + az6 * Math.Cos(angle)R = ay6
R = ax7 * Math.Cos(angle) - az7 * Math.Sin(angle)R = ax7 *
Math.Sin(angle) + az7 * Math.Cos(angle)R = ay7
R = ax8 * Math.Cos(angle) - az8 * Math.Sin(angle)R = ax8 *
Math.Sin(angle) + az8 * Math.Cos(angle)R = ay8
' в экранные координаты вершинD = cPX + n * ax1R / (z0 + az1R)D = cPY + n
* ay1R / (z0 + az1R)
D = cPX + n * ax2R / (z0 + az2R)D = cPY + n * ay2R / (z0 + az2R)D = cPX +
n * ax3R / (z0 + az3R)D = cPY + n * ay3R / (z0 + az3R)
D = cPX + n * ax4R / (z0 + az4R)D = cPY + n * ay4R / (z0 + az4R)
D = cPX + n * ax5R / (z0 + az5R)D = cPY + n * ay5R / (z0 + az5R)
D = cPX + n * ax6R / (z0 + az6R)D = cPY + n * ay6R / (z0 + az6R)
D = cPX + n * ax7R / (z0 + az7R)D = cPY + n * ay7R / (z0 + az7R)
D = cPX + n * ax8R / (z0 + az8R)D = cPY + n * ay8R / (z0 + az8R)
'Создаем объект p класса Graphics:p As Graphics =
Me.CreateGraphics.Clear(Color.White)
pont() As Point = {New Point(ax1D, ay1D), New Point(ax2D, ay2D), New Point(ax3D,
ay3D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Drawing.Color.Green, 1),
pont)
pont1() As Point = {New Point(ax5D, ay5D), New Point(ax6D, ay6D), New
Point(ax7D, ay7D), New Point(ax8D, ay8D)}.DrawPolygon(New Pen(Color.Green, 1),
pont1)pont3() As Point = {New Point(ax1D, ay1D), New Point(ax5D, ay5D), New
Point(ax8D, ay8D), New Point(ax4D, ay4D)}.DrawPolygon(New Pen(Color.Green, 1),
pont3)
pont4() As Point = {New Point(ax2D, ay2D), New Point(ax6D, ay6D), New
Point(ax5D, ay5D), New Point(ax1D, ay1D)}.DrawPolygon(New Pen(Color.Green, 1),
pont4)
pont5() As Point = {New Point(ax3D, ay3D), New Point(ax7D, ay7D), New
Point(ax6D, ay6D), New Point(ax2D, ay2D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont5)
pont6() As Point = {New Point(ax8D, ay8D), New Point(ax4D, ay4D), New
Point(ax3D, ay3D), New Point(ax7D, ay7D)}.DrawPolygon(New
Pen(Drawing.Color.Green, 1), pont6)SubClass
ПРИЛОЖЕНИЕ 2
Программа на языке VRML “Вращение
куба”
#VRML V2.0 utf8
Shape {Box {1 1 1
}Appearance {Material {
diffuseColor 0 1 0
}
}
}