Разработка трехмерного визуализатора алгоритмов

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    2,14 Мб
  • Опубликовано:
    2017-01-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка трехмерного визуализатора алгоритмов

Оглавление

Введение

. Аналитический обзор

.1 Анализ существующего П.О.

.2 Анализ алгоритмов для визуализации

.3 Анализ требований к П.П.

. Проектирование П.П.

.1 Определение функциональности П.П.

.2 Выбор типовой архитектуры и интерфейса

.3 Выбор инструментальных средств разработки

.4 Выбор используемого типового алгоритма визуализации

.5 Проектирование иерархии классов

.6 Первичная разработка алгоритма работы программы

3. Реализация ПП

3.1 Особенности реализации системы

.2 Реализация визуализации простейшего алгоритма

.3 Выделение типового приема визуализации

3.4 Разработка интерфейса программы

4. Тестирование ПП

.1 Методика тестирования правильности работы П.О.

.2 Целевое тестирование

.3 Результаты тестирования

. Внедрение ПП

.1 Руководство пользователя

.2 Результаты опытной эксплуатации

Заключение

Список использованных источников

Приложение

Введение

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

Решение проблемы поддержания внимания и концентрации будет переключение взгляда студентов с преподавателя на экран. Однако такая же лекция будет хоть и эффективна небольшое количество времени, однако более эффективно это «наглядная демонстрация работы, либо примера». Таким образом, решение задачи будет создание программы для обучения, которая будет не скучной, объективной. Так же программа должна отвечать всем требованиям, представляемым каждой программе для обучения.

1. Аналитический обзор

Приведем общий анализ структур и продуктов, предоставленных на данный момент.

1.1 Анализ существующего П.О.


Для реализации данной задачи требуется программное обеспечение отвечающее многим требованиям, а именно:

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

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

)        Рациональность. Реализуемый программный продукт должен запускаться на целевом ПК.

Таким образом, весь спектр игровых движков сужается. Из общего перечня можно выделить:

Рис 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».

) 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 Анализ алгоритмов для визуализации


Существует множество алгоритмов визуализации. От базовых силовых алгоритмов до многоуровневых алгоритмов учитывающих топологические особенности. Однако данные виды алгоритма визуализации не подходят т.к. данные алгоритмы применимы для структур «графы». Для реализации задания возможно применение двух алгоритмов.

)        Прямая визуализация. Визуализация в процессе выполнения алгоритма сортировки.

)        Планирование. Визуализация алгоритма, используя информацию из сохраненных контейнеров.

 

.3 Анализ требований к П.П.


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

Требования к функциональным характеристикам:

1)    Вывод графического интерфейса визуализатора на экран. Простейшее требование необходимое для любого интерактивного приложения.

2)      Выполнение алгоритма сортировки автоматическое и пошаговое. Пользователь сам должен определять последовательность отображения. От работы обучающего приложения мало толку если пользователь не может начинать обучение с начала.

)        Совместно с выполнением выходит на экран информация о шагах. Для обучения пользователя необходимо так же и информация необходимая для объяснения.

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

)        Зрелищность. Требование, которое представлено для данного программного продукта, которое отличает его от остальных.

6)     Авто шаг. Приложение должно иметь авто шаг для первичного обучения пользователя, ознакомления.

Требования необходимые для стабильной работы приложения на протяжении всей эксплуатации. Надежность является необходимым требованием.

Требования к надежности:

1)    Корректность и правильность работы.Программа должна работать правильно иначе вся разработка и труды будут потрачены напрасно.

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

)        Устойчивость. Программа должна работать стабильно на протяжении всей работы программы. Крахи не допустимы.

)        Запуск. Программа должна работать на компьютерах заказчика, в данном случае это компьютеры кафедры АВТ.

2. Проектирование П.П.

На данный момент процесс создания программ и приложений не представить без разделения разработки на этапы жизненного цикла. Под жизненным циклом программы понимается набор этапов:

)Анализ предметной области и создание ТЗ. Этот этап производился при непосредственном взаимодействием с заказчиком, в данном случае это «руководитель ВКР». Совместно с заказчиком должны быть построены требования для данного продукта, а так же обговорены главные функции и время проектирования, сдачи проекта, тестирования.

) Проектирование структуры программы. Проектирование структуры,в соответствии которой будет построена логика программного продукта. Состоит из проектирования основных объектов и структур.

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

)Тестирование и отладка. Заключается в тестировании на наборе определенном разработчиком и наборе определенным руководителем ВКР.

)Внедрение программного продукта. Внедрение происходит на «Кафедре АВТ» на целевых машинах. Заключается в установке и малом тестировании на установленных компьютерах.

)Сопровождение программного продукта. Сопровождение заключается в поддержании связи с кафедрой и в случае нахождения багов и ошибок доработка и изменение программы.

)Утилизация или обновление. Происходит после встречи с представителем кафедры ВКР и составление исправлений и доработок.

Далее приведено описание конкретных стадии разработки, описывает этапы проектирования программного продукта на протяжении разработки.

2.1 Определение функциональности П.П.

Программный продукт должен обладать функциями:

)        Визуальная привлекательность. Множество программ существует, однако они не столь комфортно выглядят чтобы пользоваться часто и эффективно, ведь главный враг эффективности это рутина.

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

)        Интерактивность. Приложение взаимодействует с пользователем через интерфейс взаимодействия для получения информации типа:

Получение значения текущего объекта.

Переключение между состояниями.

Выход из приложения.

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

)        Функция пошагового выполнения.Для пошагового выполнения был разработан вид взаимодействия через интерфейс включающий в себя кнопки «Назад, Далее»(Next, Prev).

 

.2 Выбор типовой архитектуры и интерфейса


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

Целевая архитектура включает в себя:

Таблица 1 - Характеристики целевой архитектуры.

Характеристика

Наименование

Операционная система.

Windows XP, Vista, 7, 8/8.1, 10

Процессор

Intel Core 2 Duo

Оперативная память.

 1 Гб О.З.У.

Место на диске

50 МБ

DirectX

9.0

Видео карта

128 МБ Видео Памяти


Необходимое П.О.:

Для работы и установки приложения на целевой машине требуется установка JavaMechine для корректной работы и взаимодействия с библиотеками Java.

Выбор интерфейса:

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

)        Интерфейс должен включать кнопки для управления процессом визуализации и отправления команд от пользователя(«Next», «Play», «Prev»).

)        Присутствие интерфейса для добавления в массив объектов новых элементов(поле Edit, Text, Button).

)        Начальное меню запуска. Меню для запуска отдельных функций:

Информация(«Info»).

Перейди на главный экран.(«Start»).

Закончить работу приложения(«Quit»).

Изменить настройки запуска.(«Option»).

.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. Реализация ПП

Конечная реализация программного продукта представлена это программа решающая задачу и взаимодействующая с пользователем по средствам интерфейса приложения.

.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 Выделение типового приема визуализации


Типовой прием заключается в использовании приема «Планирование» и основного принципа построения состояний через перенос и смещение.

Построение состояния заключается:

)        Создать состояние из предыдущего.

)        Сделать изменение согласно алгоритму..        Найти необходимый элемент перемещения..    Переместить по координате у(вертикально)..  Переместить по координате х (в право)..        Переместить по координате z (на нас)..  Сделать изменения согласно цвету..        Переместить контроллер.

)        Увеличить количество сделанных шагов.

)        Вернуться.

 

.4 Разработка интерфейса программы


Разработка интерфейса проводилась во встроенном редакторе движка с помощьюXML разметки.

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

Всего было сформировано 3 XML экрана:

)        Стартовый экран.

)        Выбор алгоритма сортировки.

)        Главный экран отвечающий за основной алгоритм работы программы, а именно реализация визуализации сортировки.

