Разработка трехмерного визуализатора алгоритмов
Подбор игрового движка и описание его основных характеристик. Разработка структуры, алгоритма и интерфейса программы. Проектирование иерархии классов. Выделение типового приема визуализации. Тестирование правильности работы программного обеспечения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.01.2017 |
Размер файла | 3,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Оглавление
- Введение
- 1. Аналитический обзор
- 1.1 Анализ существующего П.О.
- 1.2 Анализ алгоритмов для визуализации
- 1.3 Анализ требований к П.П.
- 2. Проектирование П.П.
- 2.1 Определение функциональности П.П.
- 2.2 Выбор типовой архитектуры и интерфейса
- 2.3 Выбор инструментальных средств разработки
- 2.4 Выбор используемого типового алгоритма визуализации
- 2.5 Проектирование иерархии классов
- 2.6 Первичная разработка алгоритма работы программы
- 3. Реализация ПП
- 3.1 Особенности реализации системы
- 3.2 Реализация визуализации простейшего алгоритма
- 3.3 Выделение типового приема визуализации
- 3.4 Разработка интерфейса программы
- 4. Тестирование ПП
- 4.1 Методика тестирования правильности работы П.О.
- 4.2 Целевое тестирование
- 4.3 Результаты тестирования
- 5. Внедрение ПП
- 5.1 Руководство пользователя
- 5.2 Результаты опытной эксплуатации
- Заключение
- Список использованных источников
- Приложение
Введение
В результате быстрого роста темпов развития отрасли «Информационных технологий» появляется новые отрасли и ответвления старых направлений, что влияет на увеличение объемов необходимой информации для молодых специалистов. Для достойного обучения студентов, преподавателю приходиться многое преодолевать, для того чтобы передать в нужном объеме необходимую информацию. И тут встает первая преграда, а именно нарастающий объем. Студенты, как и любые живые организмы при большом объеме информации устают и теряют концентрацию, что не может допустить преподаватель, поэтому ему приходиться всячески привлекать их внимание и отвлекаться от учебного процесса. Таким образом для поддержания интереса и концентрации на материале преподавателю приходиться отходить от обучения. Парадокс, однако, этот метод эффективен, однако у преподавателей кончаются интересные темы и шутки, а порой это выглядит нелепо, что принижает имидж преподавателя в глазах его студентов. Поэтому либо им стоит носить с собой сборник анекдотов и рассказов, либо требуется переключение внимания на другие эффектные действия.
Решение проблемы поддержания внимания и концентрации будет переключение взгляда студентов с преподавателя на экран. Однако такая же лекция будет хоть и эффективна небольшое количество времени, однако более эффективно это «наглядная демонстрация работы, либо примера». Таким образом, решение задачи будет создание программы для обучения, которая будет не скучной, объективной. Так же программа должна отвечать всем требованиям, представляемым каждой программе для обучения.
1. Аналитический обзор
Приведем общий анализ структур и продуктов, предоставленных на данный момент.
1.1 Анализ существующего П.О.
Для реализации данной задачи требуется программное обеспечение отвечающее многим требованиям, а именно:
1) Доступность. Программное обеспечение, на котором будет решаться данная задача должна использовать известные технологии для функционирования и программирования.
2) Функциональная полнота. Программное обеспечение должно реализовать все функции необходимые для решения задачи.
3) Рациональность. Реализуемый программный продукт должен запускаться на целевом ПК.
Таким образом, весь спектр игровых движков сужается. Из общего перечня можно выделить:
Рис 1. Эмблема «UnrealEngine».
1)UnrealEngine - игровой движок, поддерживаемый и разрабатываемый компанией EpicGames. Создание сцен и добавление объектов осуществляется через удобныйSDK, который интуитивен, хоть и написан на английском языке. Программирование для этого игрового движка осуществляется через язык С++ и стороннюю среду программирования, чаще через Visualstudio 2015, однако возможна так же работа на Unixсистемах, значит есть возможность переключения на стороннюю среду программирования.
Рис 2. Редактор «UnrealEngine».
Данный игровой движок является визуально привлекательным и реализует поистине потрясающие визуальные возможности, так же программирование сценариев игры реализуется через их личный вид языка, а именно визуальное программирование Blueprint. Так же стоит отметить, что движок распространяется бесплатно.
Рис 3. Эмблема движка «Leadwerks».
2) Leadwerks - игровой движок, разрабатываемый и поддерживаемый компанией LeadwerksSoftware.Программирование осуществляется через Visualstudio 2013 предоставляемый вместе с продуктом. Программирование сцен и скриптов осуществляется на С++ и Lua(сценарный язык С++).
Рис.4. Редактор «Leadwerks».
Движок обладает собственным SDK, который хоть и выглядит, не очень привлекательно, но отвечает главным требованиям функциональности. Движок распространяется платно, однако, цена почти символическая.
Рис.5. Эмблема «Unity3d».
3) Unity - инструмент для разработки приложения в 3д и 2д игровом пространстве. Движок работает под руководством операционных систем Windows, OSX.Созданное приложение работает под операционными системами Windows, OSX, Android, WindowsPhone, AppleIOS, Linuxи т.д.
Рис.6. Редактор «Unity3d».
Движок имеет удобный SDK, который отвечает всем функциональным требованиям. Программирование осуществляется на сторонней среде программирования и языке JavaScreept/C#.
Движок распространяется платно, однако есть бесплатная урезанная версия, которая обладает полной базовой функциональностью.
Рис.7. Эмблема «JMankeyEngine».
4)JMankeyEngine - инструмент для создания приложений и игр, который разрабатывается и поддерживается командойjMEcore. Продукт написан на языке Java, что говорит обнего кроссплатформенности. Разработанное приложение будет работать на любой современной операционной систем, подходящей по требованиям характеристик железа. Программирование классов, объектов, сценариев пишется на языке Java
Рис.8. Редактор «JMankeyEngine».
Движок имеет функционально полный SDK, настраиваемый для каждого пользователя. Движок распространяется бесплатно без покупки платной лицензии при публикации продукта.
1.2 Анализ алгоритмов для визуализации
Существует множество алгоритмов визуализации. От базовых силовых алгоритмов до многоуровневых алгоритмов учитывающих топологические особенности. Однако данные виды алгоритма визуализации не подходят т.к. данные алгоритмы применимы для структур «графы». Для реализации задания возможно применение двух алгоритмов.
1) Прямая визуализация. Визуализация в процессе выполнения алгоритма сортировки.
2) Планирование. Визуализация алгоритма, используя информацию из сохраненных контейнеров.
1.3 Анализ требований к П.П.
Для качества программе следует иметь требования и необходимые условия создания качественного продукта, что дает возможность непосредственно контролировать разработчика и расхождение от планируемого или ожидаемого результата. Требования бывают разные, от простейших и тривиальных по типу: должна работать, запускаться, до сложнейших: логика функционирования и взаимодействия объектов, интерфейса взаимодействия и содержание необходимых классов.
Требования к функциональным характеристикам:
1) Вывод графического интерфейса визуализатора на экран. Простейшее требование необходимое для любого интерактивного приложения.
2) Выполнение алгоритма сортировки автоматическое и пошаговое. Пользователь сам должен определять последовательность отображения. От работы обучающего приложения мало толку если пользователь не может начинать обучение с начала.
3) Совместно с выполнением выходит на экран информация о шагах. Для обучения пользователя необходимо так же и информация необходимая для объяснения.
4) Понятность. Даже самое понятное приложение не может называться хорошим, если оно не выполняет главную свою функцию, в данном случае это функция - обучение. Обучение бесполезно если оно не понятно обучающемуся.
5) Зрелищность. Требование, которое представлено для данного программного продукта, которое отличает его от остальных.
6) Авто шаг. Приложение должно иметь авто шаг для первичного обучения пользователя, ознакомления.
Требования необходимые для стабильной работы приложения на протяжении всей эксплуатации. Надежность является необходимым требованием.
Требования к надежности:
1) Корректность и правильность работы.Программа должна работать правильно иначе вся разработка и труды будут потрачены напрасно.
2) Тайминг. Выполнение программы без ощутимых задержек, т.к. это будет негативно сказываться на процессе обучения, и нести за собой такие последствия как уныние и лень у пользователя.
3) Устойчивость. Программа должна работать стабильно на протяжении всей работы программы. Крахи не допустимы.
4) Запуск. Программа должна работать на компьютерах заказчика, в данном случае это компьютеры кафедры АВТ.
2. Проектирование П.П.
На данный момент процесс создания программ и приложений не представить без разделения разработки на этапы жизненного цикла. Под жизненным циклом программы понимается набор этапов:
1)Анализ предметной области и создание ТЗ. Этот этап производился при непосредственном взаимодействием с заказчиком, в данном случае это «руководитель ВКР». Совместно с заказчиком должны быть построены требования для данного продукта, а так же обговорены главные функции и время проектирования, сдачи проекта, тестирования.
2) Проектирование структуры программы. Проектирование структуры,в соответствии которой будет построена логика программного продукта. Состоит из проектирования основных объектов и структур.
3)Кодирование и создание программного продукта. Непосредственно программирование, так же включающее в себя медиа часть, которая заключается в создании визуального оформления интерфейса.
4)Тестирование и отладка. Заключается в тестировании на наборе определенном разработчиком и наборе определенным руководителем ВКР.
5)Внедрение программного продукта. Внедрение происходит на «Кафедре АВТ» на целевых машинах. Заключается в установке и малом тестировании на установленных компьютерах.
6)Сопровождение программного продукта. Сопровождение заключается в поддержании связи с кафедрой и в случае нахождения багов и ошибок доработка и изменение программы.
7)Утилизация или обновление. Происходит после встречи с представителем кафедры ВКР и составление исправлений и доработок.
Далее приведено описание конкретных стадии разработки, описывает этапы проектирования программного продукта на протяжении разработки.
2.1 Определение функциональности П.П.
Программный продукт должен обладать функциями:
1) Визуальная привлекательность. Множество программ существует, однако они не столь комфортно выглядят чтобы пользоваться часто и эффективно, ведь главный враг эффективности это рутина.
2) Целевое решение. Программа решает строго представленную задачу, а именно визуализатор сортировок. Был разработан набор объектов для формирования набора, отвечающего за расположение и отрисовку объектов.
3) Интерактивность. Приложение взаимодействует с пользователем через интерфейс взаимодействия для получения информации типа:
-Получение значения текущего объекта.
-Переключение между состояниями.
-Выход из приложения.
4) Зрелищность. Приложение включает в себя элементы не обычные для таких как она и это выделяет её из других. Подогрев интереса должен происходить через эффектную визуальную составляющую. Цель как привлечение внимания пользователя.
5) Функция пошагового выполнения.Для пошагового выполнения был разработан вид взаимодействия через интерфейс включающий в себя кнопки «Назад, Далее»(Next, Prev).
2.2 Выбор типовой архитектуры и интерфейса
Как и любая программа, данный П.П. создается хоть и для широкой аудитории вычислительных машин, однако стоит предложить рекомендуемые параметры машины, на которой она будет запускаться без проблем.
Целевая архитектура включает в себя:
Таблица 1 - Характеристики целевой архитектуры.
Характеристика |
Наименование |
|
Операционная система. |
Windows XP, Vista, 7, 8/8.1, 10 |
|
Процессор |
Intel Core 2 Duo |
|
Оперативная память. |
1 Гб О.З.У. |
|
Место на диске |
50 МБ |
|
DirectX |
9.0 |
|
Видео карта |
128 МБ Видео Памяти |
Необходимое П.О.:
Для работы и установки приложения на целевой машине требуется установка JavaMechine для корректной работы и взаимодействия с библиотеками Java.
Выбор интерфейса:
1) Интерфейс должен отображать информацию о каждом шаге для пояснения и разбора проделанных действий.
a. Номер шага. Информация необходимая для представления о количестве проделанных шагов и о общем их количестве.
b. Информация о действии. Поле, в котором отражаются текст о проделанном шаге.
c. Информация о виде алгоритма визуализированного. Текст поле о выбранном виде сортировки для корректного представления о переданной информации.
2) Интерфейс должен включать кнопки для управления процессом визуализации и отправления команд от пользователя(«Next», «Play», «Prev»).
3) Присутствие интерфейса для добавления в массив объектов новых элементов(поле Edit, Text, Button).
4) Начальное меню запуска. Меню для запуска отдельных функций:
-Информация(«Info»).
-Перейди на главный экран.(«Start»).
-Закончить работу приложения(«Quit»).
-Изменить настройки запуска.(«Option»).
2.3 Выбор инструментальных средств разработки
Для разработки программного проекта было использован инструмент, предоставляемый с SDKJMankeyEngineдля разработки классов управления. Так же был использован стандартные средства JMankeyEngineдля разработки интерфейса XML.
2.4 Выбор используемого типового алгоритма визуализации
Для решения задачи предоставляемым программным проектом был выбран алгоритм «Планирование». Данный алгоритм позволяет осуществить простое переключение между состояниями сортировок записанных в массиве состояний. Так же это позволит хранить информацию о каждом шаге и генерировать её на этапе установки или добавления новых элементов в массив объектов.
2.5 Проектирование иерархии классов
Раздел отвечающий за представление о проектировании классов в общем процессе разработки.
Рис.9. Класс «ArrayOfCube»
Класс «ArrayOfCube», отвечающий за хранение определенного состояния. Содержит члены необходимые для реализации данной функциональности.
Класс «ConstraintArray», отвечающий за хранение состояний, которые являются объектами класса «ArrayOfCube». Содержит члены необходимые для реализации данной функциональности.
Более точное описание находиться в Приложении Ж.
Рис.10. Класс «ConstraintArray».
Более точное описание находиться в Приложении З.
2.6 Первичная разработка алгоритма работы программы
Запуск.
Приложение запускается и сразу попадает на страницу настройки, где выбирается вариант разрешения экрана и графические настройки.
После выбора настроек приложение переключается на стартовый экран.
Рис.11. Начальный экран запуска.
Рис.12. Стартовый экран приложения.
Где предоставляется пользователю выбрать действия: Старт («Start»), Информация («Info»), Настройки(«Option»), Выйти («Quit»).
Основная часть.
После нажатия на кнопку «Старт»(Start) на стартовом экране приложение переключается на экран выбора алгоритма сортировки.
Рис.13. Экран выбора сортировки.
На экране находиться варианты алгоритмов, стоит выбрать «Пузырьковый метод сортировки» т.к. скорее всего остальные еще не поддерживаются.
Далее приложение попадает на главный экран приложения.
Рис.14. Главный экран приложения.
На экране расположен интерфейс взаимодействия, для диалога с пользователем, так же рабочее пространство, в котором будет происходить все действие.
Далее следует добавить на сцену и в массив элементов несколько элементов, для содержания массива сортировки.
После добавления нужных нам элементов алгоритм работы программы автоматически заполняет объект «ConstraintArray», который включает в себя массив элементов«ArrayOfCube».
После добавления элементом можно сразу переходить к шагам по массиву состояний. Для этого можно воспользоваться: авто шаг(«Play»), шаг вперед(«Next»), шаг назад(«Prev»).
Завершение.
При нажатии на клавишу «Esc» происходит выход на начальный экран. Перед завершением программы можно посмотреть количество раз просматриваемых алгоритмов. При нажатии на кнопку выхода(«Quit») произойдет выход из приложения и потеря всей информации.
3. Реализация ПП
Конечная реализация программного продукта представлена это программа решающая задачу и взаимодействующая с пользователем по средствам интерфейса приложения.
3.1 Особенности реализации системы
К особенностям реализации следовало бы отнести особый вид программирования. Программирование, в основе которого лежит взаимодействие с игровым движком.
Рис.15. Цикл работы игрового движка.
Процесс работы жизненного цикла «Initialization» . Заключается в начальной установке объектов и инициализации переменных. Чаще всего используется для установки объектов дальнейшего использования, но в зависимости от типа инициализируемого объекта(в котором запущен Initialization).
Процесс работы жизненного цикла «Programinput». Заключается в считывании информации с полей «input» и клавиатуры.
Процесс работы жизненного цикла «Update». Заключается в постоянном обновлении состояния программы, что позволяет реагировать на действия пользователя и изменение переменных. Фактически данный процесс осуществляет весь процесс взаимодействия, т.к. в нем есть и скрытые действия, т.е. действия наследуемые от супер класса.
Процесс работы жизненного цикла «Render». Заключается в отрисовке статичных объектов которые были заданы в инициализации, так же он отвечает за отрисовку вследствие изменений, произведенных в «Update».
Процесс работы жизненного цикла «Shutdown». Заключается в удалении и сохранении переменных и временной информации для дальнейшего использования в следующем запуске.
3.2 Реализация визуализации простейшего алгоритма
Создание алгоритма визуализации подразумевает разработку метода заполняющего массив состояний, который хранит внутри себя историю перемещений во время визуализации сортировки.
В качестве массива для хранения был разработан класс «ConstraintArray». Внутри себя он содержит члены для хранения информации о состояниях, а так же массив содержащий элементы класса «ArrayOfCube», который содержит информацию об определенном состоянии. Так же «ConstraintArray» содержит метод, отвечающий за заполнение массива состояний. Пояснение разработанного алгоритма заполнения и его блок схема приведен в Приложении А. Код класса «ConstraintArray» приведен в Приложении Б. Код класса «ArrayOfCube» приведен в Приложении В.
Для отображения элементов на сцене был разработан класс «MyBox», который содержит члены, отвечающие за создание и хранение элемента сцены. Каждый элемент этого класса так же содержит и определенное значение, относительно которого происходит сортировка. Код класса «MyBox» приведен в Приложении Г.
Вся логика отображения сцены записана в классе-контроллере «MyStartScreen», который наследуется от класса «AbstractAppState» и принадлежит к классам «ScreenController», что позволяет получить доступ к нему из XML-файла, для реализации кнопок и других интерактивных действий во время выполнения приложения. Сам же код XMLфайла приведен в Приложении Е. Код класса «MyStartScreen» приведен в Приложении Д.
3.3 Выделение типового приема визуализации
Типовой прием заключается в использовании приема «Планирование» и основного принципа построения состояний через перенос и смещение.
Построение состояния заключается:
1) Создать состояние из предыдущего.
2) Сделать изменение согласно алгоритму.
a. Найти необходимый элемент перемещения.
b. Переместить по координате у(вертикально).
c. Переместить по координате х (в право).
d. Переместить по координате z (на нас).
e. Сделать изменения согласно цвету.
f. Переместить контроллер.
3) Увеличить количество сделанных шагов.
4) Вернуться.
3.4 Разработка интерфейса программы
Разработка интерфейса проводилась во встроенном редакторе движка с помощьюXML разметки.
При разработке интерфейса был использован инструмент предоставляемый непосредственно с движком.
Всего было сформировано 3 XML экрана:
1) Стартовый экран.
2) Выбор алгоритма сортировки.
3) Главный экран отвечающий за основной алгоритм работы программы, а именно реализация визуализации сортировки.
Далее приведено описание каждого из экранов.
Стартовый экран.
Разработка данного элемента интерфейса происходила из необходимых функций начального экрана. Вначале был создан начальный шаблон, реализующий примерное расположение.
Следующим шагом был сделан конечный вид, который включает в себя надписи (Text), кнопки (Button). Экран был разделен на 3 панели. Верхняя панель была отдана названию приложения с визуальным эффектом выпада из верхней области. В средней панели расположена информация о разработчике и служебная информация. Нижняя панель отвечает за четыре кнопки взаимодействия с объектом.
Выбор алгоритма сортировки.
Разработка данного элемента осуществлялось из необходимости разделять каждый из сортировок в отдельные сцены.
В течении разработки был сформирован шаблон для начального расположения данных. Далее были добавлены панели для разделения и корректного расположения кнопок. Каждой кнопке своя панель, чтобы кнопки не соприкасались.
Главный экран.
Разработка данного элемента осуществлялась из требований, обговоренных с заказчиком.
В течении разработки был добавлен шаблон для расположения элементов GUI. Данное расположение позволило поделить горизонтальную часть для расположения элементов.
Следующим шагом был создан набор панелей для вертикального расположения относительно каждого столбца. Каждая панель не обязательно должна совпадать с другой по размеру. Для введения функциональности в главный экран было добавлены в ХМL файл контроллеры в виде кнопок:
· «Next» - перейти к следующему состоянию.
· «Play» - переключить на авто шаг.
· «Prev» - перейти к предыдущему состоянию.
· «AddBox» - добавить новый элемент сортировки.
Добавлены элементы текстового поля ввода:
· «TextInfo» - поле, отвечающее за информацию о состоянии сортировки.
· «TextAddBox» - поле, отвечающее за ввод информации, а именно за значение объекта сортировки.
Добавлены элементы текстового поля:
· «Editvalue:» - текст поле для информации о расположении поля ввода.
· «Label_Condition» - поле для отображения текущем номере шаге из максимального их количества.
Разработка контроллера экранов.
Для управления экранами был создан контроллер, который запускает методы, которые записаны в его теле класса. Вызов методов выполняется при нажатии кнопок на GUI интерфейсе. Контроллер наследует «SimpleAplication», что позволяет ему получить доступ к полям «app»(ссылка на приложение), nifity(ссылка на GUI интерфейс), однако следует убедиться что они будут переданы и присвоить эти значения в конструкторе. Фактически контроллер это тот же Main-файл, но который присоединен к локальному узлу, который можно будет отсоединить при необходимости. Таким образом, мы можем разделить всю программу на разные локальные файлы.
4. Тестирование П.П.
Тестирование проводиться с целью выявления отсутствия ошибок в основном алгоритме программы. Обычно проходит на заранее подготовленном наборе тестов, которые составлены с разработчиком, либо самим разработчиком.
4.1 Методика тестирования правильности работы П.О.
Тестирование должно происходить для данного программного продукта с набором чисел, а именно: 5, 4, 1, 3, 2.
Рис 16. Начальное состояние объектов.
1) Начальное состояние все кубы на своих начальных местах.
2) Алгоритм последовательным перебором находит минимальный элемент. На начальном шаге он равен первому элементу.
3) Сравнивание последовательно находит минимальный элемент (1).
4) Перенос «1» в начало со смешением для освобождения места под целевой элемент.
Рис 17. Состояние первый шаг.
Рис 18. Состояние второй шаг.
5) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированной части (2).
6) Перенос «2» в конец отсортированной части.
7) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированных элементов (3).
8) Перенос «3» в конец отсортированной части.
Рис.19. Состояние третьего шага.
9) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированных элементов (4).
Рис.20. Состояние пред последнее.
10) Алгоритм находит минимальный, и это оказывается последний и единственный элемент из не отсортированной части. Следовательно, перенос не требуется.
Рис 21. Состояние конца сортировки.
11) Сортировка завершена.
4.2 Целевое тестирование
Целевое тестирование должно проходить непосредственно на возможных пользователях. В качестве пользователя был выбран обычный студент кафедры АВТ. Целью данного тестирования является выявление реакции на данный продукт.
4.3 Результаты тестирования
В результате тестирования было получены результаты:
1) Алгоритм корректно работает с набором чисел:
a. 5, 4, 1, 3, 2.
b. 1,3,2,4.
c. 1.
2) Выполнение программы корректно на протяжении всего цикла.
3) Целевое тестирование на студенте выявило что:
«Результат не был достаточным и дальнейшая подкрутка графики и визуального оформления может исправить этот недостаток».
визуализация программа алгоритм
5. Внедрение П.П.
Внедрение будет производиться на кафедре АВТ. для использования в процессе обучения. Программный продукт не будет использоваться всеми преподавателями, а лишь изъявившими желание.
5.1 Руководство пользователя
Набор инструкций для овладения данной программой.
1. Стартовый экран.
Данный экран имеет четыре управляющих компонента.
1) Для того, чтобы перейти к выбору алгоритма сортировки нажмите кнопку «Start».
2) Для того чтобы получить информацию о пользователе и информацию собираемую в процессе работы программы нажмите «Info».
3) Для того чтобы изменить настройки экрана и приложения нажмите на кнопку «Option».
4) Для того чтобы выйти из приложения нажмите на кнопку «Quit».
2. Экран выбора сортировки.
Данный экран имеет три управляющих компонента.
1) Для выбора «Пузырьковой сортировки» нажмите на кнопку «BubbleSort»
2) Для выбора «Сортировки Шелла» нажмите на кнопку
«ShellSort».
3) Для выбора «Сортировки Хоара» нажмите на кнопку
«QuickSort».
3. Главный экран.
Данный экран имеет четыре управляющих компонента.
1) Чтобы добавить объект для сортировки
a. Введите число, равное значению объекта( вес) который вы хотите добавить
b. Нажмите на кнопку «AddBox».
2) Чтобы запустить авто шаг нажмите на кнопку «Play».
3) Чтобы перейти к следующему состоянию в ручном режиме нажмите на кнопку «Next».
4) Чтобы перейти к предыдущему состоянию в ручном режиме нажмите на кнопку «Prev».
5) Чтобы выйти из главного экрана на стартовый нажмите кнопку на клавиатуре «Esc».
5.2 Результаты опытной эксплуатации
В результате опытной эксплуатации была установлена программа на целевую машину кафедры АВТ. Ошибок при установке обнаружено не было.
Результат использования на студентах будет известен после ряда изменений, которым подвергнется интерфейс.
Заключение
На данный момент нет четких лидеров в области визуализации для обучения, существуют небольшие объединения людей выпускающих программы нацеленные на детей и на школьный возраст, однако на более взрослый контингент нет. Следственно как цель можно занять эту нишу и предложить рынку достаточно качественный продукт, однако, с другой направленностью, более широкой. Необходимо создать программу, которую можно будет использовать непосредственно в процессе обучения как замена, либо дополнение, нужно определить целевую аудиторию и повысить время разработки.
Разработка визуализатора включает в себя анализ данных, проектирование структуры программы, проектирование алгоритма программы, разработка интерактивного интерфейса, тестирование и правка ошибок.
Анализ данных - процесс, включающий в себя изучение визуализируемого метода, области реализации, инструментов для реализации. Данный процесс занимает большое количество времени, если до этого момента анализируемые данные и изучаемые инструменты были не знакомы.
Проектирование алгоритма программы - процесс занимающий большую часть разработки, целью которого является выявление целевых процессов и составление алгоритма визуализации.
Разработка интерфейса - процесс, занимающий большую часть от всей разработки, т.к. включает визуальное оформление и интерактивное взаимодействие.
В ходе работы была разработан П.П. для обучения студентов через визуализацию алгоритмов сортировки и демонстрацию его работы.
Список использованных источников
1. «Nifty GUI» the Missing Manual (28.12.2011). Авторы: JensHohmuth (void) Martin Karing (mkaring) (Slick2D chapter)
2. «jMonkeyEngine 3.0 Beginner's Guide» (June 2013 Packt Publishing) Автор: Ruth Kusterer.
3. «Современные силовые алгоритмы для визуализации информации большого объема» (2002) Автор: З.В. Апанович.
Приложение А
Пояснение алгоритма работы метода «setConstraints»:
1) Установка первого состояния из массивов начальных координат значений, координат. Установка контроллера из начального состояния.
addFirstState(this.defControllerLocation);
2) Пока не закончиться сортировка, зациклить.
2.1) Если предыдущий элемент был последним из массива, значит записать состояние «Complite», сортировку закончить и выйти из метода.
2.2) Запомнить первое число из не отсортированных.
2.3) Запомним устойчивое состояние(вне процессов переносов).
2.4) Добавить состояние, в котором минимальный элемент это первый элемент, добавив отличие в виде цвета элемента (минимальный это красный).
2.5) Зациклить пока номер цикла не будет равен длине
2.5.1)Сделать состояние, в котором цвет текущего элемента с номером равном номеру цикла.
2.5.2)Проверить значение элемента массива с номером цикла в сравнение с минимальным числом
2.5.2.1) Если минимальное число больше, то запомнить это число как минимальное. Сделать состояние в котором предыдущее минимальное число становиться стандартным(стандартного цвета), а новое становиться минимальным (окрашивается в минимальный цвет).
2.5.3)Если минимальное число это то, что было выбрано автоматом в начале цикла, тогда сделать состояние в котором происходит пояснение этого и далее не делать перенос, а лишь поменять цвет минимального на завершенный. Перейти к началу цикла с увеличенным номером цикла.
2.5.4) Наше минимальное число это не то, стандартное, которое было поставлено автоматом, значит между минимальным числом и концом отсортированной части существуют объекты не отсортированные, значит нужно перенести.
2.5.5) Перенести минимальный элемент вверх по координате.
2.5.6) Перенести минимальный элемент в лево над элементом которой является началом не отсортированного списка.
2.5.7) Перенести все объекты между прошлым местом минимального и началом не отсортированного списка вправо на ширину объекта сортировки и расстояния между ними.
2.5.8) Перенести минимальный элемент вниз на высоту элемента + расстояние между элементами сортировки, т.е. на место где он должен стоять.
2.5.9) Сделать минимальный элемент завершенным.
2.6) Перенести контроллер на элемент первый из не отсортированных.
2.7) Вернуться в начало цикла.
3) Элементы стоят на своих местах. Сделать состояние поясняющее о окончании сортировки. Закончить заполнение массива состояний сортировки.
Рис. Блок схема метода «setConstraint».
Приложение Б
Класс ConstraintArray.
package mygame.sorting;
import com.jme3.math.Vector3f;
import java.util.ArrayList;
/**
*
* @author semifoll
*/
public class ConstraintArray {
public ArrayList<ArrayOfCube> constArrayCube;
//varible of size.
private float heightObject;
private float wightObject;
private float between;
private boolean notFinish;
private int prevConstraint;
private ArrayList<Integer> defArrayValue;
public ArrayList<Vector3f> defArrayVector; //point to
//displayArrayCoordinate
private Vector3f defControllerLocation; //point to controller location
public ConstraintArray(){
this.heightObject = 3;
this.between = 1;
this.wightObject = 3;
this.notFinish = true;
this.prevConstraint = 0;
this.defArrayValue = new ArrayList<Integer>();
this.defArrayVector = new ArrayList<Vector3f>();
this.defControllerLocation = new Vector3f(-3,0,-3);
this.constArrayCube = new ArrayList<ArrayOfCube>();
}
public ConstraintArray(ArrayList<Vector3f> defArray , ArrayList<Integer>
defValue){
this.heightObject = 0;
this.between = 0;
this.wightObject = 0;
this.notFinish = true;
this.prevConstraint = 0;
this.defArrayVector = new ArrayList<Vector3f>(defArray);
this.defArrayValue = new ArrayList<Integer>();
this.defArrayValue.addAll(defValue);
this.constArrayCube = new ArrayList<ArrayOfCube>();
}
public void addDefVector3f(Vector3f newVec){
if(!this.constArrayCube.isEmpty()){
this.constArrayCube = new ArrayList<ArrayOfCube>();
}
this.defArrayVector.add(newVec);
}
public void addDefValue(Integer newVal){
if(!this.constArrayCube.isEmpty()){
this.constArrayCube = new ArrayList<ArrayOfCube>();
}
this.defArrayValue.add(newVal);
}
public int sizeVal(){
return this.defArrayValue.size();
}
public void setDefArrays(ArrayList<Vector3f> newVec, ArrayList<Integer>
newVal){
this.constArrayCube.clear();
this.constArrayCube = new ArrayList<ArrayOfCube>();
this.defArrayValue = new ArrayList<Integer>(newVal);
this.defArrayVector = new ArrayList<Vector3f>(newVec);
}
public void setHeight(float h){
this.heightObject = h;
}
public float getHeight(){
return this.heightObject;
}
public void setWight(float w){
this.wightObject = w;
}
public float getWight(){
return this.wightObject;
}
public void setBetween(float b){
this.between = b;
}
public float getBetween(){
return this.between;
}
public void setController(Vector3f newControllerLocation){
this.defControllerLocation = newControllerLocation;
}
public Vector3f getController(){
return this.defControllerLocation;
}
public boolean setConstraints(){
this.constArrayCube = new ArrayList<ArrayOfCube>();
this.notFinish = true;
int prevSort = 0;
this.prevConstraint = 0;
addFirstState(this.defControllerLocation);
IntegerfloatNum = 0; //плавающее число. номер от куда идут не
//отсортированные.
while(notFinish){
if(prevSort == this.defArrayVector.size()){
this.notFinish = false;
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Sorting is complete ");
this.prevConstraint++;
//добавить состояние сортировка завершена
continue;
}
//первое число из не отсортированных
Integermin = this.constArrayCube.get(this.prevConstraint).getValueByNum(prevSort);
//номер первого числа из не отсортированных
IntegernumMin = prevSort;
//сохранение номера устойчивого состояния(вне процесса
//перемещения)
IntegersteadyState = this.prevConstraint;
//добавитьцветминимума
//////////////////////////////////////////////
this.setMinFirsOfNotSort(numMin);
/////////////////////////////////////////////
for(int i = prevSort + 1; i!= this.defArrayVector.size(); ++i){
//добавить цвет выбора.
////////////////////////////////////////////////////////////////////
this.setSelectColor(i, numMin);
///////////////////////////////////////////////////////////////////////
if(min > this.constArrayCube.get(this.prevConstraint).
getValueByNum(i)){
//добавить цвет минимума
////////////////////////////////////////////////////////////////////
this.setCurrentMin(i, numMin);
////////////////////////////////////////////////////////////////////
min =
this.constArrayCube.get(this.prevConstraint).
getValueByNum(i);
numMin = i;
}
}
if(numMin == prevSort){
//минимальный тот кого выбирали автоматом.
//добавить состояние из информационного состояния.
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(this.constArrayCube.get(this.prevConstraint + 1).
arrayListCube.size() - 1, "standart");
this.constArrayCube.get(this.prevConstraint+1).setColorByNum(num
Min,"complete");//complete
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("The minimal element stand in right location. "
+ "The number is "+numMin+" ...");
this.prevConstraint++;
prevSort++;
continue;
}
//сделать перенос в начало.
this.backToBegin(numMin);
//1) перенесте в верх y+hight+2 предмета.
this.setMoving(numMin, new Vector3f(
this.constArrayCube.get(this.prevConstraint).getLocalByNum(nu
mMin).x,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).y + this.heightObject +
this.between,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).z
)
);
//2) перенести в х элемента по положению(там где должен стоять)
this.setMoving(numMin, new Vector3f(
prevSort*(this.between+this.wightObject),
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).y,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).z
)
);
//3) сделать "релаксацию"(перенос всех остальных в ту область
//где требуется
//prevSort - номер с которого началось текущее сортирование
this.relaxLocation(prevSort, numMin);
//4) перенести наш элемент в низ на уровень всех.
this.setMoving(numMin,
new Vector3f(
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).x,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).y - this.heightObject -
this.between,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(numMin).z
)
);
this.constArrayCube.get(this.prevConstraint).
setColorByNum(numMin,"complete");//complete
mainChanging(prevSort, min, numMin, steadyState);
moveConrtoller(prevSort);
prevSort++;
}
return true;
}
private void mainChanging(int prevSort, Integer min, Integer numMin,
IntegersteadyState) {
//5) перенести элемент минимальный в истинном массиве и //вернуть все векторы в состояние до сортировки.
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).arrayListValue.add(
prevSort,
this.constArrayCube.get(this.prevConstraint+1).
arrayListValue.get(numMin)
);
this.constArrayCube.get(this.prevConstraint+1).
arrayListValue.remove(numMin + 1);
this.constArrayCube.get(this.prevConstraint + 1).
setArrayVectors(
this.constArrayCube.get(steadyState).arrayListCube
);
this.constArrayCube.get(this.prevConstraint).
setTextInfo("Moving complete...");
this.prevConstraint++;
}
private void moveConrtoller(int prevSort) {
//6) перенести контроллер на первый элемент не отсортированных
this.constArrayCube.get(this.prevConstraint).setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(prevSort).x,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(prevSort).y,
this.constArrayCube.get(this.prevConstraint).
getLocalByNum(prevSort).z -3
)
);
}
private void relaxLocation(int prevSort, Integer numMin) {
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
for(int i = prevSort; i!= numMin; ++i){
this.constArrayCube.get(this.prevConstraint+1).setLocalByNum(i,
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(i).x + this.wightObject + this.between,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(i).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(i).z
)
);
}
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Relax the location...");
this.prevConstraint++;
}
private void backToBegin(Integer numMin) {
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(numMin, "moving");
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(
this.constArrayCube.get(this.prevConstraint + 1).
arrayListCube.size() - 1,
"standart");
this.constArrayCube.get(this.prevConstraint+1).setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).x,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).z - 3
)
);
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Start to moving object...");
this.prevConstraint++;
}
private void addFirstState(Vector3f controllerLocation){
this.constArrayCube.add(new ArrayOfCube(
this.defArrayVector,this.defArrayValue, controllerLocation));
//инициализировать массив начального положения (в 0-м положении)
this.constArrayCube.get(this.prevConstraint).
setTextInfo("Start install. Every box on his location...");
}
private void setMinFirsOfNotSort(Integer numMin){
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(numMin, "minimal");
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Controller choose min element is "
+ "first element of not sorters collection, "
+ "who start in "+numMin+" element...");
//закрасить минимальный цветом.
this.constArrayCube.get(this.prevConstraint+1).setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).x,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numMin).z - 3
)
);
this.prevConstraint++;
}
private void setSelectColor(int objnumi, Integer numMin){
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
if(objnumi>0){
if((objnumi-1)!= numMin){
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(objnumi - 1, "standart");
}
}
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(objnumi, "select");
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Select element for compare whith number”+
+“is"+objnumi+" ...");
this.constArrayCube.get(this.prevConstraint+1).
setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(objnumi).x,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(objnumi).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(objnumi).z - 3
)
);
this.prevConstraint++;
}
private void setCurrentMin(int currentObject, Integer numMin){
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(numMin, "standart");
this.constArrayCube.get(this.prevConstraint+1).
setColorByNum(currentObject, "min");
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Selected element now is min, and the number”
+“is"+currentObject+" ...");
this.constArrayCube.get(this.prevConstraint+1).setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(currentObject).x,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(currentObject).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(currentObject).z - 3
)
);
this.prevConstraint++;
}
private void setMoving(Integer numObject,Vector3f newLocetionObj){
this.constArrayCube.add(
new ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);
this.constArrayCube.get(this.prevConstraint+1).
setLocalByNum(numObject,
newLocetionObj
);
this.constArrayCube.get(this.prevConstraint+1).setControllerLocate(
new Vector3f(
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numObject).x,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numObject).y,
this.constArrayCube.get(this.prevConstraint+1).
getLocalByNum(numObject).z - 3
)
);
this.constArrayCube.get(this.prevConstraint+1).
setTextInfo("Move object on new location...");
this.prevConstraint++;
}
}
Приложение В
КлассArrayOfCube.
package mygame.sorting;
import java.util.ArrayList;
import com.jme3.math.Vector3f;
/**
*
* @author semifoll
*/
public class ArrayOfCube {
private int sizeArray;
public ArrayList<Integer> arrayListValue;
public ArrayList<Vector3f> arrayListCube;
public ArrayList<String> arrayListColor;
public String textInfo;
public Vector3f locateController;
public ArrayOfCube(){
this.arrayListValue = new ArrayList<Integer>();
this.arrayListColor = new ArrayList<String>();
this.arrayListCube = new ArrayList<Vector3f>();
this.locateController = new Vector3f(-3,0,0);
this.sizeArray = 0;
this.textInfo = new String();
}
public ArrayOfCube(
ArrayList<Vector3f> newArray,
ArrayList<Integer> newValues)
{
this.sizeArray = 0;
this.arrayListCube = new ArrayList<Vector3f>();
this.arrayListColor = new ArrayList<String>();
this.arrayListValue = new ArrayList<Integer>();
for(int i = 0; i!= newArray.size(); ++i){
this.arrayListCube.add(newArray.get(i));
this.arrayListValue.add(newValues.get(i));
this.arrayListColor.add("standart");
this.sizeArray++;
}
this.locateController = new Vector3f(-3,0,0);
this.textInfo = "";
}
public ArrayOfCube(
ArrayList<Vector3f> newArray,
ArrayList<Integer> newValues,
Vector3f newLocationController)
{
this.textInfo = "";
this.sizeArray = 0;
this.arrayListCube = new ArrayList<Vector3f>();
this.arrayListColor = new ArrayList<String>();
this.arrayListValue = new ArrayList<Integer>();
for(int i = 0; i!= newArray.size(); ++i){
this.arrayListCube.add(newArray.get(i));
this.arrayListValue.add(newValues.get(i));
this.arrayListColor.add("standart");
this.sizeArray++;
}
this.locateController = new Vector3f(newLocationController);
}
public ArrayOfCube(ArrayOfCube base){
this.sizeArray = 0;
this.arrayListCube = new ArrayList<Vector3f>();
this.arrayListColor = new ArrayList<String>();
this.arrayListValue = new ArrayList<Integer>();
this.textInfo = base.textInfo;
for(int i = 0; i!= base.arrayListCube.size(); ++i){
this.arrayListCube.add(base.arrayListCube.get(i));
this.arrayListValue.add(base.arrayListValue.get(i));
this.arrayListColor.add(base.arrayListColor.get(i));
this.sizeArray++;
}
this.locateController = new Vector3f(base.locateController);
}
public void setTextInfo(String str){
this.textInfo = str;
}
public String getTextInfo(){
return this.textInfo;
}
public void setLocalByNum(int num, Vector3f newVec){
this.arrayListCube.set(num, newVec);
}
public Vector3f getLocalByNum(int num){
return this.arrayListCube.get(num);
}
public int GetSize(){
return sizeArray;
}
public int addToArray(Vector3f location, Integer value){
this.arrayListCube.add(new Vector3f(location));
this.arrayListValue.add(value);
this.arrayListColor.add("standart");
this.sizeArray++;
return sizeArray;
}
public int getValueByNum(int num){
return this.arrayListValue.get(num);
}
public String getColorByNum(int num){
return this.arrayListColor.get(num);
}
public void setControllerLocate(Vector3f newLocate){
this.locateController = new Vector3f(newLocate);
}
public void setColorByNum(int num, String newColor){
if(num < this.arrayListColor.size()){
this.arrayListColor.set(num, newColor);
}
}
public void setDefColor(){
for(int i =0; i!= this.arrayListColor.size(); ++i){
this.arrayListColor.set(i, "standart");
}
}
public void setArray(ArrayList<Vector3f> newArray,
ArrayList<Integer> newValues){
this.arrayListCube = new ArrayList<Vector3f>();
this.arrayListValue = new ArrayList<Integer>();
this.arrayListColor = new ArrayList<String>();
this.sizeArray = 0;
for(int i = 0; i!= newArray.size(); ++i){
this.arrayListCube.add(newArray.get(i));
this.arrayListValue.add(newValues.get(i));
this.arrayListColor.add("standart");
this.sizeArray++;
}
}
public void setArrayVectors(ArrayList<Vector3f> newArray){
this.sizeArray = 0;
this.arrayListCube = new ArrayList<Vector3f>();
for(int i = 0; i!= newArray.size(); ++i){
arrayListCube.add(newArray.get(i));
}
}
public void setValByNum(int num, int val){
if(num<this.arrayListValue.size())
this.arrayListValue.set(num, val);
}
}
Приложение Г
Класс MyBox.
package mygame;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture;
import java.util.Random;
/**
*
* @author semifoll
*/
public class MyBox {
private Geometry box;
private Geometry valTexGeom;
private Integer value;
private Random random;
private ColorRGBA color;
private Texture valTexure;
private final AssetManager assetManager;
public MyBox(AssetManager assetManager,String name , Integer newVal,
Vector3f newVec, ColorRGBA newCol){
this.assetManager = assetManager;
random = new Random();
if(newVal<0 || newVal>9){
newVal = 0;
}
this.value = newVal;
this.color = newCol;
switch(this.value) {
case 1:
this.valTexure = assetManager.loadTexture("Textures/1.png");
break;
case 2:
this.valTexure = assetManager.loadTexture("Textures/2.png");
break;
case 3:
this.valTexure = assetManager.loadTexture("Textures/3.png");
break;
case 4:
this.valTexure = assetManager.loadTexture("Textures/4.png");
break;
case 5:
this.valTexure = assetManager.loadTexture("Textures/5.png");
break;
case 6:
this.valTexure = assetManager.loadTexture("Textures/6.png");
break;
case 7:
this.valTexure = assetManager.loadTexture("Textures/7.png");
break;
case 8:
this.valTexure = assetManager.loadTexture("Textures/8.png");
break;
case 9:
this.valTexure = assetManager.loadTexture("Textures/9.png");
break;
case 0:
this.valTexure = assetManager.loadTexture("Textures/0.png");
break;
}
box = createBox(name,newVec, newCol);
this.valTexGeom = this.createValTexture(name, newVec);
}
public Geometry getValTextureGeom(){
return this.valTexGeom;
}
private Geometry createValTexture(String name, Vector3f loc){
this.valTexure.setMagFilter(Texture.MagFilter.Nearest);
this.valTexure.setMinFilter(Texture.MinFilter.NearestNoMipMaps);
this.valTexure.setAnisotropicFilter(16);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", this.valTexure);
Quad q = new Quad(1, 1);
Geometry g = new Geometry(name, q);
g.setLocalTranslation(loc.x-0.5f, loc.y - 0.5f, loc.z + 1.2f);
g.setMaterial(mat);
return g;
}
private Geometry createBox(String name, Vector3f loc, ColorRGBA color)
{
Box mesh = new Box(Vector3f.ZERO,1,1,1);
Geometry geom = new Geometry(name, mesh);
Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", color);
Material mat1 = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
mat1.setColor("Ambient",ColorRGBA.Blue);
mat1.setColor("Diffuse",ColorRGBA.Blue);
mat1.setColor("Specular",ColorRGBA.Green);
mat1.setBoolean("UseMaterialColors",true);
mat1.setFloat("Shininess", 5);
geom.setMaterial(mat2);
geom.setLocalTranslation(loc);
return geom;
}
public Geometry getBox(){
return this.box;
}
public Integer getVal(){
return this.value;
}
public ColorRGBA getColor(){
return this.color;
}
public Vector3f getVector3f(){
return this.box.getLocalTranslation();
}
public void setValue(Integer newVal){
this.value = newVal;
}
public void setVector3f(Vector3f newVec){
this.box.getLocalTransform().setTranslation(newVec);
}
public void setColor(ColorRGBA newCol){
this.color = newCol;
Geometry newBox = this.createBox(
this.box.getName(),
this.box.getLocalTranslation(),
newCol);
this.box = newBox;
}
}
Приложение Д
Класс управления экраном. MyStartScreen.
package mygame.GUI;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.font.Rectangle;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
Подобные документы
Описание разрабатываемого программного обеспечения, его структура и предъявляемые требования, аналитический обзор. Система приоритетов при разработке, проектирование интерфейса, алгоритмов и иерархии классов. Особенности реализации и внедрения системы.
дипломная работа [878,4 K], добавлен 18.11.2017Разработка программного обеспечения, моделирующего работу банкомата. Особенности области применения терминала и выделение главных функциональных частей. Разработка алгоритма работы программы и реализация системы. Ее тестирование и анализ результатов.
курсовая работа [5,5 M], добавлен 12.10.2011Обзор системного и прикладного программного обеспечения используемого в ООО "Игровые системы". Описание компьютерной сети предприятия. Разработка игрового продукта для планшетов Apple iPad. Реализация визуального интерфейса и алгоритма работы модуля.
отчет по практике [1,4 M], добавлен 18.01.2015Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.
дипломная работа [4,5 M], добавлен 19.01.2017Разработка иерархии классов, содержащей не менее трех уровней. Определение базовых и производных классов. Анализ технического задания. Проектирование структуры программы и базовых алгоритмов. Программная реализация разработанной структуры и алгоритмов.
курсовая работа [34,9 K], добавлен 11.01.2011Анализ технического задания. Разработка интерфейса программы и ее алгоритмов. Кодирование и тестирование разработанного программного обеспечения, оценка его практической эффективности и функциональности. Формирование, содержание руководства пользователя.
курсовая работа [2,0 M], добавлен 31.07.2012Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Разработка интерфейса и программного обеспечения виртуальной библиотеки. Проектирование структуры экранов и навигационной системы. Построение прототипа пользовательского интерфейса. Тестирование и модификация прототипа. Экспертная оценка разработки.
курсовая работа [41,2 K], добавлен 19.12.2010Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.
дипломная работа [1,5 M], добавлен 09.11.2016Описание разрабатываемой программы с точки зрения пользователя и программиста. Поэтапная разработка программной системы. Создание базы данных в Access. Разработка структуры классов. Создание структуры для хранения данных. Проектирование интерфейса.
курсовая работа [1,4 M], добавлен 07.08.2013