Далее приведено описание каждого из экранов.

Стартовый экран.

Разработка данного элемента интерфейса происходила из необходимых функций начального экрана. Вначале был создан начальный шаблон, реализующий примерное расположение.

Следующим шагом был сделан конечный вид, который включает в себя надписи (Text), кнопки (Button). Экран был разделен на 3 панели. Верхняя панель была отдана названию приложения с визуальным эффектом выпада из верхней области. В средней панели расположена информация о разработчике и служебная информация. Нижняя панель отвечает за четыре кнопки взаимодействия с объектом.

Выбор алгоритма сортировки.

Разработка данного элемента осуществлялось из необходимости разделять каждый из сортировок в отдельные сцены.

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

Главный экран.

Разработка данного элемента осуществлялась из требований, обговоренных с заказчиком.

В течении разработки был добавлен шаблон для расположения элементов GUI. Данное расположение позволило поделить горизонтальную часть для расположения элементов.

Следующим шагом был создан набор панелей для вертикального расположения относительно каждого столбца. Каждая панель не обязательно должна совпадать с другой по размеру. Для введения функциональности в главный экран было добавлены в ХМL файл контроллеры в виде кнопок:

·   «Next» - перейти к следующему состоянию.

·        «Play» - переключить на авто шаг.

·        «Prev» - перейти к предыдущему состоянию.

·        «AddBox» - добавить новый элемент сортировки.

Добавлены элементы текстового поля ввода:

·   «TextInfo» - поле, отвечающее за информацию о состоянии сортировки.

·        «TextAddBox» - поле, отвечающее за ввод информации, а именно за значение объекта сортировки.

Добавлены элементы текстового поля:

·   «Editvalue:» - текст поле для информации о расположении поля ввода.

·        «Label_Condition» - поле для отображения текущем номере шаге из максимального их количества.

Разработка контроллера экранов.

Для управления экранами был создан контроллер, который запускает методы, которые записаны в его теле класса. Вызов методов выполняется при нажатии кнопок на GUI интерфейсе. Контроллер наследует «SimpleAplication», что позволяет ему получить доступ к полям «app»(ссылка на приложение), nifity(ссылка на GUI интерфейс), однако следует убедиться что они будут переданы и присвоить эти значения в конструкторе. Фактически контроллер это тот же Main-файл, но который присоединен к локальному узлу, который можно будет отсоединить при необходимости. Таким образом, мы можем разделить всю программу на разные локальные файлы.

4. Тестирование П.П.

Тестирование проводиться с целью выявления отсутствия ошибок в основном алгоритме программы. Обычно проходит на заранее подготовленном наборе тестов, которые составлены с разработчиком, либо самим разработчиком.

.1 Методика тестирования правильности работы П.О.

Тестирование должно происходить для данного программного продукта с набором чисел, а именно: 5, 4, 1, 3, 2.

Рис 16. Начальное состояние объектов.

) Начальное состояние все кубы на своих начальных местах.

) Алгоритм последовательным перебором находит минимальный элемент. На начальном шаге он равен первому элементу.

) Сравнивание последовательно находит минимальный элемент (1).

) Перенос «1» в начало со смешением для освобождения места под целевой элемент.

Рис 17. Состояние первый шаг.

Рис 18. Состояние второй шаг.

) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированной части (2).

) Перенос «2» в конец отсортированной части.

) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированных элементов (3).

) Перенос «3» в конец отсортированной части.

Рис.19. Состояние третьего шага.

) Следующий шаг. Алгоритм находит минимальный элемент из не отсортированных элементов (4).

Рис.20. Состояние пред последнее.

) Алгоритм находит минимальный, и это оказывается последний и единственный элемент из не отсортированной части. Следовательно, перенос не требуется.

Рис 21. Состояние конца сортировки.

) Сортировка завершена.

 

.2 Целевое тестирование


Целевое тестирование должно проходить непосредственно на возможных пользователях. В качестве пользователя был выбран обычный студент кафедры АВТ. Целью данного тестирования является выявление реакции на данный продукт.

4.3 Результаты тестирования


В результате тестирования было получены результаты:

)        Алгоритм корректно работает с набором чисел:.    5, 4, 1, 3, 2..        1,3,2,4.

c.       1.

) Выполнение программы корректно на протяжении всего цикла.

) Целевое тестирование на студенте выявило что:

«Результат не был достаточным и дальнейшая подкрутка графики и визуального оформления может исправить этот недостаток».

визуализация программа алгоритм

5. Внедрение П.П.

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

.1 Руководство пользователя

Набор инструкций для овладения данной программой.

1. Стартовый экран.

Данный экран имеет четыре управляющих компонента.

)        Для того, чтобы перейти к выбору алгоритма сортировки нажмите кнопку «Start».

)        Для того чтобы получить информацию о пользователе и информацию собираемую в процессе работы программы нажмите «Info».

)        Для того чтобы изменить настройки экрана и приложения нажмите на кнопку «Option».

)        Для того чтобы выйти из приложения нажмите на кнопку «Quit».

. Экран выбора сортировки.

Данный экран имеет три управляющих компонента.

) Для выбора «Пузырьковой сортировки» нажмите на кнопку «BubbleSort»

) Для выбора «Сортировки Шелла» нажмите на кнопку

«ShellSort».

) Для выбора «Сортировки Хоара» нажмите на кнопку

«QuickSort».

. Главный экран.

Данный экран имеет четыре управляющих компонента.

)        Чтобы добавить объект для сортировки .        Введите число, равное значению объекта( вес) который вы хотите добавить.     Нажмите на кнопку «AddBox».

)        Чтобы запустить авто шаг нажмите на кнопку «Play».

)        Чтобы перейти к следующему состоянию в ручном режиме нажмите на кнопку «Next».

)        Чтобы перейти к предыдущему состоянию в ручном режиме нажмите на кнопку «Prev».

)        Чтобы выйти из главного экрана на стартовый нажмите кнопку на клавиатуре «Esc».

 

.2 Результаты опытной эксплуатации


В результате опытной эксплуатации была установлена программа на целевую машину кафедры АВТ. Ошибок при установке обнаружено не было.

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

Заключение

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

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

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

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

Разработка интерфейса - процесс, занимающий большую часть от всей разработки, т.к. включает визуальное оформление и интерактивное взаимодействие.

В ходе работы была разработан П.П. для обучения студентов через визуализацию алгоритмов сортировки и демонстрацию его работы.

Список использованных источников

1.      «Nifty GUI» the Missing Manual (28.12.2011). Авторы: JensHohmuth (void) Martin Karing (mkaring) (Slick2D chapter)

.        «jMonkeyEngine 3.0 Beginner’s Guide» (June 2013 Packt Publishing) Автор: Ruth Kusterer.

3.      «Современные силовые алгоритмы для визуализации информации большого объема» (2002) Автор: З.В. Апанович.

Приложение А

Пояснение алгоритма работы метода «setConstraints»:

)        Установка первого состояния из массивов начальных координат значений, координат. Установка контроллера из начального состояния.

addFirstState(this.defControllerLocation);

2)      Пока не закончиться сортировка, зациклить.

.1) Если предыдущий элемент был последним из массива, значит записать состояние «Complite», сортировку закончить и выйти из метода.

.2) Запомнить первое число из не отсортированных.

.3) Запомним устойчивое состояние(вне процессов переносов).

.4) Добавить состояние, в котором минимальный элемент это первый элемент, добавив отличие в виде цвета элемента (минимальный это красный).

.5) Зациклить пока номер цикла не будет равен длине

.5.1)Сделать состояние, в котором цвет текущего элемента с номером равном номеру цикла.

.5.2)Проверить значение элемента массива с номером цикла в сравнение с минимальным числом

.5.2.1) Если минимальное число больше, то запомнить это число как минимальное. Сделать состояние в котором предыдущее минимальное число становиться стандартным(стандартного цвета), а новое становиться минимальным (окрашивается в минимальный цвет).

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

.5.4) Наше минимальное число это не то, стандартное, которое было поставлено автоматом, значит между минимальным числом и концом отсортированной части существуют объекты не отсортированные, значит нужно перенести.

.5.5) Перенести минимальный элемент вверх по координате.

.5.6) Перенести минимальный элемент в лево над элементом которой является началом не отсортированного списка.

.5.7) Перенести все объекты между прошлым местом минимального и началом не отсортированного списка вправо на ширину объекта сортировки и расстояния между ними.

.5.8) Перенести минимальный элемент вниз на высоту элемента + расстояние между элементами сортировки, т.е. на место где он должен стоять.

.5.9) Сделать минимальный элемент завершенным.

.6) Перенести контроллер на элемент первый из не отсортированных.

.7) Вернуться в начало цикла.

3)      Элементы стоят на своих местах. Сделать состояние поясняющее о окончании сортировки. Закончить заполнение массива состояний сортировки.

Рис. Блок схема метода «setConstraint».

Приложение Б

Класс ConstraintArray.

mygame.sorting;com.jme3.math.Vector3f;java.util.ArrayList;

/**

*

* @author semifoll

*/class ConstraintArray {ArrayList<ArrayOfCube> constArrayCube;

//varible of size.float heightObject;float wightObject;float between;boolean notFinish;int prevConstraint;ArrayList<Integer> defArrayValue;ArrayList<Vector3f> defArrayVector; //point to

//displayArrayCoordinateVector3f defControllerLocation; //point to controller locationConstraintArray(){.heightObject = 3;.between = 1;.wightObject = 3;.notFinish = true;.prevConstraint = 0;.defArrayValue = new ArrayList<Integer>();.defArrayVector = new ArrayList<Vector3f>();.defControllerLocation = new Vector3f(-3,0,-3);.constArrayCube = new ArrayList<ArrayOfCube>();

}ConstraintArray(ArrayList<Vector3f> defArray , ArrayList<Integer>){.heightObject = 0;.between = 0;.wightObject = 0;.notFinish = true;.prevConstraint = 0;.defArrayVector = new ArrayList<Vector3f>(defArray);.defArrayValue = new ArrayList<Integer>();.defArrayValue.addAll(defValue);.constArrayCube = new ArrayList<ArrayOfCube>();

}void addDefVector3f(Vector3f newVec){(!this.constArrayCube.isEmpty()){.constArrayCube = new ArrayList<ArrayOfCube>();

}.defArrayVector.add(newVec);

}void addDefValue(Integer newVal){(!this.constArrayCube.isEmpty()){.constArrayCube = new ArrayList<ArrayOfCube>();

}.defArrayValue.add(newVal);

}int sizeVal(){this.defArrayValue.size();

}void setDefArrays(ArrayList<Vector3f> newVec, ArrayList<Integer>){.constArrayCube.clear();.constArrayCube = new ArrayList<ArrayOfCube>();.defArrayValue = new ArrayList<Integer>(newVal);.defArrayVector = new ArrayList<Vector3f>(newVec);

}void setHeight(float h){.heightObject = h;

}float getHeight(){this.heightObject;

}void setWight(float w){.wightObject = w;

}float getWight(){this.wightObject;

}void setBetween(float b){.between = b;

}float getBetween(){this.between;

}void setController(Vector3f newControllerLocation){.defControllerLocation = newControllerLocation;

}Vector3f getController(){this.defControllerLocation;

}boolean setConstraints(){ .constArrayCube = new ArrayList<ArrayOfCube>();.notFinish = true;prevSort = 0;.prevConstraint = 0;(this.defControllerLocation); = 0; //плавающее число. номер от куда идут не

//отсортированные.(notFinish){(prevSort == this.defArrayVector.size()){.notFinish = false;.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).("Sorting is complete ");.prevConstraint++;

//добавить состояние сортировка завершена

continue;

}

//первое число из не отсортированных

Integermin = this.constArrayCube.get(this.prevConstraint).getValueByNum(prevSort);

//номер первого числа из не отсортированных

IntegernumMin = prevSort;

//сохранение номера устойчивого состояния(вне процесса

//перемещения)

IntegersteadyState = this.prevConstraint;

//добавитьцветминимума

//////////////////////////////////////////////

this.setMinFirsOfNotSort(numMin);

/////////////////////////////////////////////(int i = prevSort + 1; i!= this.defArrayVector.size(); ++i){

////////////////////////////////////////////////////////////////////.setSelectColor(i, numMin);

///////////////////////////////////////////////////////////////////////(min > this.constArrayCube.get(this.prevConstraint).(i)){

//добавить цвет минимума

////////////////////////////////////////////////////////////////////

this.setCurrentMin(i, numMin);

//////////////////////////////////////////////////////////////////// = .constArrayCube.get(this.prevConstraint).(i);= i;

}

}(numMin == prevSort){

//минимальный тот кого выбирали автоматом.

//добавить состояние из информационного состояния.

this.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).(this.constArrayCube.get(this.prevConstraint + 1)..size() - 1, "standart");.constArrayCube.get(this.prevConstraint+1).setColorByNum(num,"complete");//complete.constArrayCube.get(this.prevConstraint+1).("The minimal element stand in right location. "

+ "The number is "+numMin+" ...");.prevConstraint++;++;

continue;

}

//сделать перенос в начало.

this.backToBegin(numMin);

//1) перенесте в верх y+hight+2 предмета.

this.setMoving(numMin, new Vector3f(.constArrayCube.get(this.prevConstraint).getLocalByNum(nu).x,.constArrayCube.get(this.prevConstraint).(numMin).y + this.heightObject + .between,.constArrayCube.get(this.prevConstraint).(numMin).z

)

);

//2) перенести в х элемента по положению(там где должен стоять)

this.setMoving(numMin, new Vector3f(*(this.between+this.wightObject),.constArrayCube.get(this.prevConstraint).(numMin).y,.constArrayCube.get(this.prevConstraint).(numMin).z

)

);

//3) сделать "релаксацию"(перенос всех остальных в ту область

//где требуется

//prevSort - номер с которого началось текущее сортирование

this.relaxLocation(prevSort, numMin);

//4) перенести наш элемент в низ на уровень всех.

this.setMoving(numMin, Vector3f( .constArrayCube.get(this.prevConstraint).(numMin).x,.constArrayCube.get(this.prevConstraint).(numMin).y - this.heightObject -.between,.constArrayCube.get(this.prevConstraint).(numMin).z

)

);.constArrayCube.get(this.prevConstraint).(numMin,"complete");//complete(prevSort, min, numMin, steadyState);(prevSort);++;

}true;

}void mainChanging(int prevSort, Integer min, Integer numMin, ) {

//5) перенести элемент минимальный в истинном массиве и //вернуть все векторы в состояние до сортировки.

this.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).arrayListValue.add(,.constArrayCube.get(this.prevConstraint+1)..get(numMin)

);.constArrayCube.get(this.prevConstraint+1)..remove(numMin + 1);.constArrayCube.get(this.prevConstraint + 1).(.constArrayCube.get(steadyState).arrayListCube

);.constArrayCube.get(this.prevConstraint).("Moving complete...");.prevConstraint++;

}void moveConrtoller(int prevSort) {

//6) перенести контроллер на первый элемент не отсортированных

this.constArrayCube.get(this.prevConstraint).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint).(prevSort).x,.constArrayCube.get(this.prevConstraint).(prevSort).y,.constArrayCube.get(this.prevConstraint).(prevSort).z -3

)

);

}void relaxLocation(int prevSort, Integer numMin) {.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);(int i = prevSort; i!= numMin; ++i){.constArrayCube.get(this.prevConstraint+1).setLocalByNum(i, Vector3f(.constArrayCube.get(this.prevConstraint+1).(i).x + this.wightObject + this.between, .constArrayCube.get(this.prevConstraint+1).(i).y,.constArrayCube.get(this.prevConstraint+1).(i).z

)

);

}.constArrayCube.get(this.prevConstraint+1).("Relax the location...");.prevConstraint++;

}void backToBegin(Integer numMin) {.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).(numMin, "moving");.constArrayCube.get(this.prevConstraint+1).(.constArrayCube.get(this.prevConstraint + 1)..size() - 1,

"standart");.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numMin).x,.constArrayCube.get(this.prevConstraint+1).(numMin).y,.constArrayCube.get(this.prevConstraint+1).(numMin).z - 3

)

);.constArrayCube.get(this.prevConstraint+1).("Start to moving object...");.prevConstraint++;

}void addFirstState(Vector3f controllerLocation){.constArrayCube.add(new ArrayOfCube(.defArrayVector,this.defArrayValue, controllerLocation));

//инициализировать массив начального положения (в 0-м положении)

this.constArrayCube.get(this.prevConstraint).("Start install. Every box on his location...");

}void setMinFirsOfNotSort(Integer numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).(numMin, "minimal");.constArrayCube.get(this.prevConstraint+1).("Controller choose min element is "

+ "first element of not sorters collection, "

+ "who start in "+numMin+" element...");

//закрасить минимальный цветом..constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numMin).x,.constArrayCube.get(this.prevConstraint+1).(numMin).y,.constArrayCube.get(this.prevConstraint+1).(numMin).z - 3

)

);.prevConstraint++;

}void setSelectColor(int objnumi, Integer numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);(objnumi>0){((objnumi-1)!= numMin){.constArrayCube.get(this.prevConstraint+1).(objnumi - 1, "standart");

}

}.constArrayCube.get(this.prevConstraint+1).(objnumi, "select");.constArrayCube.get(this.prevConstraint+1).("Select element for compare whith number”+

+“is"+objnumi+" ...");.constArrayCube.get(this.prevConstraint+1).(Vector3f(.constArrayCube.get(this.prevConstraint+1).(objnumi).x,.constArrayCube.get(this.prevConstraint+1).(objnumi).y,.constArrayCube.get(this.prevConstraint+1).(objnumi).z - 3

)

);.prevConstraint++;

}void setCurrentMin(int currentObject, Integer numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).(numMin, "standart");.constArrayCube.get(this.prevConstraint+1).(currentObject, "min");.constArrayCube.get(this.prevConstraint+1).("Selected element now is min, and the number”

+“is"+currentObject+" ...");.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(currentObject).x,.constArrayCube.get(this.prevConstraint+1).(currentObject).y,.constArrayCube.get(this.prevConstraint+1).(currentObject).z - 3

)

);.prevConstraint++;

}void setMoving(Integer numObject,Vector3f newLocetionObj){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))

);.constArrayCube.get(this.prevConstraint+1).(numObject,

);.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numObject).x,.constArrayCube.get(this.prevConstraint+1).(numObject).y,.constArrayCube.get(this.prevConstraint+1).(numObject).z - 3

)

);.constArrayCube.get(this.prevConstraint+1).("Move object on new location...");.prevConstraint++;

}

}

Приложение В

КлассArrayOfCube.mygame.sorting;java.util.ArrayList;com.jme3.math.Vector3f;

/**

*

* @author semifoll

*/class ArrayOfCube {int sizeArray;ArrayList<Integer> arrayListValue; ArrayList<Vector3f> arrayListCube; ArrayList<String> arrayListColor;String textInfo;Vector3f locateController;ArrayOfCube(){.arrayListValue = new ArrayList<Integer>();.arrayListColor = new ArrayList<String>();.arrayListCube = new ArrayList<Vector3f>();.locateController = new Vector3f(-3,0,0);.sizeArray = 0;.textInfo = new String();

}ArrayOfCube( <Vector3f> newArray, <Integer> newValues)

{.sizeArray = 0;.arrayListCube = new ArrayList<Vector3f>();.arrayListColor = new ArrayList<String>();.arrayListValue = new ArrayList<Integer>();(int i = 0; i!= newArray.size(); ++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;

}.locateController = new Vector3f(-3,0,0);.textInfo = "";

} ArrayOfCube(<Vector3f> newArray, <Integer> newValues, f newLocationController)

{.textInfo = "";.sizeArray = 0;.arrayListCube = new ArrayList<Vector3f>();.arrayListColor = new ArrayList<String>();.arrayListValue = new ArrayList<Integer>();(int i = 0; i!= newArray.size(); ++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;

}.locateController = new Vector3f(newLocationController);

}ArrayOfCube(ArrayOfCube base){.sizeArray = 0;.arrayListCube = new ArrayList<Vector3f>();.arrayListColor = new ArrayList<String>();.arrayListValue = new ArrayList<Integer>();.textInfo = base.textInfo;(int i = 0; i!= base.arrayListCube.size(); ++i){.arrayListCube.add(base.arrayListCube.get(i));.arrayListValue.add(base.arrayListValue.get(i));.arrayListColor.add(base.arrayListColor.get(i));.sizeArray++;

}.locateController = new Vector3f(base.locateController);

}void setTextInfo(String str){.textInfo = str;

}String getTextInfo(){this.textInfo;

}void setLocalByNum(int num, Vector3f newVec){.arrayListCube.set(num, newVec);

}Vector3f getLocalByNum(int num){this.arrayListCube.get(num);

}int GetSize(){sizeArray;

}int addToArray(Vector3f location, Integer value){.arrayListCube.add(new Vector3f(location));.arrayListValue.add(value);.arrayListColor.add("standart");.sizeArray++;sizeArray;

}int getValueByNum(int num){this.arrayListValue.get(num);

}String getColorByNum(int num){this.arrayListColor.get(num);

}void setControllerLocate(Vector3f newLocate){.locateController = new Vector3f(newLocate);

}void setColorByNum(int num, String newColor){(num < this.arrayListColor.size()){.arrayListColor.set(num, newColor);

}

}void setDefColor(){(int i =0; i!= this.arrayListColor.size(); ++i){.arrayListColor.set(i, "standart");

}

}void setArray(ArrayList<Vector3f> newArray,<Integer> newValues){.arrayListCube = new ArrayList<Vector3f>();.arrayListValue = new ArrayList<Integer>();.arrayListColor = new ArrayList<String>();.sizeArray = 0;(int i = 0; i!= newArray.size(); ++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;

}

}void setArrayVectors(ArrayList<Vector3f> newArray){.sizeArray = 0;.arrayListCube = new ArrayList<Vector3f>();(int i = 0; i!= newArray.size(); ++i){.add(newArray.get(i));

}

}void setValByNum(int num, int val){(num<this.arrayListValue.size()).arrayListValue.set(num, val);

}

}

Приложение Г

Класс MyBox.

mygame;com.jme3.asset.AssetManager;com.jme3.material.Material;com.jme3.math.ColorRGBA;com.jme3.math.Vector3f;com.jme3.scene.Geometry;com.jme3.scene.Node;com.jme3.scene.shape.Box;com.jme3.scene.shape.Quad;com.jme3.texture.Texture;java.util.Random;

/**

*

* @author semifoll

*/class MyBox {Geometry box;Geometry valTexGeom;Integer value;Random random;ColorRGBA color;Texture valTexure;final AssetManager assetManager;MyBox(AssetManager assetManager,String name , Integer newVal,f newVec, ColorRGBA newCol){.assetManager = assetManager;= new Random();(newVal<0 || newVal>9){= 0;

}.value = newVal;.color = newCol;(this.value) {1:

this.valTexure = assetManager.loadTexture("Textures/1.png");;2:

this.valTexure = assetManager.loadTexture("Textures/2.png");;3:

this.valTexure = assetManager.loadTexture("Textures/3.png");;4:

this.valTexure = assetManager.loadTexture("Textures/4.png");;5:

this.valTexure = assetManager.loadTexture("Textures/5.png");;6:

this.valTexure = assetManager.loadTexture("Textures/6.png");;7:

this.valTexure = assetManager.loadTexture("Textures/7.png");;8:

this.valTexure = assetManager.loadTexture("Textures/8.png");;9:

this.valTexure = assetManager.loadTexture("Textures/9.png");;0:

this.valTexure = assetManager.loadTexture("Textures/0.png");;

}= createBox(name,newVec, newCol);.valTexGeom = this.createValTexture(name, newVec);

}Geometry getValTextureGeom(){this.valTexGeom;

}Geometry createValTexture(String name, Vector3f loc){.valTexure.setMagFilter(Texture.MagFilter.Nearest);.valTexure.setMinFilter(Texture.MinFilter.NearestNoMipMaps);.valTexure.setAnisotropicFilter(16);mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");.setTexture("ColorMap", this.valTexure);q = new Quad(1, 1);g = new Geometry(name, q);.setLocalTranslation(loc.x-0.5f, loc.y - 0.5f, loc.z + 1.2f);.setMaterial(mat); g;

}Geometry createBox(String name, Vector3f loc, ColorRGBA color)

{mesh = new Box(Vector3f.ZERO,1,1,1);geom = new Geometry(name, mesh);mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");.setColor("Color", color);mat1 = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");.setColor("Ambient",ColorRGBA.Blue);.setColor("Diffuse",ColorRGBA.Blue);.setColor("Specular",ColorRGBA.Green);.setBoolean("UseMaterialColors",true);.setFloat("Shininess", 5);.setMaterial(mat2);.setLocalTranslation(loc);geom;

}Geometry getBox(){this.box;

} Integer getVal(){this.value;

}ColorRGBA getColor(){this.color;

}Vector3f getVector3f(){this.box.getLocalTranslation();

}void setValue(Integer newVal){.value = newVal;

}void setVector3f(Vector3f newVec){.box.getLocalTransform().setTranslation(newVec);

}void setColor(ColorRGBA newCol){.color = newCol;newBox = this.createBox(.box.getName(),.box.getLocalTranslation(), );.box = newBox;

}

}

Приложение Д

Класс управления экраном. MyStartScreen.

mygame.GUI;com.jme3.app.Application;com.jme3.app.state.AbstractAppState;com.jme3.app.state.AppStateManager;com.jme3.asset.AssetManager;com.jme3.font.BitmapFont;com.jme3.font.BitmapText;com.jme3.font.Rectangle;com.jme3.material.Material;com.jme3.math.ColorRGBA;com.jme3.math.Vector3f;com.jme3.renderer.queue.RenderQueue;com.jme3.scene.Geometry;com.jme3.scene.Node;com.jme3.scene.shape.Box;com.jme3.scene.shape.Quad;com.jme3.system.AppSettings;com.jme3.texture.Image;com.jme3.texture.Texture;com.jme3.texture.Texture2D;de.lessvoid.nifty.Nifty;de.lessvoid.nifty.controls.Label;de.lessvoid.nifty.controls.TextField;de.lessvoid.nifty.elements.Element;de.lessvoid.nifty.elements.render.TextRenderer;de.lessvoid.nifty.screen.Screen;de.lessvoid.nifty.screen.ScreenController;java.util.ArrayList;java.util.Random;java.util.Vector;javafx.scene.text.Font;mygame.Main;mygame.MyBox;mygame.sorting.ConstraintArray;

public class MyStartScreen extends AbstractAppState implements ScreenController {

private Application app;AppStateManager stateManager;Nifty nifty;Screen screen;int step;int totalStep;ArrayList<MyBox> vecBox;Geometry controllerGeom;Vector3f controllerVec3f;boolean auto;long prevTime;

//!!!!!!!!!!ConstraintArray constr;Random random;ColorRGBA standart = ColorRGBA.Gray;ColorRGBA select = ColorRGBA.Blue;ColorRGBA minimal = ColorRGBA.Red;ColorRGBA complete = ColorRGBA.LightGray;ColorRGBA moving = ColorRGBA.Pink;float speed = 10;boolean moveCompliteX = true;boolean moveCompliteY = true;boolean moveCompliteZ = true;boolean movingComplete = false;

//////////////float hightBox = 3;float weightBox = 3;float betweenBox = 1;

///////////////

//private ViewPort viewPort;final Node rootNode;final Node guiNode;final AssetManager assetManager;final Node localRootNode = new Node("Start Screen RootNode");final Node localGuiNode = new Node("Start Screen GuiNode");

//private final ColorRGBA backgroundColor = ColorRGBA.Gray;int distance=0; BitmapText distanceText;AppSettings settings;MyStartScreen(Main app, AppSettings settings){.app = app;.stateManager = app.getStateManager();.rootNode = app.getRootNode();

//this.viewPort = app.getViewPort();.guiNode = app.getGuiNode();.assetManager = app.getAssetManager();.settings = settings;

}Geometry createController(Vector3f loc){mesh = new Box(Vector3f.ZERO,1,2,1);geom = new Geometry("controller", mesh);mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");.setColor("Color", ColorRGBA.Brown); mat1 = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");.setColor("Ambient",ColorRGBA.Blue);.setColor("Diffuse",ColorRGBA.Blue);.setColor("Specular",ColorRGBA.Green);.setBoolean("UseMaterialColors",true);.setFloat("Shininess", 5);.setMaterial(mat2);.setLocalTranslation(loc);geom;

}

@Overridevoid initialize(AppStateManager stateManager, Application app) {.initialize(stateManager, app); .getInputManager().setCursorVisible(true);.vecBox = new ArrayList<MyBox>();

//TODO: initialize your AppState, e.g. attach spatials to rootNode

//this is called on the OpenGL thread after the AppState has been

//attached= new Random();.attachChild(localRootNode);.attachChild(localGuiNode);

//viewPort.setBackgroundColor(backgroundColor);= 0;= 0;.constr = new ConstraintArray();.prevTime = System.currentTimeMillis(); .controllerVec3f = new Vector3f(-3,0,0);.controllerGeom = this.createController(this.controllerVec3f);.rootNode.attachChild(this.controllerGeom);

}

@Overridevoid update(float tpf) {

//TODO: implement behavior during runtime(this.auto && (System.currentTimeMillis() - this.prevTime)>1000 &&.movingComplete){(this.step < this.totalStep).step++;

}(this.moveCompliteX == false &&.moveCompliteY == false &&.moveCompliteZ == false)

{.movingComplete = false;

}(this.moveCompliteX == true &&.moveCompliteY == true &&.moveCompliteZ == true)

{.movingComplete = true;

}(this.step < this.totalStep){

//проверканакоординаты.(int i = this.constr.sizeVal()-1; i > -1; i-- ){(this.vecBox.get(i).getVector3f().x

>.constr.constArrayCube.(this.step).arrayListCube.get(i).x)

{.vecBox.get(i).setVector3f( Vector3f(

(float)(this.vecBox.get(i).getVector3f().x -speed*tpf),.vecBox.get(i).getVector3f().y,.vecBox.get(i).getVector3f().z

)

);

}(this.vecBox.get(i).getVector3f().x

<.constr.constArrayCube.get(this.step).arrayListCube.get(i).x )

{.vecBox.get(i).setVector3f( Vector3f(

(float)(this.vecBox.get(i).getVector3f().x +speed*tpf),.vecBox.get(i).getVector3f().y,.vecBox.get(i).getVector3f().z

)

);

}(this.vecBox.get(i).getVector3f().x

==.constr.constArrayCube.get(this.step).arrayListCube.get(i).x )

{ .moveCompliteX = true;

} (this.vecBox.get(i).getVector3f().y

>.constr.constArrayCube.get(this.step).arrayListCube.get(i).y )

{.vecBox.get(i).setVector3f( Vector3f(.vecBox.get(i).getVector3f().x ,

(float)(this.vecBox.get(i).getVector3f().y-speed*tpf),.vecBox.get(i).getVector3f().z

)

);

}(this.vecBox.get(i).getVector3f().y

<.constr.constArrayCube.get(this.step).arrayListCube.get(i).y )

{.vecBox.get(i).setVector3f( Vector3f(.vecBox.get(i).getVector3f().x ,

(float)(this.vecBox.get(i).getVector3f().y+speed*tpf),.vecBox.get(i).getVector3f().z

)

);

}(this.vecBox.get(i).getVector3f().y

==.constr.constArrayCube.get(this.step).arrayListCube.get(i).y )

{ .moveCompliteY = true;

}(this.vecBox.get(i).getVector3f().z

>.constr.constArrayCube.get(this.step).arrayListCube.get(i).z )

{.vecBox.get(i).setVector3f( Vector3f(.vecBox.get(i).getVector3f().x ,.vecBox.get(i).getVector3f().y ,

(float)(this.vecBox.get(i).getVector3f().z +speed*tpf)

)

);

}(this.vecBox.get(i).getVector3f().z

<.constr.constArrayCube.get(this.step).arrayListCube.get(i).z )

{.vecBox.get(i).setVector3f( Vector3f(.vecBox.get(i).getVector3f().x ,.vecBox.get(i).getVector3f().y ,

(float)(this.vecBox.get(i).getVector3f().z +speed*tpf)

)

);

}(this.vecBox.get(i).getVector3f().z

==.constr.constArrayCube.get(this.step).arrayListCube.get(i).z )

{ .moveCompliteZ = true;

}

//проверкацвета(this.constr.constArrayCube.get(this.step).getColorByNum(i).("standart")){(this.vecBox.get(i).getColor()!=this.standart){.get(i).setColor(this.standart);

}

}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("select")){(this.vecBox.get(i).getColor()!=this.select){.get(i).setColor(this.select);

}

}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("minimal")){(this.vecBox.get(i).getColor()!=this.minimal){.get(i).setColor(this.minimal);

}

}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("moving")){(this.vecBox.get(i).getColor()!=this.moving){.get(i).setColor(this.moving);

}

}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("complete")){(this.vecBox.get(i).getColor()!=this.complete){.get(i).setColor(this.complete);

}

}

}

//Controller(this.controllerVec3f.x

>.constr.constArrayCube.get(this.step).locateController.x )

{.controllerVec3f = ( Vector3f(

(float)(this.controllerVec3f.x - speed*tpf) ,.controllerVec3f.y,.controllerVec3f.z

)

);

}(this.controllerVec3f.x

<.constr.constArrayCube.get(this.step).locateController.x )

{.controllerVec3f = ( Vector3f(

(float)(this.controllerVec3f.x + speed*tpf) ,.controllerVec3f.y,.controllerVec3f.z

)

);

}(this.controllerVec3f.y

>.constr.constArrayCube.get(this.step).locateController.y )

{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,

(float)(this.controllerVec3f.y-speed*tpf),.controllerVec3f.z

)

);

}(this.controllerVec3f.y

<.constr.constArrayCube.get(this.step).locateController.y )

{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,

(float)(this.controllerVec3f.y+speed*tpf),.controllerVec3f.z

)

);

}(this.controllerVec3f.z

<.constr.constArrayCube.get(this.step).locateController.z )

{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,.controllerVec3f.y,

(float)(this.controllerVec3f.z+speed*tpf)

)

);

}(this.controllerVec3f.z

>.constr.constArrayCube.get(this.step).locateController.z )

{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,.controllerVec3f.y,

(float)(this.controllerVec3f.z-speed*tpf)

)

);

}

}

}

@Overridevoid cleanup() {.cleanup();

//TODO: clean up what you initialized in the initialize method,

//e.g. remove all spatials from rootNode

//this is called on the OpenGL thread after the AppState has been detached.detachChild(localRootNode);.detachChild(localGuiNode);.app = null;.stateManager = null;

}void bind(Nifty nifty, Screen screen) {.nifty = nifty;.screen = screen;

}void onStartScreen() {

// throw new UnsupportedOperationException("Not supported yet.");

}void onEndScreen() {

//throw new UnsupportedOperationException("Not supported yet.");

}void Start(String nextScreen) {.gotoScreen(nextScreen); // switch to another screen

// start the game and do some more stuff...

}void Info(){

}void Option(){

}void Quit() {.stop();

}void Next(){(auto){.auto = false;

}(this.movingComplete == false){;

}(this.step < this.totalStep)

{.movingComplete = false;.step++;.getCurrentScreen().findNiftyControl("Label_Condition", TextField.class).setText(this.step+"/"+this.totalStep);

}else{ .getCurrentScreen().findNiftyControl("TextInfo", Label.class).setText("Can't go top maximal");

}

}void Prev(){(auto){.auto = false;

}(this.movingComplete == false){;

}(this.step > -1)

{.movingComplete = false;.step--;.moveCompliteX = false;.moveCompliteY = false;.moveCompliteZ = false; .getCurrentScreen().findNiftyControl("Label_Condition", TextField.class).setText(this.step+"/"+this.totalStep);

}else{.getCurrentScreen().findNiftyControl("TextInfo", Label.class).setText("Can't go below minimal");

}

}void Play(){.auto = true;

}void AddBox(){(this.moveCompliteX == false &&.moveCompliteY == false &&.moveCompliteZ == false){;

}(auto){.auto = false;

}valText = .getCurrentScreen().findNiftyControl("TextField_BoxValue", TextField.class).getRealText();.getScreen("hud").findElementById("TextField_BoxValue").getRenderer(TextRenderer.class).getOriginalText();f newLocation = Vector3f(this.vecBox.size()*(this.weightBox

+ this.betweenBox),0,-10);newBox = new MyBox(,

"Cube"+this.vecBox.size(),.parseInt(valText),,.standart

);.constr.addDefValue(Integer.parseInt(valText));.constr.addDefVector3f(newLocation);.constr.setConstraints();.totalStep = this.constr.constArrayCube.size();.vecBox.add(newBox);.rootNode.attachChild(newBox.getBox());.rootNode.attachChild(newBox.getValTextureGeom());

}void AddBoxRandom(){(this.moveCompliteX == false &&.moveCompliteY == false &&.moveCompliteZ == false){;

}(auto){.auto = false;

}val = this.random.nextInt(9);f newLocation = Vector3f(this.vecBox.size()*(this.weightBox

+ this.betweenBox),0,-10);newBox = new MyBox(,

"Cube"+this.vecBox.size(),,,.standart

);.constr.addDefValue(val);.constr.addDefVector3f(newLocation);.constr.setConstraints();.totalStep = this.constr.constArrayCube.size();.vecBox.add(newBox);.localRootNode.attachChild(newBox.getBox());.rootNode.attachChild(newBox.getValTextureGeom());

}String getPlayerName(){System.getProperty("user.name");

}void setTotalStep(int totStep){.totalStep = totStep;

}

}

Приложение Е

Разработанный XML документ, отвечающий за интерфейс программы.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ="http://nifty-gui.lessvoid.com/nifty-gui" :schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd ://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">

<useControls filename="nifty-default-controls.xml"/>

<useStyles filename="nifty-default-styles.xml"/>

<screen id="start" controller="mygame.GUI.MyStartScreen">

<layer id="background" childLayout="center" >

<image id="GImage0" filename="Interface/startBackground.png" ="100%" imageMode="normal" height="100%" />

</layer>

<layer id="foreground" childLayout="vertical" >

<panel id="panel_top" childLayout="center" ="75%" align="center" height="25%">

<text text=" Hello ${CALL.getPlayerName()}'s " ="Interface/Fonts/Default.fnt" width="100%" ="100%">

<effect>

<onStartScreen name="move" mode="in" ="top" length="300" ="0" inherit="true"/>

</effect>

</text>

</panel>

<panel id="panel_mid" childLayout="center" width="75%" ="center" valign="center" height="50%">

<text text="This visual instruction for sorting." ="Interface/Fonts/Default.fnt" width="50%" ="50%" />

</panel>

<panel id="panel_bottom" childLayout="horizontal" ="75%" align="center" valign="center" ="25%">

<panel id="panel_bottom_right" height="50%" ="25%" valign="center" childLayout="center">

<control name="button" id="Button_Start" = "Start" align="center" ="center" width="50%" height="35%" ="true">

<interact onClick="Start(choose)"/>

<effect>

<onClick name="playSound" sound="myclick"/>

</effect>

</control>

</panel>

<panel id="panel_bottom_mid1" height="50%" width="25%" ="center" childLayout="center">

<control name="button" id="Button_Option" = "Option" align="center" ="center" width="50%" height="35%" ="true">

<interact onClick="Option()"/>

</control>

<panel id="panel_bottom_mid2" height="50%" width="25%" ="center" childLayout="center">

<control name="button" id="Button_Info" = "Info"align="center" ="center" width="50%" height="35%" ="true">

<interact onClick="Info()"/>

</control>

</panel>

<panel id="panel_bottom_left" height="50%" width="25%"="center" childLayout="center">

<control name="button" id="Button_Quit" = "Quit"align="center" ="center" width="50%" height="35%" ="true">

<interact onClick="Quit()"/>

</control>

</panel>

</panel>

</layer>

</screen>

<screen id="hud" controller="mygame.GUI.MyStartScreen">

<layer id="background" childLayout="center">

<image id="GImage0" ="Interface/hudBackground.png" ="100%" imageMode="normal" height="100%" />

</layer>

<layer id="foreground" childLayout="horizontal" >

<panel id = "Panel_1" childLayout = "vertical" ="40%" align="center" height="100%">

<panel id = "Panel_1_1" childLayout = "vertical"="100%" align="center" height="70%">

<panel id = "Panel_1_1_1" childLayout = "horizontal" = "left" valign = "top"= "20%" height = "10%">

<control name="button" id="Button_BoxRandom" = "Random" width="100%" ="100%"visibleToMouse="true">

<interact onClick="AddBoxRandom()"/>

</control>

</panel>

</panel>

<panel id = "Panel_1_2" childLayout = "center" ="100%" height="30%" align="center" >

<control id = "TextInfo" name = "textfield" = "info" width="90%" height ="90%" = "true" visibleToMouse="true"/>

</panel>

</panel>

<panel id = "Panel_2" childLayout = "vertical" ="10%" align="center" height="100%">

<panel id = "Panel_2_1" childLayout = "vertical" ="100%" align="center" height="80%">

</panel>

<panel id = "Panel_2_2" childLayout = "vertical" ="100%" height="20%" align="center" >

<panel id = "Panel_2_2_1" childLayout = "center" ="60%" height="20%" align="center">

<text text="Edit value:" font="Interface/Fonts/Arial2.fnt" ="70%" height="80%" />

</panel>

<panel id = "Panel_2_2_2" childLayout = "center" ="60%" height="20%" align="center">

<control name="textfield" id="TextField_BoxValue"="70%" height="80%" visibleToMouse="true"/>

</panel >

<panel id = "Panel_2_2_3" childLayout = "center" ="60%" height="20%" align="center">

<control name="button" id="Button_BoxValue" = "Add" width="70%" ="80%"visibleToMouse="true">

<interact onClick="AddBox()"/>

</control>

</panel>

</panel>

</panel>

<panel id = "Panel_3" childLayout = "vertical" ="35%" align="center" height="100%">

<panel id = "Panel_3_1" childLayout = "vertical" ="100%" align="center" height="90%">

</panel>

<panel id = "Panel_3_2" childLayout = "horizontal" ="100%" height="10%" align="center" >

<panel id = "Panel_3_2_0" childLayout = "center" ="10%" height="80%" align="center" >

</panel>

<panel id = "Panel_3_2_1" childLayout = "center" ="25%" height="80%" align="center" >

<control name="button" id="Button_Prev" = "Prev" width="80%" ="80%" visibleToMouse="true">

<interact onClick="Prev()"/>

</control>

</panel>

<panel id = "Panel_3_2_2" childLayout = "center" ="25%" height="80%" align="center" >

<control name="button" id="Button_Play" = "Play" width="80%" ="80%" visibleToMouse="true">

<interact onClick="Play()"/>

</control>

</panel>

<panel id = "Panel_3_2_3" childLayout = "center" ="25%" height="80%" align="center" >

<control name="button" id="Button_Next" = "Next" width="80%" ="80%" visibleToMouse="true">

<interact onClick="Next()"/>

</control>

</panel>

</panel>

</panel>

<panel id = "Panel_4" childLayout = "vertical" ="15%" align="center" height="100%">

<panel id = "Panel_4_1" childLayout = "vertical" ="100%" align="center" height="10%">

<control name="label" id="Label_Condition" ="1/0" width="25%" height="80%" ="true">

</control>

</panel>

<panel id = "Panel_4_2" childLayout = "vertical" ="100%" height="90%" align="center" >

</panel>

</panel>

</layer>

</screen>

<screen id="choose" controller="mygame.GUI.MyStartScreen">

<layer id="background" childLayout="center" >

<image id="GImage0" ="Interface/startBackground.png" ="100%" imageMode="normal" height="100%" />

</layer>

<layer id="foreground" childLayout="vertical" >

<panel id="panel_top" childLayout="center" ="75%" align="center" height="25%">

<text text=" Choose what type sorting you want: " ="Interface/Fonts/Default.fnt" ="100%" height="100%">

<effect>

<onStartScreen name="move" mode="in" ="top" ="300" startDelay="0" ="true"/>

</effect>

</text>

</panel>

<panel id="panel_mid" childLayout="vertical" ="75%" align="center" ="center" height="50%">

<panel id="panel_mid_1" height="25%" ="50%" valign="center" ="center">

<control name="button" ="Button_BubleSort" = "Buble Sort" ="center" valign="center" ="50%" height="35%" ="true">

<interact onClick="Start(hud)"/>

<effect>

<onClick name="playSound" sound="myclick"/>

</effect>

</control>

</panel>

<panel id="panel_mid_2" height="25%" ="50%" valign="center" ="center">

<control name="button" ="Button_HoarSort" = "Hoar Sort" ="center" valign="center" ="50%" height="35%" ="true">

<effect>

<onClick name="playSound" ="myclick"/>

</effect>

</control>

</panel>

<panel id="panel_mid_3" height="25%" ="50%" valign="center" ="center">

<control name="button" ="Button_FastSort" = "Fast Sort" ="center" valign="center" ="50%" height="35%" ="true">

<effect>

<onClick name="playSound" ="myclick"/>

</effect>

</control>

</panel>

</panel>

</layer>

</screen>

</nifty>

Приложение Ж

Описание класса «ClassArrayOfCube».

Класс для хранения информации о элементах состояния сортировки. Имеет ряд членов:

)Переменная размер сортируемого массива.Используется для быстрого доступа внутри массива.

intsizeArray

) Массив из чисел, отвечающих за значение объекта в сортируемом массиве.

ArrayList<Integer>arrayListValue.

)Массив из чисел, отвечающих за координаты объекта в сортируемом массиве

ArrayList<Vector3f>arrayListCube.

)Массив из чисел, отвечающих за цвет объекта в сортируемом массиве

ArrayList<String>arrayListColor.

)Переменная строка, отвечающая за пояснение шага сортировки

StringtextInfo.

)Переменная - координата, состоящая из трех не целых чисел. Отвечает за координаты контроллера в этот шаг сортировки (Vector3flocateController).

Так же класс имеет ряд методов:

)        Метод - конструктор. Отвечает за построение состояния при передаче данных с отсутствием аргументов

ArrayOfCube()

)        Метод - конструктор. Отвечает за построение состояния при передаче данных с аргументами: 1) Массив координат; 2) Массив значений.

ArrayOfCube(ArrayList<Vector3f> newArray, ArrayList<Integer>)

3)      Метод - конструктор. Отвечает за построение состояния при передаче данных с аргументами: 1)Массив координат; 2) Массив значений; 3)Координаты контроллера.

ArrayOfCube(ArrayList<Vector3f> newArray, <Integer> newValues, f newLocationController)

4)      Метод - конструктор копирования. Отвечает за построение состояния при передаче данных с аргументом - указателем на другой объект аналогичный создаваемому.

ArrayOfCube(ArrayOfCubebase)

)        Метод для задания информации о шаге сортировки.

setTextInfo(Stringstr) Метод для получения информации о шаге сортировки.

getTextInfo()

)        Метод для задания координаты элемента по номеру.

setLocalByNum(int num, Vector3f newVec)

7)      Метод для получения координаты по номеру.

getLocalByNum(int num)

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

GetSize()

9)      Метод для добавления элемента в массив.

addToArray(Vector3f location, Integer value)

10)    Метод для получения значения объекта сортируемого массива по номеру.

getValueByNum(int num)

11)    Метод для получения цвета объекта сортируемого массива по номеру.

getColorByNum(int num)

12)    Метод для задания координат контроллера.

setControllerLocate(Vector3f newLocate)

13)    Метод для задания цвета элемента сортируемого массива по номеру.

setColorByNum(int num, String newColor)

14)    Метод для задания всем элементам массива стандартного цвета.

setDefColor()

15)    Метод для задания массивов с переданных аргументов.

setArray(ArrayList<Vector3f> newArray, ArrayList<Integer> newValues)

16)    Метод для задания массива координат объектов сортируемого массива.

setArrayVectors(ArrayList<Vector3f> newArray)

17)    Метод для задания значения объекта сортируемого массива по номеру этого объекта.

setValByNum(int num, int val)

Приложение З

Описание класса «ClassConstraintArray»

Класс для хранения набора состояний. Имеет ряд членов:

1)  Массив состояний .

constArrayCube;

)    Переменные, отвечающие за хранение размеров сортируемых объектов.

- Высота (heightObject).

Ширина (wightObject).

Расстояние между объектами (between).

) Переменная, отвечающая за хранение информации об окончании построения массива состояний.

notFinish.

4)    Переменная, отвечающая за хранение информации о номере предыдущего состояния при построении массива состояний.

prevConstraint.

)      Массив значений, хранящий начальные значения массива.

defArrayValue.

)      Массив координат, хранящий начальные координаты массива.

defArrayVector.

7)    Переменная, отвечающая за хранение начальной координаты контроллера.

defControllerLocation.

Так же существует ряд методов:

)        Метод - конструктор, отвечающий за создание экземпляра класса при передаче данных без аргументов. Задает стандартные значения.

ConstraintArray().

2)  Метод - конструктор, отвечающий за создание экземпляра класса при передаче данных с аргументами стандартных массивов координат, значений.

ConstraintArray(<Vector3f> defArray ,<Integer> defValue).

3)      Метод для добавления элемента стандартного значения координат в набор координат.

addDefVector3f(Vector3f newVec).

4)  Метод для добавления элемента в массив хранящихся стандартных значений сортируемого массива.

addDefValue(IntegernewVal).

5)  Метод для получения размера стандартного начального массива значений.

sizeVal().

6)      Метод для задания начальных массивов. setDefArrays (ArrayList<Vector3f> newVec, ArrayList<Integer> newVal).

7)      Метод для заданий высоты сортируемого объекта.

setHeight(float h).

)        Метод для получения значения высоты сортируемого объекта.

getHeight().

)        Метод для задания высоты сортируемого объекта.

setWight(floatw)

) Метод для получения значения ширины сортируемого объекта.

getWight().

) Метод для задания расстояния между сортируемыми объектами.

setBetween(floatb).

) Метод для получения значения расстояния между сортируемыми объектами заданном в этом объекте.

getBetween().

) Метод для задания координат начального положения контроллера.

setController(Vector3fnewControllerLocation).

) Метод для задания массива состояний. Является сердцем программы.

setConstraints()

) Метод, отвечающий за изменения связанные с перемещением элементов в массиве значений во время построения массива состояний.

mainChanging(int prevSort, Integer min, Integer numMin, Integer steadyState).

16) Метод, отвечающий за перенос контроллера за элемент с номером.

moveConrtoller(intprevSort).

) Метод, отвечающий за смещение объектов для освобождения места.

relaxLocation(int prevSort, Integer numMin).

18) Метод, отвечающий за действия подготовки к перемещению в начало.

backToBegin(IntegernumMin).

) Метод, отвечающий за добавление начального состояния в массив состояний.

addFirstState(Vector3fcontrollerLocation).

) Метод, отвечающий за присвоение минимального числа первому элементу из не отсортированной части массива.

setMinFirsOfNotSort(IntegernumMin).

) Метод, отвечающий за создание состояния в котором текущий элемент (тот который по номеру равен номеру цикла) становиться выбранным на проверку. Этот элемент становиться цвета «Select».

setSelectColor(int objnumi, Integer numMin).

) Метод, отвечающий за создание состояния в котором текущий элемент (тот, что с номером цикла) становиться минимальным.

setCurrentMin(int currentObject, Integer numMin).

23) Метод, отвечающий за перемещение объекта с номером в новые координаты которые передаются в аргументе.

setMoving(Integer numObject,Vector3f newLocetionObj).

Приложение И

Описание класса «ClassMain».

package mygame;com.jme3.app.SimpleApplication;com.jme3.font.BitmapFont;com.jme3.font.BitmapText;com.jme3.math.Vector3f;com.jme3.niftygui.NiftyJmeDisplay;com.jme3.renderer.RenderManager;de.lessvoid.nifty.Nifty;mygame.GUI.MyStartScreen;class Main extends SimpleApplication {MyStartScreen myMainMenuController;static void main(String[] args) {app = new Main();.start();

}

@Overridevoid simpleInitApp() {(false);(false);.setMoveSpeed(10f);.setDragToRotate(true);.setCursorVisible(true);= new MyStartScreen(this, this.settings);.attach(myMainMenuController);niftyDisplay = new NiftyJmeDisplay(assetManager,, audioRenderer, guiViewPort);nifty = niftyDisplay.getNifty();.addProcessor(niftyDisplay);.fromXml("Interface/StartScreen.xml",

"start", myMainMenuController);

//nifty.setDebugOptionPanelColors(true);.setDragToRotate(true);.getApplication().getCamera().(new Vector3f(10,1,20));

}

@Override

public void simpleUpdate(float tpf) {}

@Overridevoid simpleRender(RenderManager rm) {}

}

Похожие работы на - Разработка трехмерного визуализатора алгоритмов

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!