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

 

Введение


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

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

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

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

Батиметрическая сетка необходима для расчёта периодов Сейш и тягуна: длинноволновых колебаний в бухтах и заливах. Данная работа производится обеспечения безопасности судохождения в портах.

Глобальное исследование глубин океанского дна позволяет сформировать полное представление о рельефе земли.

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

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

Импорт батиметрическиз данных из исходных треков, получаемых с картплоттера-эхолота, береговых линий из GPS-навигатора а также загрузка сторонних искусственно созданных данных.

Совмещение, компоновка и редактирование данных, исправление ошибок.

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

Построение и импорт батиметрических карт.

Построение карт сравнения динамики рельефа.

Экспорт данных в различные форматы.

Создаваемое программное обеспечение опирается на анализ предметной области по методике объектно-ориентированного подхода с использованием рационального унифицированного процесса, предложенного авторами языка UML - американской фирмой Rational [6]. На основе результатов анализа должен быть разработан проект программного обеспечения для компьютеризации перечисленных выше функций обработки батиметрических данных.

Итоговый требуемый результат выполнения работы программный косплекс для автоматизации обработки и визуализации батиметрических данных. Спецификация разделов работы дана в таблице 1.

Таблица 1 - Спецификация разделов работы

ОбозначениеНаименованиеПриме-чание4217.02067988.09 - 2599 12Текст программы4217.02067988.09 - 2599 13Описание программы4217.02067988.09 - 2599 33Руководство программиста4217.02067988.09 - 2599 34Руководство оператора4217.02067988.09 - 2599 51Программа и методика испытаний4217.02067988.09 - 2599 90Техническое задание4217.02067988.09 - 2599 92Организационно - экономическая часть1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ


.1. Общие сведения


.1.1 Полное наименование программного обеспечения и его условное обозначение


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

Условное обозначение - ПО «СОКО».


1.1.2 Шифр темы

Шифр темы - код 4217.02067988.09 - 2599, «Дипломная работа».


1.1.3 Сведения о разработчике и заказчике

Разработчик - студент группы ВТ-51 ГОУВПО «КнАГТУ» Филипп Андреевич Плеханов.

Заказчик - ИМГИГ ДВО РАН, лаборатория Волновой динамики и прибрежных течений, в лице заведующего лабораторией Петра Дмитриевича Ковалёва.

программа модуль сообщение эксплуатация

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

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

задание на дипломное проектирование;

техническое задание;

календарный план-график выполнения этапов работы (см. п. 1.5 данного технического задания).

1.1.5 Плановые сроки начала и окончания работы по созданию программного обеспечения

Плановый срок начала работ: 20 февраля 2012 г.

Плановый срок окончания работ: 10 июня 2012 г.


1.1.6 Сведения об источниках и порядке финансирования работ

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


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

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

После подписания технического задания создается рабочий вариант программного обеспечения.

Работа осуществляется в соответствии с графиком (см. п. 1.5 данного технического задания). По окончании работ программное обеспечение тестируется и передается заказчику для эксплуатации.

Также заказчику передается комплект технической документации, оформленный в соответствии с ГОСТ 34.201 и ЕСПД.


1.2. Назначение и цели создания программного обеспечения


.2.1 Назначение программного обеспечения

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


1.2.2 Цели создания программного обеспечения

Целями разрабатываемой системы являются:

Ускорение, упрощение и автоматизация чтения и подготовки исходных данных из различных форматов.

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

Быстрое построение батиметрической карты в процессе её съемки на основе имеющихся данных

Экспорт данных в различные графические, текстовые и двоичные форматы.


.3. Характеристики предметной области


.3.1 Краткие сведения о предметной области

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

Проектируемое программное обеспечение используется для автоматизации следующих объектов:

процесс подготовки батиметрических данных, выбора необходимых треков, исправления ошибок, сведения в единое целое;

процесс построения батиметрических карт в различных вариантах;

процесс получения результатов в графическом, анимированном, текстовом или бинарном формате;

Форматы выходных данных определяются стандартами фирм-производителей оборудования, такими как Garmin и Lowrance, а форматы исходных определяются стандартами на батиметрические карты, принятыми в РАН, а также форматами входных данных других программных комплексов, предназначенных для обработки батиметрических данных, таких как ANI. К основным данным предметной области относятся батиметрические треки, треки-пути, полученные с помощью GPS-навигатора, коэффициенты приливных гармоники и гармоник сезонных изменений уровня моря исследуемых областей.

Структура деятельности процессов обработки батиметрических данных изображена на диаграммах объектно-ориентированной модели данной предметной области, выполненных в нотации языка UML (см. приложение 1, рисунки 1.1-1.5) [2,6,9].


1.3.2 Сведения об условиях эксплуатации объекта автоматизации характеристик окружающей среды

Разрабатываемая система предназначена для использования на персональных IBM-совместимых компьютерах с центральным Intel-совместимом процессором с частотой работы не менее 1ГГц, оперативным запоминающим устройством объёмом не менее 512 Мб, свободным дисковым пространством не менее 25 Мб для хранения программного обеспечения и произвольным, но желательно не менее 500 мб объёмом для хранения промежуточных результатов работы. Обязательным условием является наличие манипулятора типа «мышь», SVGA-адаптера, совместимого со стандартом OpenGL, и монитора с разрешением не менее 1024х768 [7].


1.4. Требования к программному обеспечению


.4.1 Требования к программному обеспечению в целом

Требования к структуре и функционированию программного обеспечения

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

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

К основным входным данным создаваемой системы можно отнести следующие:

батиметрические треки, получаемые посредством съёмки с помощью картплоттера-эхолота;

береговые треки, получаемые с помощью GPS-навигатора;

название региона и его координаты для определения уровня прилива и сезонных изменений уровня моря;

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

Выходными данными разрабатываемой системы являются:

батиметрические карты и карты разницы для выбранных участков в чёрно-белом и цветом варианте;

изображения трёхмерных срезов батиметрических данных, показанные с определённого ракурса;

видео-файлы, представляющие собой съёмку трёхмерной батиметрической карты с различных ракурсов;

батиметрические треки и сетки, готовые для отображения в программе Google Earth;

батиметрические сетки в формате.inf для обработки в программном комплексе ANI.

Требования к численности и квалификации персонала

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

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

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

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

Требования к эргономике и технической эстетике

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

Требования к эксплуатации и техническому обслуживанию

Условия и режим эксплуатации ПО определяются условиями эксплуатации использующихся технических средств. Техническое обслуживание ПО не требуется.

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

Требования к защите информации от несанкционированного доступа

Защита информации от несанкционированного доступа не предусмотрена.

Требования по сохранности информации при авариях

Сохранность данных при авариях не гарантируется в случае непредвиденного прерывания работы программы.

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

Требования к защите от влияния внешних воздействий

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

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

Требования к стандартизации и унификации

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

1.4.2 Требования к функциям, выполняемым системой

Разрабатываемое приложение должно обеспечивать выполнение следующих основных функций:

Импорт батиметрическиз данных из исходных треков, получаемых с картплоттера-эхолота, береговых линий из GPS-навигатора а также загрузка сторонних искусственно созданных данных.

Совмещение, компоновка и редактирование данных, исправление ошибок.

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

Построение и импорт батиметрических карт.

Построение карт сравнения динамики рельефа.

Экспорт данных в различные форматы.


1.4.3 Требования к видам обеспечения

Требования к математическому обеспечению

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

Требования к информационному обеспечению

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

Требования к лингвистическому обеспечению

Программное обеспечение и интерфейс пользователя в среде разработки приложений Borland C++ Builder 6 [11, 12]. В своей работе программное обеспечение не требует установки никаких сторонних библиотек, отсутствующих в стандарте Microsoft Windows.

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

Требования к программному обеспечению

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

операционная система Microsoft Windows версии не ниже 98;

редактор диаграмм и блок-схем Microsoft Visio;

среда разработки приложений Borland C++ Builder 6;Components - набор визуальных компонентов для Delphi / C++Builder версии не ниже 4.3.2;

приложение для предвычисления приливов wxtide версии не ниже 4.7;

Требования к техническому обеспечению

Для создания данного программного обеспечения необходимы:

персональный компьютер совместимый с IBM PC с тактовой частотой процессора не ниже 1000 МГц, оперативная память 1024 Мб и более;

накопитель данных со свободным объёмом не менее 3 Гб;

видеокарта и монитор, поддерживающие разрешение 1024*768 точек и выше, с частотой обновления не менее 60 Гц, а также поддерживающие стандарт OpenGL;

устройства ввода клавиатура и манипулятор «мышь» (стандартные);

1.5 Состав и содержание работ по созданию программного обеспечения


Этапы выполнения работ по созданию «Регистрация компьютерной техники» приведены в таблице 1.1.


Таблица 1.1 - Этапы выполнения работ

ЭтапДата началаСрок окончанияМинимальныйМаксимальныйРазработка и утверждение технического задания09.02.1218.02.1223.02.12Проектирование системы21.02.1211.03.1214.03.12Программная реализация 14.03.1221.04.1225.04.12Оформление технической документации (Техническое задание)25.04.1202.05.1203.05.12Оформление технической документации (Описание программы)03.05.1207.05.1208.05.12Оформление технической документации (Теоретическое описание)08.05.1210.05.1211.05.12Оформление технической документации (Текст программы)11.05.1213.05.1214.05.12Оформление технической документации (Руководство программиста)14.05.1216.05.1217.05.12Оформление технической документации (Руководство пользователя)17.05.1221.05.1222.05.12Оформление технической документации (Программа и методика испытаний)22.05.1224.05.1225.05.12Оформление технической документации (Организационно-экономическая часть)27.05.1228.05.1210.06.12

1.6 Порядок контроля и приемки программного обеспечения


При приёмке системы проводится её тестирование. Порядок и методики тестирования определяются в соответствии с ГОСТ 34.301-89. После завершения тестов и исправления недоработок система сдаётся в опытную эксплуатацию программы.


1.7 Требования к документации


Пояснительная записка оформляется в соответствии с ГОСТ 19.106-78 от 01.01.80 «Требования к программным документам, выполненным печатным способом», ГОСТ 19.101-77 от 01.01.80 «Виды программ и программных документов», ГОСТ 2.301-68 от 01.01.71 «Форматы ЕСКД», ЕСПД ГОСТ 19.001-77 от 1.01.80.

2. ОПИСАНИЕ ПРОГРАММЫ


.1 Описание программы в целом


.1.1 Общие сведения

Модель предметной области, использованная для разработки программного обеспечения в нотации UML дана в приложении (см. приложение 1, рисунок 1.1 - 1.5). Схемы выполнения основных функций программы приведены в приложении 1 на рисунках 1.6 - 1.9.

Разработанный программный продукт называется «СОКО». Система функционирует в операционных системах Microsoft Windows любых версий, начиная с Windows 98.

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

Программное обеспечение создано в среде разработки приложений Borland C++ Builder 6 на языке программирования C++. Для исполнения двоичных модулей программного обеспечения не требуется установки дополнительных библиотек.

Главный исполняемый двоичный файл называется Soko.exe.


2.1.2 Функциональное назначение

Созданная система реализует следующие основные функции:

Импорт батиметрическиз данных из исходных треков, получаемых с картплоттера-эхолота;

Импорт береговых линий из GPS-навигатора;

Импорт данных, искусственно созданных с помощью приложения Google Maps;

Наглядное совмещение, компоновка и редактирование данных, исправление ошибок;

Подготовка данных к отображению и обработке: вычитание высоты прилива и сезонных колебаний уровня моря;

Выбор необходимого участка для расчёта посредством введения географических координат прямоугольника, либо в графическом режиме;

Настройка параметров отображения будущей карты: коэффициента пропорциональности высоты, частоты изолиний и других;

Построение и батиметрических карт;

Построение карт сравнения динамики рельефа;

Сохранение готовых карт в виде изображений любого размера;

Создание видеоролика, отображающего карту с различных ракурсов путём последовательной установки камеры с различных позиций;

Экспорт данных в различные форматы;

Сохранение текущего состояния системы для дальнейшей обработки.


2.1.3 Описание логической структуры

Программа включает в себя 74 файла кода на языке программирования C++ (модулей) и 35 форм рабочих окон и вспомогательных диалоговых окон.

Перечень модулей и их назначение указаны далее в таблице 2.1.


Таблица 2.1 - Перечень модулей проекта

Название модуляНазначение модуляsoko.cppВходная точка программного приложения, содержит функцию main и запускает главный исполняемый поток.soko_code.cpp soko_code.h soko_code.dfmОсновной модуль класса окна, сожержит основные методы, управляющие интерфейсом приложения и связывающие его с другими объектами. Также ссылки на остальные модули.cursor.cpp cursor.h Класс курсора. Сожержит методы получения координат курсора на экране, преобразования их в проекцию OpenGL и обратно.camera.cpp camera.h Класс камеры. Содержит методы упрощённого управления камерой в проекции OpenGL.3dcontrol.cpp 3dcontrol.h Класс управления сценой, наследник классов камеры и курсора, управлять просмотром трёхмерного изображения с помощью мыши: вращать, перемещать, масштабировать.camerasequence.cpp camerasequence.hКласс-массив камер, является наследником класса камеры, применяется для создания видеороликов.chizu.cpp chizu.hОсновной класс для расчёта батиметрии. Содержит все функции обработки и анализа данных.averagelevel.cpp averagelevel.hКласс, применяемый для расчёта сезонных изменений уровня моря.dinmas.cpp dinmas.hМодуль, сожержащий различные варианты динамических массивов: одномерный, двумерный, трёхмерный, одномерный с двойной адресацией и древовидную структуру. Применяется как контейнер для большинства массивов проекта.doubletable.cpp doubletableКласс, позволяющий читать ascii-файл, представляющий собой таблицу из чисел, разделённых табуляцией и создающий на выходе двумерный массив. Применяется для чтения исходных данных.geometry.cpp geometry.hМодуль, содержащий функции, решающий некоторые геометрические задачи, связанные с триангуляцией.glWindow.cpp glWindow.hКласс API-окна, реализующего вывод OpenGL-графики.lamp.cpp lamp.hКласс, упрощяющий работу с освещением в OpenGL.lotexture.cpp lotexture.hКласс, предназначенный для чтения и записи файлов в формате TGA. Применяется как в качестве контейнера текстуры батиметрической карты, так и для сохранения изображений и видео.material.cpp material.hКласс, упрощающий работу с материалами в OpelGL.mathadv.cpp mathadv.hМодуль, содержащий некоторые дополнительные математические функции.merkator.cpp merkator.hМодуль, содержащий фунцции преобразования географических координат в координаты Меркатора и обратно.point3d.cpp point3d.hКласс, представляющий собой трёхмерную точку. Сожержит некоторые методы обработки.rastrfont.cpp rastrfont.hКласс, упрощающий работу с выводом текста в среде OpenGL.

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

2.1.4 Используемые технические средства

Техническое обеспечение для разработчика:

Персональный компьютер совместимый с IBM PC, тактовой частотой процессора не ниже 1000 МГц с объёмом оперативной памяти 1024 Мб и более, свободным дисковое пространством не менее 50 Мб, видеокартой и монитором, поддерживающие разрешение 1024х768 точек (или выше) и частотой обновления не менее 60 Гц, оборудованный стандартными устройствами ввода и вывода (клавиатура, мышь).


.1.5 Используемые программные средства

Программное обеспечение для разработчика программной системы:

операционная система - Microsoft Windows 98 или более поздняя;

редактор диаграмм и блок-схем Microsoft Visio;

интегрированная среда разработки программных приложений Borland C++ Builder 6;

приложение для предрасчёта приливов wxtide версии 4,7 или выше;

консольное приложение для расчёта триангуляции qdelaunay из группы библиотек Qhull;

консольное приложение Slg2Txt для преобразования бинарных файлов формата slg в текстовый формат, предоставленной фирмой-производителем картплоттеров-эхолотов Lowrance;

консольное приложение tga2avi для преобразования последовательности изображений tga в видеоряд avi.


2.1.6 Вызов и загрузка

Вызов и загрузка программного обеспечения осуществляется запуском исполняемого файла soko.exe. Исполняемый файл должен находится в одной папке с представленными выше консольными приложениями.

2.1.7 Входные данные

Входными данными приложения являются:

) батиметрические треки, получаемые посредством съёмки с помощью картплоттера-эхолота;

) береговые треки, получаемые с помощью GPS-навигатора;

) название региона и его координаты для определения уровня прилива и сезонных изменений уровня моря;

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


2.1.8 Выходные данные

Выходными приложения являются:

) батиметрические карты и карты разницы для выбранных участков в чёрно-белом и цветом варианте;

) изображения трёхмерных срезов батиметрических данных, показанные с определённого ракурса;

) видео-файлы, представляющие собой съёмку трёхмерной батимет-рической карты с различных ракурсов;

) батиметрические треки и сетки, готовые для отображения в про-грамме Google Earth;

) батиметрические сетки в формате.inf для обработки в программном комплексе ANI.

3. ТЕКСТ ПРОГРАММЫ


.1 Модуль soko.cpp


/******************************************************

Автор: Плеханов Ф. А.

Назначение: Входная точка программного приложения, содержит функцию WinMain

и запускает главный исполняемый поток.

*******************************************************/

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------("soko_code.cpp", BathWin);

//---------------------------------------------------------------------------namespace std;

//Аргументы командной строки

extern AnsiString args;WinMain(HINSTANCE, HINSTANCE, LPSTR Args, int)

{=Args;

{>Initialize();>CreateForm(__classid(TBathWin), &BathWin);>Run();

}(Exception &exception)

{>ShowException(&exception);

}(...)

{

{Exception("");

}(Exception &exception)

{>ShowException(&exception);

}

}0;

}

//---------------------------------------------------------------------------


3.2 Модуль dinmas.cpp (выборочно)


/******************************************************

Автор: Плеханов Ф.А.

Назначение: Модуль контейнерных классов

Входные данные: размер контейнера

Выходные данные: готовый к использванию динамический массив

*******************************************************/

#ifndef DINMAS_CPP

#define DINMAS_CPP

#include <vcl>

#include <fstream>

#include <ComCtrls.hpp>

#define SIZETYPE long

//Обычный одномерный динамический массив

export template<typename type>dinmas

{: public:* data;:siz;();(SIZETYPE);

~dinmas();make(SIZETYPE);clear();& operator[](SIZETYPE);bytes();insert(type &, int);erase(int);(type &);();& top();SaveToFile(AnsiString);LoadFromFile(AnsiString);& size();

#ifndef NOCOPY=(dinmas<type> &);

#endif

};

//Обычный двумерный динамический массив<typename type>

class dinmas2d

{:** data;n,m;exists;d();d(SIZETYPE, SIZETYPE);

~dinmas2d();make(SIZETYPE, SIZETYPE);clear();* operator[](SIZETYPE);bytes();

#ifndef NOCOPY=(dinmas2d<type> &);

#endif

};

//Одномерный динамический массив с двойной адресацией, может содержать в себе

//другие динамические массивы<typename type>

class smartcont

{:** graphs;_size;selected;:(int);();(int n);&size();clear();& operator[](int);& operator()();

~smartcont();(type &value);();copy();erase(int);erase();select(int);SelectedItem();MoveUp();MoveDown();

};namespace std;<typename type>dinmas<type>::dinmas()

{=0;

}<typename type>dinmas<type>::dinmas(SIZETYPE Size)

{(2500,100);=0;(Size);

}<typename type>dinmas<type>::~dinmas()

{();

}<typename type> bool dinmas<type>::make(SIZETYPE Size)

{(siz>0) clear();=Size;=new type[siz];1;

}<typename type> void dinmas<type>::clear()

{(siz<=0) return;[] data;=0;

}<typename type> type& dinmas<type>::operator[](SIZETYPE i)

{data[i];

}<typename type> int dinmas<type>::bytes()

{siz*sizeof(type);

}<typename type> void dinmas<type>::insert(type &variable, int position)

{(siz==0)

{(1);[0]=variable;;

}(position<0) position=0;(position>siz) position=siz;*buff1, *buff2;=new type[position];(int i=0;i<position;i++)

{[i]=data[i];

}=new type[siz-position];(int i=0;i<siz-position;i++)

{[i]=data[position+i];

}++;(siz);(int i=0;i<position;i++)

{[i]=buff1[i];

}[position]=variable;(int i=0;i<siz-1-position;i++)

{[position+1+i]=buff2[i];

}[] buff1;[] buff2;

}<typename type> void dinmas<type>::erase(int position)

{(position<0) position=0;(position>siz-1) position=siz-1;(siz==0) return;*buff1, *buff2;=new type[position];(int i=0;i<position;i++)

{[i]=data[i];

}=new type[siz-position-1];(int i=0;i<siz-position-1;i++)

{[i]=data[position+1+i];

}-;(siz);(int i=0;i<position;i++)

{[i]=buff1[i];

}(int i=0;i<siz-position;i++)

{[position+i]=buff2[i];

}[] buff1;[] buff2;

}<typename type> dinmas<type>::push(type &variable)

{(variable, 0);

}<typename type> dinmas<type>::pop()

{(0);

}<typename type> type& dinmas<type>::top()

{data[0];

}<typename type> bool dinmas<type>::SaveToFile(AnsiString FileName)

{file(FileName.c_str(), ios::binary);.write((char*)&siz,sizeof(siz));(int i=0;i<siz;i++)

{.write((char*)&data[i],sizeof(type));

}.close();1;

}<typename type> bool dinmas<type>::LoadFromFile(AnsiString FileName)

{file(FileName.c_str(), ios::binary);.read((char*)&siz,sizeof(siz));(siz);(int i=0;i<siz;i++)

{.read((char*)&data[i],sizeof(type));

}.close();1;

}<typename type> SIZETYPE& dinmas<type>::size()

{siz;

}

#ifndef NOCOPY<typename type> dinmas<type>::operator=(dinmas<type> &object)

{

if(object.size()>0)

{(object.size());(int i=0;i<size();i++)

{[i]=object.data[i];

}

}

}

#endif<typename type> dinmas2d<type>::dinmas2d()

{=0;=m=0;

}<typename type> dinmas2d<type>::dinmas2d(SIZETYPE N, SIZETYPE M)

{=0;=m=0;(N,M);

}<typename type> dinmas2d<type>::~dinmas2d()

{();

}<typename type> bool dinmas2d<type>::make(SIZETYPE N, SIZETYPE M)

{(N==0 || M==0) return 0;();=N; m=M;=new type*[n];(int i=0;i<n;i++)

{[i]=new type[m];

}=1;1;

}<typename type> void dinmas2d<type>::clear()

{(!exists) return;(int i=0;i<n;i++)

{data[i];

}[] data;=0;

}<typename type> type* dinmas2d<type>::operator[](SIZETYPE i)

{data[i];

}<typename type> int bytes()

{n*m*sizeof(type);

}

#ifndef NOCOPY<typename type> dinmas2d<type>::operator=(dinmas2d<type> &object)

{(object.exists)

{(object.n,object.m);(int i=0;i<n;i++)

{(int j=0;j<m;j++)

{[i][j]=object.data[i][j];

}

}=1;

}

}

#endif<typename type> smartcont<type>::smartcont(int n)

{

_size=selected=0;(n);

}<typename type> smartcont<type>::smartcont()

{

_size=selected=0;

make(0);

}<typename type> smartcont<type>::make(int n)

{(_size>0) clear();

_size=n;(_size!=0)

{= new type*[n];(int i=0;i<n;i++)

{[i] = new type[1];

}

}

}<typename type> int & smartcont<type>::size()

{_size;

}<typename type> void smartcont<type>::clear()

{(_size<=0) return;(int i=0;i<_size;i++)

{[] graphs[i];

}[] graphs;

_size=0;

}<typename type> type& smartcont<type>::operator[](int n)

{(_size>0 && n<_size)*graphs[n];

{(NULL,"Ошибка массива","Ошибка",MB_OK|MB_ICONERROR);

}

}<typename type> type& smartcont<type>::operator()()

{(_size>0 && selected<_size)*graphs[selected];

{(NULL,"Ошибка массива","Ошибка",MB_OK|MB_ICONERROR);

}

}<typename type> smartcont<type>::~smartcont()

{

clear();

}<typename type> smartcont<type>::insert(type &value)

{();[selected]=value;

}<typename type> smartcont<type>::insert()

{(_size!=0)

{++;** buff;= new type*[_size];(int i=0;i<_size;i++)

{[i]=graphs[i];

}

_size++;= new type*[_size];(int i=0;i<selected;i++)

{[i]=buff[i];

}[selected] = new type[1];(int i=selected+1;i<_size;i++)

{[i]=buff[i-1];

}[] buff;(selected);

}

{(1);=0;(selected);

}

}<typename type> void smartcont<type>::copy()

{();

*graphs[selected]=*graphs[selected-1];(selected);

}<typename type> void smartcont<type>::erase(int n)

{buff=selected;(n);();(selected);

}<typename type> void smartcont<type>::erase()

{(_size==0) return;[] graphs[selected];** buff;= new type*[_size];(int i=0;i<_size;i++)

{[i]=graphs[i];

}

_size--;= new type*[_size];(int i=0;i<selected;i++)

{[i]=buff[i];

}(int i=selected;i<_size;i++)

{[i]=buff[i+1];

}[] buff;(selected>0)(selected-1);

}<typename type> bool smartcont<type>::select(int item)

{(_size==0) return 0;=item;1;

}<typename type> int smartcont<type>::SelectedItem()

{selected;

}<typename type> void smartcont<type>::MoveUp()

{(selected<1) return;* buff;=graphs[selected-1];[selected-1]=graphs[selected];[selected]=buff;-;

}<typename type> void smartcont<type>::MoveDown()

{(selected>_size-1) return;* buff;=graphs[selected+1];[selected+1]=graphs[selected];[selected]=buff;++;

}

#endif


3.3 Модуль lotexture


/******************************************************

Автор: Плеханов Ф.А.

Назначение: Класс для чтения файлов изображений в формате TGA и преобразования

в готовые для использования в среде OpenGL текстуры, также позволяет сохранять

изображения в формате TGA.

Входные данные: файл TGA, настройки чтения

Выходные данные: ID текстуры в OpenGL

*******************************************************/


3.3.1 Заголовочный файл lotexture.h

#ifndef LOTEXTURE_H

#define LOTEXTURE_H

#include <vcl.h>

#include <windowsx.h>

#include <winuser.h>

#include <gl>

#include <glu>

#include "mathadv.h"

#include "dinmas.cpp"

#define LT_IGNORE_ERROR 1namespace std;

#pragma pack (push, 1)

//Заголовок TGA-файла

struct TgaHeader

{idLength;colormapType;imageType;__int16 colormapIndex;__int16 colormapLength;colormapEntrySize;__int16 xOrigin;__int16 yOrigin;__int16 width;__int16 height;pixelSize;imageDesc;

};

#pragma pack (pop)

//Структуры точнек в формате TGARGBApixel

{

GLubyte r,g,b,a;(GLubyte, GLubyte, GLubyte, GLubyte);();GetPixel(GLubyte &, GLubyte &, GLubyte &, GLubyte &);ToBGRA();

};RGBpixel

{r,g,b;(GLubyte, GLubyte, GLubyte);();GetPixel(GLubyte &, GLubyte &, GLubyte &);ToBGR();ToBGRA();

};

//Основной класс текстуры

class texture

{:exsist; //суествует

bool binded; //уже применяется

int width; //ширина

int height; //высотаRealWidth; //ширина, приближённая к степени двойкиRealHeight; //высота, приближённая к степени двойкиPixelsQnt; //количество точекID; //идентификационный номер текстуры в OpelGL

float hcoeff; //отношение height к RealHeightwcoeff; //отношение width к RealWidth:

//поля

dinmas<RGBApixel> imageData; //массив точек

//методы

//исправление целочисленного цвета,

//если он выходит из диапазона 0-255

GLubyte correct(float);

//копировать текстуру

void operator=(texture &);

//задать одну точку целыми числами

void SetPixel(int, int, GLubyte, GLubyte, GLubyte, GLubyte);

//задать одну точку числами с плавающей точкой

void SetPixelf(int, int, float, float, float, float);

//получить одну точку

void GetPixel(int, int, GLubyte &, GLubyte &, GLubyte &, GLubyte &);

texture(); //конструктор

//выделение памяти c проверкой на степень двойкиMakeArray(int, int);

//выделение памяти в обход проверки на степень двойки

bool MakeArraySimple(unsigned int, unsigned int);

//применение текстуры

bool BindTexture(unsigned int, bool, bool);

//сохранение в TGASaveToTGA(AnsiString);

//чтение из TGALoadFromTGA(AnsiString, unsigned int, bool, bool);

~texture(); //деструкторDeleteArray(); //очистить массив

void UnBind(); //отменить текстуру

//Методы получения величин

unsigned int GetWidth();int GetHeight();int GetRealWidth();int GetRealHeight();int GetPixelsQnt();int GetID();GetExsist();GetBinded();GetWCoeff();GetHCoeff();GetWCoeffF();GetHCoeffF();

//Методы установки величин

void PutWidth(unsigned int);PutHeight(unsigned int);PutRealWidth(unsigned int);PutRealHeight(unsigned int);PutPixelsQnt(unsigned int);PutID(unsigned int);PutExsist(bool);PutBinded(bool);PutWCoeff(float);PutHCoeff(float);

};

#endif


3.3.2 Реализация lotexture.cpp

#ifndef LOTEXTURE_CPP

#define LOTEXTURE_CPP

#include "lotexture.h"namespace std;::RGBApixel(GLubyte R, GLubyte G, GLubyte B, GLubyte A)

{

r=R; g=G; b=B; a=A;

}::RGBApixel()

{=0; g=0; b=0; a=255;

}RGBApixel::GetPixel(GLubyte &R, GLubyte &G, GLubyte &B, GLubyte &A)

{=r; G=g; B=b; A=a;

}RGBApixel::ToBGRA()

{RGBApixel(b,g,r,a);

}::RGBpixel(GLubyte R, GLubyte G, GLubyte B)

{=R; g=G; b=B;

}::RGBpixel()

{=0; g=0; b=0;

}RGBpixel::GetPixel(GLubyte &R, GLubyte &G, GLubyte &B)

{=r; G=g; B=b;

}RGBpixel::ToBGR()

{RGBpixel(b,g,r);

}RGBpixel::ToBGRA()

{RGBApixel(b,g,r,255);

}texture::correct(float x)

{(x<=0) return 0;(x>=1) return 255;floor(255*x);

}texture::operator=(texture &object)

{=object.exsist;

}texture::SetPixel(int Col, int Row, GLubyte r, GLubyte g, GLubyte b, GLubyte a)

{i=Row*RealWidth+Col;(i<PixelsQnt) imageData[i]=RGBApixel(r,g,b,a);

}texture::SetPixelf(int Col, int Row, float r, float g, float b, float a)

{i=Row*RealWidth+Col;(i<PixelsQnt) imageData[i]=RGBApixel(correct(r),correct(g),correct(b),correct(a));

}texture::GetPixel(int Col, int Row, GLubyte &r, GLubyte &g, GLubyte &b, GLubyte &a)

{i=Row*RealWidth+Col;(i<PixelsQnt)

{[i].GetPixel(r,g,b,a);

}

}::texture()

{=0; binded=0;

}texture::MakeArray(int w, int h)

{(w==0 || h==0) return 0;=w; height=h;

#ifdef LT_IGNORE_ERROR

{=NearestPow2(w);=NearestPow2(h);=1-1.*(RealWidth -width )/RealWidth ;=1-1.*(RealHeight-height)/RealHeight;

}

#else

{=width;=height;=wcoeff=1;

}

#endif=RealWidth*RealHeight;(imageData.make(PixelsQnt))

{=1;1;

}

{("Ошибка");0;

}

}texture::MakeArraySimple(unsigned int w, unsigned int h)

{(w==0 || h==0) return 0;=w; height=h;=width;=height;=wcoeff=1;=RealWidth*RealHeight;(imageData.make(PixelsQnt))

{=1;1;

}

{("Ошибка");0;

}

}texture::BindTexture(unsigned int TexID, bool Interpolation, bool Multiply)

{(!exsist) return 0;=TexID;(GL_TEXTURE_2D, TexID);(Interpolation)

{(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

}

{(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

}(Multiply)

{(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);

}

{(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP);(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP);

}D(GL_TEXTURE_2D, 0, GL_RGBA, RealWidth, RealHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData.data);=1;1;

}texture::SaveToTGA(AnsiString fileName)

{(!exsist) return 0;hdr;( &hdr, '\0', sizeof ( hdr ) );.imageType = 2; // unencoded image.width = width;.height = height;.pixelSize = 32;*pFile;=fopen(fileName.c_str(), "wb");(&hdr, sizeof(hdr),1,pFile);WritedPxlQnt=width*height;*temp = new RGBApixel[WritedPxlQnt];i=0;(int row=0;row<height;row++)

{(int col=0;col<width;col++)

{[i]=imageData[row*RealWidth+col].ToBGRA();++;

}

}(temp, WritedPxlQnt*4, 1, pFile);(pFile);( temp );1;

}texture::LoadFromTGA(AnsiString fileName, unsigned int TexID, bool Interpolation, bool Multiply)

{hdr;*pFile;=fopen(fileName.c_str(), "rb");(pFile==NULL) return 0;(&hdr, sizeof(hdr),1,pFile);(!(hdr.pixelSize==32 || hdr.pixelSize==24) || hdr.imageType!=2) return 0;(hdr.width,hdr.height);ReadPxlQnt=hdr.width*hdr.height;(hdr.pixelSize==32)

{*temp = new RGBApixel[ReadPxlQnt];(temp, ReadPxlQnt*4, 1, pFile);i=0;(int row=0;row<height;row++)

{(int col=0;col<width;col++)

{[row*RealWidth+col]=temp[i].ToBGRA();++;

}

}(temp);

}(hdr.pixelSize==24)

{*temp = new RGBpixel[ReadPxlQnt];(temp, ReadPxlQnt*3, 1, pFile);i=0;(int row=0;row<height;row++)

{(int col=0;col<width;col++)

{[row*RealWidth+col]=temp[i].ToBGRA();++;

}

}(temp);

}(pFile);(TexID,Interpolation,Multiply);1;

}::~texture()

{();

}texture::DeleteArray()

{(!exsist) return;.clear();=0;

}texture::UnBind()

{(!binded) return;(GL_TEXTURE_2D, ID);data[4]="1111";D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);=0;

}int texture::GetWidth()

{width;

}int texture::GetHeight()

{height;

}int texture::GetRealWidth()

{RealWidth;

}int texture::GetRealHeight()

{RealHeight;

}int texture::GetPixelsQnt()

{PixelsQnt;

}int texture::GetID()

{ID;

}texture::GetExsist()

{exsist;

}texture::GetBinded()

{binded;

}texture::GetWCoeff()

{

return wcoeff;

}texture::GetHCoeff()

{hcoeff;

}texture::GetWCoeffF()

{1-1.*(RealWidth-width-2)/RealWidth;

}texture::GetHCoeffF()

{1-1.*(RealHeight-height-2)/RealHeight;

}texture::PutWidth(unsigned int w)

{=w;

}texture::PutHeight(unsigned int h)

{=h;

}texture::PutRealWidth(unsigned int rw)

{=rw;

}texture::PutRealHeight(unsigned int rh)

{=rh;

}texture::PutPixelsQnt(unsigned int pq)

{=pq;

}texture::PutID(unsigned int id)

{=id;

}texture::PutExsist(bool ex)

{=ex;

}texture::PutBinded(bool bd)

{=bd;

}texture::PutWCoeff(float wc)

{=wc;

}texture::PutHCoeff(float hc)

{=hc;

}

#endif


3.4 Модуль chizu


/******************************************************

Автор: Плеханов Ф.А.

Назначение: Класс батиметрии. Производит всю обработку батиметрических данных

и построение батиметрической сетки.

Входные данные: исходные треки, множество настроек, таких как частота изолиний

Выходные данные: трёхмерная батиметрическая карта с изолиниями и подписями

*******************************************************/


3.4.1 Заголовочный файл chizu.h

#ifndef CHIZU_H

#define CHIZU_H

#include <vector>

#include <map>

#include <list>

//Пользовательские модули

#include "merkator.h"

#include "doubletable.h"

#include "spline.h"

#include "lotexture.h"

#include "material.h"

#include "geometry.h"

#include "mathadv.h"

using namespace std;

//Константы максимума и минимума

#define MAX 9999999999

#define MIN -9999999999

//Цветовые константы

#define COLOR_RED 0

#define COLOR_GREEN 1

#define COLOR_BLUE 2

//Стандартизация исходныхReplaceComma(AnsiString);

//Получение строки из числаPointDouble(double);

//Получние строки с градусами и минутами из градусов с нецелой частьюDegToDegMin(double);

//Получение строки с градусами,

//минутами и секундами из градусов с нецелой частьюDegToCoord(double);

//Получение строки из градусов с нецелой частью, добавляет букву E или NDegToDegMinI(double, bool);

//Получние строки с градусами и минутами из градусов с нецелой частью,

//добавляет букву E или NDegToDegMinSecI(double, bool);

//Получение градусов с нецелой частью из градусов, минут и секунд

double DegMinSecToDouble(double, double, double);

//Установка заголовка окна, виртуальная функция, реализуемая

//в модуле, где расположено окноSetTitle(AnsiString msg);

//Функуция для тестированияDebag(AnsiString msg);

//Структура "трёхмерная точка"

struct point3D

{x,y,z; //координаты

bool ataru(point3D &); //проверка на совпадение с другой

};

//Структура "узел батиметрии", основанная на трёхмерной точке

struct vertex:point3D

{nx,ny,nz; //нормали b; //буфер для размытияe; //существует ли

};

//Попадает ли трёхмерная точка в треугольник

bool InTriangle(point3D &, point3D &, point3D &, point3D &);

//Существует ли такой треугольникCorrectTria(point3D &, point3D &, point3D &, double);

//Универсальная функция расчёта цвета по глубине

double countColor(double, double, double, unsigned __int8, bool, bool);

//Точка батиметрического трекаBathPoint

{D r,m; //Точка в географических и нормализованных к 1 координатахint t; //Сколько миллисекунд прошло с начала трекаtide; //Высота прилива в данной точке(); //Конструктор

};

//Изолинияisoline

{D a,b; //начало и конецzero; //не показывать(); //конструктор

void put(double &, double &, double &, //задать&, double &, double &, bool &);view(int &); //показать

};

//цифра-подписьfigure:public point3D

{exists; //показыватьlength; //размер

isoline *line; //к какой изолинии привязанаstr[8]; //что отображатьstrl; //длина строки

double angle; //угол разворотаactivate(double, double); //"прилепить" к изолинии

void view(int); //показать

};

//Структура треугольника для триангуляцииOneTri

{

//порядковые номера точек в качестве вершин

unsigned int a,b,c;

};

//основной класс батиметрииbath:public texture

{:

//поляf; //уровень для расчёта изолинийzero; //являетмя ли уровень текущей изолинии нулевымmaterial_color[4]; //массив цвета материала<OneTri> tri; //набор треугольников для триангуляции

//буферная изолиния для работы функции расчёта изолиний

isoline line;

//методыtriangulation();:

//поля<BathPoint> q; //батиметрический трекd<vertex> p; //батиметрическая сеткаd<double> blurBuff; //буфферный массив для размытияstartDate; //дата начала съёмкиendDate; //дата конца съёмки<isoline> iso; //вектор изолинийd<figure> figures; //массив цифр<double> *isolist; //список уровней изолинийd; //шаг сетки

double sclxy; //коэффициент нормализации долготы и широтыsclz; //коэффициент нормализации высотыcfx; //коэффициент нормализации долготыcfy; //коэффициент нормализации широты

//суммарное математическое отклонение данных от исходных в

//результате сглаживания и расчёта равномерной сеткиdev;tmpz; //нормализованная высота для расчёта цветаisoHaba; //частота изолинийisolineSize; //толщина изолинииD min; //минимум, нормализованный к 1D max; //максимум, нормализованный к 1D rmn; //минимум в географических координатахD rmx; //максимум в географических координатах

//число строк в текстуре для доступа к ячейке одномерной

//текстуры по двум координатамk;blurCount; //количество проходов размытияtexNum; //ID текстуры в среде OpenGLfighaba; //Расстояние между подписямиdiffBlur; //количество проходов размытия для сравнения батиметрийstep; //пропуск кратных узлов сетки для ускорения отображенияFilename; //имя файлаtex; //отображение текстуры средставми OpenGLvarIso; //переменный список изолинийlighting; //освещение включеноrt; //режим отображения без пропусковviewPoints; //отображать трекиnet; //отображать сеткуcounted; //сетка уже расчитанаisolines; //отображать изолинииviewRelief; //отображать рельефvisible; //отображать сеткуhideFar; //скрыть удалённые участки

//скрыть участки, выходящие за границу минимума и максимума

bool hideUpLimit;needRecount; //требуется перерасчёт

bool difference; //является разницей между двумя батиметриямиblackAndWhite; //отображать в чёрнобелых тонахslg; //является прочитанным slg-файломhasTide; //прилив вычтен

//методы

//Конструктор();

//Чтение точек из ASCII-файла

bool LoadPoints(AnsiString, bool, bool);

//Чтение трека из slg-файлаLoadSlg(DoubleTable &, AnsiString);

//Очистить батиметриюMakeEmpty(int);

//Расчёт прилива

void CountTide(cubic_spline &);

//Вычисление минимума и максимумаReCountMinMax();

//Вычисление только минимумаReCountMin();

//Расчёт батиметрической сеткиCountNet(int, point3D, point3D, double, double, double, double,, int, double, double, int, int, int, dinmas<double> *, bool);

//размытиеblur(int);

//расчёт отклоненияdeviation();

//Расчёт цвета для выбранного узла сетки

inline __fastcall void CountColor(int &, int &);

//Перерасчёт цветаReCountColor();

//Вычисление нормалей

inline __fastcall void CountNorm(int &, int &);

//Конструктор (в виде вызываемой функции)DefConstr();

//Вывод одного узла сетки на экран

void OneVertex(int &, int &);

//Вывод всей батиметрииview();

//Вывот трековViewPoints();

//Линейная интерполяция

double cf(double &, double &, double &, bool);

//Создание одной изолинииmakeLine(int &, int &);

//Отображение цифр-подписейViewFigures(int);

//Расчёт одного слоя изолиний

void countOneIso(double);

//Расчёт всех изолинийcountIso(double, dinmas<double> *, bool);

//Расчёт цифр-подписейCountFigures(int);

//Отображение изолинийviewIso();

//Удаление расчитанной батиметрической сеткиEraseNet();

//Вычисление разницы между двумя батиметриями

bool GetDiffer(bath &, bath &, int, double, int);

//ВычислениеGetDifferPoints(bath &, double);

//Наложение текстуры

bool ReBindTexture();

//Сохранение сетки в ASCII-форматеSaveNet(AnsiString);

//Сохранение данных в формате.inf и.dat для программы ANISaveANI(AnsiString, double);

//Сохранение набора точек для отображения в прорамме Google ChromeSavePointsGoogle(AnsiString);

//Сохранение трека для отображения в прорамме Google ChromeSaveTrack(AnsiString);

//Сохранение набора точек в ASCII-формате в географических коордиантахSavePoints(AnsiString);

//Сохранение набора точек в ASCII-формате в координатах меркатораSavePointsMer(AnsiString);

//Сохранение батиметрической карты для отображения в прорамме Google ChromeSaveNetGoogle(AnsiString, int);

//Получение всех статических переменных батиметрии из другойsetConstantPreset(bath &);

//Полное копирование батиметрии из другой=(bath &);

};

//Точка данных нивелированияLevelPoint

{l; //расстояние от берегаh; //высота над уровнем моря

//Координаты начальной точкиx;y;z;

};

//Класс для работы с нивелированием

struct Levelling

{<LevelPoint> levelPoint; //массив точек местности

};

#endif


3.4.2 Реализация chizu.cpp

#ifndef CHIZU_CPP

#define CHIZU_CPP

#include "chizu.h"namespace std;

//Константы малентких чисел

#define SM 0.00000001

#define SM2 0.1

//Смещение изолинии вверх

#define UE 0.001

//Коэффициенты для раскрашивания шкалы

#define RC 4.3

#define GC 1.8

#define BC 1.2

#define RD 0.0

#define GD 0.0

#define BD 0.0

//Эпсилон отклонения

#define EPS 0.0001ReplaceComma(AnsiString str)

{(int i=1;i<=str.Length();i++)

{(str[i]==',')[i]='.';

}str;

}PointDouble(double x)

{AnsiString(x);

}DegToDegMin(double x)

{deg=floor(x);min=(x-deg)*60;AnsiString(deg)+"° "+PointDouble(min)+"'";

}DegToCoord(double x)

{deg=floor(x);min=floor(fabs(x-deg)*60);sec=floor(fabs((fabs(x-deg)*60)-min)*60);ms=floor(100*((fabs(fabs(fabs(x-deg)*60)-min)*60)-sec));(ms==99)

{=0;++;(sec==59 || sec==60)

{=0;++;(min==59 || min==60)

{=0;++;

}

}

}(min==0 && sec==0 && ms==0)

{AnsiString(deg)+":";

}(min!=0 && sec==0 && ms==0)

{AnsiString(deg)+":"+AnsiString(min)+"'";

}(min!=0 && sec!=0 && ms==0)

{AnsiString(deg)+":"+(min)+"'"+AnsiString(sec)+"";

}AnsiString(deg)+":"+AnsiString(min)+

"'"+AnsiString(sec)+""+AnsiString(ms);

}DegToDegMinI(double x, bool E)

{deg=floor(x);min=round((x-deg)*60);AnsiString(deg)+"° "+AnsiString(min)+"' "+((E)?"E":"N");

}DegToDegMinSecI(double x, bool E)

{deg=floor(x);min=floor((x-deg)*60);sec=floor((((x-deg)*60)-min)*60);secs=AnsiString(sec)+" ";AnsiString(deg)+"° "+AnsiString(min)+

"' "+((sec!=0)?(secs):AnsiString(""))+((E)?"E":"N");

}DegMinSecToDouble(double deg, double min, double sec)

{deg+(min/60.)+(sec/3600.);

}point3D::ataru(point3D &p)

{(fabs(p.x-x)<EPS) && (fabs(p.y-y)<EPS) && (fabs(p.z-z)<EPS);

}InTriangle(point3D &a, point3D &b, point3D &c, point3D &p)

{pl1, pl2, pl3;= (a.x - p.x)*(b.y - a.y)-(b.x - a.x)*(a.y - p.y);= (b.x - p.x)*(c.y - b.y)-(c.x - b.x)*(b.y - p.y);= (c.x - p.x)*(a.y - c.y)-(a.x - c.x)*(c.y - p.y);((pl1 >= 0 && pl2 >= 0 && pl3 >= 0) ||

(pl1 <= 0 && pl2 <= 0 && pl3 <= 0))

{true;

}false;

}CorrectTria(point3D &a, point3D &b, point3D &c, double max)

{(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))>max)

{0;

}

{(sqrt(sqr(a.x-c.x)+sqr(a.y-c.y))>max)

{0;

}

{(sqrt(sqr(b.x-c.x)+sqr(b.y-c.y))>max)

{0;

}

{1;

}

}

}

}countColor(double z, double A, double B,__int8 color, bool difference, bool blackAndWhite)

{(!difference)

{(!blackAndWhite)(B<=A) return 0;(color)

{COLOR_RED:(z<0)exp(-sqr((z)*(4.3/(-A))));exp(-sqr((z+B*(-1))*(2/(((1.6)*(B))))));;COLOR_GREEN:(z<0)exp(-sqr((z)*(1.8/(-A))));exp(-sqr((z+B*(-0.42))*(2/(((0.85)*(B))))));;COLOR_BLUE:(z<0)exp(-sqr((z)*(1.2/(-A))));exp(-sqr((z+B*(1.2))*(2/(((1.9)*(B))))));;

}

}

{ret=1-(z-A)/(B-A);(ret<0) return 0;(ret>1) return 1;ret;

}

}

{(!blackAndWhite)

{(color)

{COLOR_RED:exp(-pow((z-A-(B-A)*2)*(2./(((3.3)*(B-A)))),10));;COLOR_GREEN:exp(-pow((z-A-(B-A)*0)*(2./(((5)*(B-A)))),4));;COLOR_BLUE:exp(-pow((z-A-(B-A)*(-2))*(2./(((3.5)*(B-A)))),8));;

}

}

{ret=z/((B-A)/8)+B;(ret<0) return 0;(ret>1) return 1;ret;

}

}

}::BathPoint()

{=0;=0;

}::isoline(){};isoline::put(double &x1, double &y1, double &z1,&x2, double &y2, double &z2, bool &Zero)

{.x=x1;.y=y1;.z=z1;.x=x2;.y=y2;.z=z2;=Zero;

}isoline::view(int &isolineSize)

{(zero)

{(2*isolineSize);d(0,0,0,1);

}

{(1*isolineSize);d(0,0,0,0.5);

}(GL_LINES);d(a.x,a.y,a.z+UE);d(b.x,b.y,b.z+UE);();

}figure::activate(double figh, double h)

{(length<figh)

{=line->a.x;=line->a.y;=line->a.z;r;(line->b.x-line->a.x, line->b.y-line->a.y, r, angle);=deg(angle);=1;s=FormatFloat("0.00",h);(s[s.Length()]=='0')s=s.SubString(1,s.Length()-1);(s[s.Length()]=='0')s=s.SubString(1,s.Length()-2);i;(i=0;i<s.Length()&&i<8;i++)

{[i]=s[i+1];

}=i;

}

{=0;

}

}figure::view(int size)

{();(!exists) return;(GL_TEXTURE_2D);(GL_BLEND);(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);(GL_TEXTURE_2D,0);(1,1,1,0,0,0,0,0,0,0,120);f(1,1,1);figsize=size*0.001875;

#define FIGCF 1.0

#define FIGDS 0.5

#define FIGSM 0.0005k=0;();(x,y,z);(angle,0,0,1);(int i=0;i<strl;i++)

{(str[i]>='0' && str[i]<='9') k=str[i]-'0';(str[i]=='.' || str[i]==',') k=10;(str[i]=='-') k=11;(GL_QUADS);f(k/16.0,0);d(-figsize*0.5+figsize*FIGDS*i,-figsize*0.5*FIGCF,i*FIGSM);f(k/16.0,1);d(-figsize*0.5+figsize*FIGDS*i,figsize*0.5*FIGCF,i*FIGSM);f((k+1)/16.0,1);d(figsize*0.5+figsize*FIGDS*i,figsize*0.5*FIGCF,i*FIGSM);f((k+1)/16.0,0);d(figsize*0.5+figsize*FIGDS*i,-figsize*0.5*FIGCF,i*FIGSM);();

}(GL_TEXTURE_2D);(GL_BLEND);();

}bath::triangulation()

{file("input.txt");(!file.is_open()) return 0;<<"2 RBOX s 4 W0 c D2\n";<<q.size()<<"\n";buffer [50];("СОКО - сохранение точек");(int i=0;i<q.size();i++)

{(buffer, "%.19f %.19f\n", q[i].m.x, q[i].m.y);<<buffer;

}.close();("СОКО - расчёт триангуляции");(AnsiString("qdelaunay TI input.txt s i Qt TO output.txt").c_str());

//ShowMessage("");("СОКО - чтение треугольников");

ifstream file2("output.txt");

//if(!file2.is_open()) return 0;int n=0,x;>>n;.make(n);(int i=0;i<n;i++)

{>>x;[i].a=x;>>x;[i].b=x;>>x;[i].c=x;

}("СОКО - треугольники прочитаны");.close();

remove("input.txt");("output.txt");

SetTitle("СОКО - временные файлы удалены");

return 1;

}::bath()

{();

}bath::LoadPoints(AnsiString FileName, bool merkator, bool minus)

{();file0(AnsiString(FileName+".dat").c_str());.close();file(FileName.c_str());tmp[30];val;size=0;(!file.is_open()) return 0;name[32];

_splitpath(FileName.c_str(),NULL,NULL,name,NULL);=name;("СОКО - Чтение ASCII");<double> buff;(!file.eof())

{>>val;.push_back(val);++;

}.make(size/3);.close();i=0, coord=0;(int j=0;j<size-1;j++)

{(coord)

{0:[i].r.x=buff[j];=1;;1:[i].r.y=buff[j];=2;(merkator) MerToGeo(q[i].r.x,q[i].r.y);;2:[i].r.z=(-minus*2+1)*buff[j];=0;(q[i].r.x<min.x) min.x=q[i].r.x;(q[i].r.x>max.x) max.x=q[i].r.x;(q[i].r.y<min.y) min.y=q[i].r.y;(q[i].r.y>max.y) max.y=q[i].r.y;(q[i].r.z<min.z) min.z=q[i].r.z;(q[i].r.z>max.z) max.z=q[i].r.z;++;;

}

}("СОКО");1;

}bath::LoadSlg(DoubleTable &table, AnsiString name)

{

#define FEET_TO_M 0.3048c=0,n=1,num;depth=0;("СОКО - Чтение slg");(int i=1;i<table.d.m;i++)

{(table.d[13][i]!=0) c++;

}(c>=table.d.m) return 0;.make(c);=0;i;(i=1;i<table.d.m;i++)

{(table.d[13][i]!=0)

{(c>0)

{[c-1].r.z=-(depth/n)*FEET_TO_M;(q[c-1].r.x<min.x) min.x=q[c-1].r.x;(q[c-1].r.x>max.x) max.x=q[c-1].r.x;(q[c-1].r.y<min.y) min.y=q[c-1].r.y;(q[c-1].r.y>max.y) max.y=q[c-1].r.y;(q[c-1].r.z<min.z) min.z=q[c-1].r.z;(q[c-1].r.z>max.z) max.z=q[c-1].r.z;

}[c].r.x=table.d[13][i];[c].r.y=table.d[14][i];[c].t=table.d[21][i];(q[c].r.x,q[c].r.y);=table.d[3][i];=1;++;

}

{++;+=table.d[3][i];

}

}[c-1].r.z=-(depth/n)*FEET_TO_M;(q[c-1].r.x<min.x) min.x=q[c-1].r.x;(q[c-1].r.x>max.x) max.x=q[c-1].r.x;(q[c-1].r.y<min.y) min.y=q[c-1].r.y;(q[c-1].r.y>max.y) max.y=q[c-1].r.y;(q[c-1].r.z<min.z) min.z=q[c-1].r.z;(q[c-1].r.z>max.z) max.z=q[c-1].r.z;=name;("СОКО");=1;1;

}bath::MakeEmpty(int length)

{.make(length);1;

}bath::CountTide(cubic_spline &spl)

{(slg)

{((double)startDate==0.0) return;(int i=0;i<q.size();i++)

{(hasTide)[i].tide=spl.f(startDate+q[i].t/86400000.0);[i].tide=0;

}

}

{((double)startDate==0.0 || (double)endDate==0.0) return;current;(int i=0;i<q.size();i++)

{(hasTide)[i].tide=spl.f((double)startDate+((double)endDate-

(double)startDate)*(i/(double)q.size()));[i].tide=0;

}

}

}bath::ReCountMinMax()

{.x=MAX;.x=MIN;.y=MAX;.y=MIN;.z=MAX;.z=MIN;(int i=0;i<q.size();i++)

{(q[i].r.x<min.x) min.x=q[i].r.x;(q[i].r.x>max.x) max.x=q[i].r.x;(q[i].r.y<min.y) min.y=q[i].r.y;(q[i].r.y>max.y) max.y=q[i].r.y;(q[i].r.z<min.z) min.z=q[i].r.z;(q[i].r.z>max.z) max.z=q[i].r.z;

}=0;

}bath::ReCountMin()

{min=MAX;(int i=0;i<q.size();i++)

{(q[i].r.z<min) min=q[i].r.z;

}min;

}bath::CountNet(int TexNum, point3D Min, point3D Max, double Sclxy,Sclz, double Cfx, double Cfy, double D, int N, double rad,isoHABA, int maskBlurCount, int FigHaba, int IsolineSize,<double> *Isolist, bool VarIso)

{=FigHaba;=Sclxy;=Sclz;=Min;=Max;=D;=TexNum;=isoHABA;=IsolineSize;=Isolist;=VarIso;=cfy*N;=cfx*N;(int i=0;i<q.size();i++)

{[i].m.x=sclxy*(q[i].r.x-min.x-(max.x-min.x)/2);[i].m.y=sclxy*(q[i].r.y-min.y-(max.y-min.y)/2);[i].m.z=sclz*(q[i].r.z+q[i].tide*(hasTide)-min.z-(max.z-min.z)/2);

}.z=sclz*(min.z-min.z-(max.z-min.z)/2);.z=sclz*(max.z-min.z-(max.z-min.z)/2);("СОКО - триангуляция");();("СОКО - триангуляция завершена");=0;(!p.make(width,height)) return 0;("СОКО - создана сетка");(!blurBuff.make(width,height))

{("СОКО - не создана буферная сетка");0;

}

{("СОКО - создана буферная сетка");

}(!MakeArray(height,width)) return 0;("СОКО - создана текстура");ls,hs,ls2,l,mn,lm;(max.y-min.y>max.x-min.x)=SphereLenght(min.x, min.y, min.x, max.y);=SphereLenght(min.x, min.y, max.x, min.y);

int km=0;("СОКО - обнуление сетки");

for(int j=0;j<width;j++)

{(int i=0;i<height;i++)

{[i][j].x=-cfx/2+d*i;[i][j].y=-cfy/2+d*j;[i][j].z=0;[i][j].b=p[i][j].z;[i][j]=p[i][j].z;[i][j].e=0;

}

}ia,ib,ja,jb;ta=0,tb=0,tc=1,td=0;("СОКО - расчёт треугольников");(int k=0;k<tri.size();k++)

{=floor((MinFrom3(q[tri[k].a].m.x,[tri[k].b].m.x,q[tri[k].c].m.x)+cfx/2)/d);=ceil((MaxFrom3(q[tri[k].a].m.x,[tri[k].b].m.x,q[tri[k].c].m.x)+cfx/2)/d);=floor((MinFrom3(q[tri[k].a].m.y,[tri[k].b].m.y,q[tri[k].c].m.y)+cfy/2)/d);=ceil((MaxFrom3(q[tri[k].a].m.y,[tri[k].b].m.y,q[tri[k].c].m.y)+cfy/2)/d);(ia<0 || ja<0 || ib>height || jb>width) continue;(!CorrectTria(q[tri[k].a].m,[tri[k].b].m,q[tri[k].c].m,rad/lm)) continue;([tri[k].a].m.x,q[tri[k].b].m.x,q[tri[k].c].m.x,[tri[k].a].m.y,q[tri[k].b].m.y,q[tri[k].c].m.y,[tri[k].a].m.z,q[tri[k].b].m.z,q[tri[k].c].m.z,,tb,tc,td);(int j=ja;j<jb;j++)

{(int i=ia;i<ib;i++)

{(InTriangle(q[tri[k].a].m,[tri[k].b].m,q[tri[k].c].m,p[i][j])

&& tri[k].a>=0 && tri[k].a<q.size()

&& tri[k].b>=0 && tri[k].b<q.size()

&& tri[k].b>=0 && tri[k].c<q.size()

)

{[i][j].z=(-ta*p[i][j].x-tb*p[i][j].y-td)/tc;[i][j].b=p[i][j].z;[i][j]=p[i][j].z;[i][j].e=1;

}

}

}

}(maskBlurCount==0)

{("СОКО - расчёт цвета и нормалей");

for(int j=0;j<width;j++)

{(int i=0;i<height;i++)

{(p[i][j].e)

{(i,j);(i,j);

}

}

}

}

{(maskBlurCount);

}=1;=1;("СОКО - наложение текстуры");(texNum,1,0);(maskBlurCount==0)

{(isoHaba,isolist,varIso);();

}("СОКО");1;

}bath::blur(int times)

{(int k=0;k<times;k++)

{(int j=1;j<width-1;j++)

{(int i=1;i<height-1;i++)

{([i-1][j+1].e && p[i ][j+1].e && p[i+1][j+1].e &&[i-1][j ].e && p[i ][j ].e && p[i+1][j ].e &&[i-1][j-1].e && p[i ][j-1].e && p[i+1][j-1].e

)

{[i][j]=(

(0.0625)*p[i-1][j+1].z+(0.125)*[i ][j+1].z+(0.0625)*p[i+1][j+1].z+

(0.125 )*p[i-1][j ].z+(0.25 )*[i ][j ].z+(0.125 )*p[i+1][j ].z+

(0.0625)*p[i-1][j-1].z+(0.125)*[i ][j-1].z+(0.0625)*p[i+1][j-1].z

);

}

{[i][j]=p[i][j].z;

}

}

}(int j=1;j<width-1;j++)

{(int i=1;i<height-1;i++)

{([i-1][j+1].e && p[i ][j+1].e && p[i+1][j+1].e &&[i-1][j ].e && p[i ][j ].e && p[i+1][j ].e &&[i-1][j-1].e && p[i ][j-1].e && p[i+1][j-1].e

)

{[i][j].z=blurBuff[i][j];

(

(0.0625)*blurBuff[i-1][j+1]+(0.125 )*[i ][j+1]+(0.0625)*blurBuff[i+1][j+1]+

(0.125 )*blurBuff[i-1][j ]+(0.25 )*[i ][j ]+(0.125 )*blurBuff[i+1][j ]+

(0.0625)*blurBuff[i-1][j-1]+(0.125 )*[i ][j-1]+(0.0625)*blurBuff[i+1][j-1]

);

}

{[i][j].z=blurBuff[i][j];

}(k==times-1)

{(i,j);(i,j);

}

}("СОКО - размытие "+(FormatFloat(100*(double(k+1)/double(times)),2))+"%");

}("СОКО");

}=1;(texNum,1,0);+=times;(isoHaba,isolist,varIso);();("СОКО");

}bath::deviation()

{;("СОКО - расчёт ошибки");sz=0, srz=0, z;nx,ny;(int i=0;i<q.size();i++)

{=floor((q[i].m.x+cfx/2)/d);=floor((q[i].m.y+cfy/2)/d);(nx>=height-2 || ny>=width-2) continue;(!p[nx][ny].e || !p[nx][ny+1].e ||

!p[nx+1][ny+1].e || !p[nx+1][ny].e) continue;=bilinear(p[nx][ny].z,p[nx][ny+1].z,[nx+1][ny].z,p[nx+1][ny+1].z,p[nx][ny].x,[nx+1][ny].x,p[nx][ny].y,p[nx][ny+1].y,[i].m.x,q[i].m.y);+=fabs(q[i].m.z);+=fabs(z);

}=100*fabs(sz-srz)/srz;

}__fastcall void bath::CountColor(int &i, int &j)

{=p[i][j].z/sclz+min.z+(max.z-min.z)/2;(difference)

{[i*RealWidth+j].r=

*countColor(tmpz,-2,2,0,1,blackAndWhite);[i*RealWidth+j].g=

*countColor(tmpz,-2,2,1,1,blackAndWhite);[i*RealWidth+j].b=

*countColor(tmpz,-2,2,2,1,blackAndWhite);

}

{[i*RealWidth+j].r=

*countColor(tmpz,min.z,max.z,0,0,blackAndWhite);[i*RealWidth+j].g=

*countColor(tmpz,min.z,max.z,1,0,blackAndWhite);[i*RealWidth+j].b=

*countColor(tmpz,min.z,max.z,2,0,blackAndWhite);

}

}bath::ReCountColor()

{("СОКО - расчёт цвета");(int j=1;j<width-1;j++)

{(int i=1;i<height-1;i++)

{(p[i][j].e) CountColor(i,j);

}

}=1;("СОКО - наложение текстуры");

BindTexture(texNum,1,0);("СОКО");

}__fastcall void bath::CountNorm(int &i, int &j)

{(i>0 && j>0)

{([i][j].x, p[i][j].y, p[i][j].z,[i][j-1].x, p[i][j-1].y, p[i][j-1].z,[i-1][j-1].x, p[i-1][j-1].y, p[i-1][j-1].z,[i][j].nx, p[i][j].ny, p[i][j].nz, 0) ;

}

}bath::DefConstr()

{

//rt=1;=1;=1;=0;=1;=1;=0;

//fb=0;=1;=0;=1;=0;

//dif=0;=1;.x=MAX; max.x=MIN; min.y=MAX; max.y=MIN; min.z=MAX; max.z=MIN;=1;=1;=0;=0;=0;=0;=0;=1;=0;=0;=1;

}bath::OneVertex(int &i, int &j)

{

//glColor3d(1,1,1);

//material1.view(1,1,1,0,1,1,1,0,0,0,60);(tex)

{f(((1.*j/width))*wcoeff,((1.*i/height))*hcoeff);

}

{=i*RealWidth+j;_color[0]=imageData[k].r/255.0;_color[1]=imageData[k].g/255.0;_color[2]=imageData[k].b/255.0;fv(material_color);(GL_FRONT_AND_BACK,_AMBIENT_AND_DIFFUSE, material_color);

}d(p[i][j].nx,p[i][j].ny,p[i][j].nz);d(p[i][j].x,p[i][j].y,p[i][j].z);

}bath::view()

{(!counted) return;(viewRelief)

{=0;(tex)

{(GL_TEXTURE_2D);(GL_TEXTURE_2D,texNum);(1,1,1,0,0,0,0,0,0,0,120);

}tc=0;

int stepBuff;(!rt)

{=step;=1;

}d(1,1,1);(1,1,1,0,0.5,0.5,0.5,0,0,0,60);(lighting) glEnable(GL_LIGHTING);(step<height && step<width)

{(int i=1;i<height-step;i+=step)

{(int j=1;j<width-step;j+=step)

{(

((hideFar && p[i][j].e && p[i][j+step].e &&[i+step][j+step].e && p[i+step][j].e) || !hideFar )

&&

((hideUpLimit && p[i][j].z<rmx.z && p[i][j].z>rmn.z) ||

!hideUpLimit || difference )

)

{(!net) glBegin(GL_QUADS); else glBegin(GL_LINE_LOOP);(i,j);(i,j+step);(i+step,j+step);(i+step,j);();

}

}

}

}(lighting) glDisable(GL_LIGHTING);d(0,0,0);(!rt)

{=stepBuff;

}(tex)

{(GL_TEXTURE_2D);

}

}(isolines) viewIso();

}bath::ViewPoints()

{(viewPoints)

{(1);(GL_POINTS);(int i=0;i<q.size();i++)

{d(q[i].r.x,q[i].r.y,q[i].r.z+q[i].tide*(hasTide));

}();

}

}bath::cf(double &s, double &e, double &f, bool revert)

{fabs((revert)-((f-s)/(e-s)));

}bath::makeLine(int &i, int &j)

{(

(p[i][j].z< f && p[i][j+1].z>=f && p[i+1][j+1].z>=f && p[i+1][j].z>=f)||

(p[i][j].z>=f && p[i][j+1].z< f && p[i+1][j+1].z< f && p[i+1][j].z< f))

{.put(p[i][j].x,p[i][j].y+d*cf(p[i][j].z,p[i][j+1].z,f,0),f

,p[i][j].x+d*cf(p[i][j].z,p[i+1][j].z,f,0),p[i][j].y,f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z>=f && p[i][j+1].z< f && p[i+1][j+1].z>=f && p[i+1][j].z>=f)||

(p[i][j].z< f && p[i][j+1].z>=f && p[i+1][j+1].z< f && p[i+1][j].z< f))

{.put(p[i][j].x,p[i][j].y+d*cf(p[i][j].z,p[i][j+1].z,f,0),f

,p[i][j].x+d*cf(p[i][j+1].z,p[i+1][j+1].z,f,0),p[i][j].y+d,f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z>=f && p[i][j+1].z>=f && p[i+1][j+1].z< f && p[i+1][j].z>=f)||

(p[i][j].z< f && p[i][j+1].z< f && p[i+1][j+1].z>=f && p[i+1][j].z< f))

{.put(p[i][j].x+d*cf(p[i+1][j+1].z,p[i][j+1].z,f,1),p[i][j].y+d,f

,p[i][j].x+d,p[i][j].y+d*cf(p[i+1][j+1].z,p[i+1][j].z,f,1),f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z>=f && p[i][j+1].z>=f && p[i+1][j+1].z>=f && p[i+1][j].z< f)||

(p[i][j].z< f && p[i][j+1].z< f && p[i+1][j+1].z< f && p[i+1][j].z>=f))

{.put(p[i][j].x+d*cf(p[i][j].z,p[i+1][j].z,f,0),p[i][j].y,f

,p[i][j].x+d,p[i][j].y+d*cf(p[i+1][j].z,p[i+1][j+1].z,f,0),f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z< f && p[i][j+1].z< f && p[i+1][j+1].z>=f && p[i+1][j].z>=f)||

(p[i][j].z>=f && p[i][j+1].z>=f && p[i+1][j+1].z< f && p[i+1][j].z< f))

{.put(p[i][j].x+d*cf(p[i][j].z,p[i+1][j].z,f,0),p[i][j].y,f

,p[i][j].x+d*cf(p[i][j+1].z,p[i+1][j+1].z,f,0),p[i][j].y+d,f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z< f && p[i][j+1].z>=f && p[i+1][j+1].z>=f && p[i+1][j].z< f)||

(p[i][j].z>=f && p[i][j+1].z< f && p[i+1][j+1].z< f && p[i+1][j].z>=f))

{.put(p[i][j].x,p[i][j].y+d*cf(p[i][j].z,p[i][j+1].z,f,0),f

,p[i][j].x+d,p[i][j].y+d*cf(p[i+1][j].z,p[i+1][j+1].z,f,0),f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}(

(p[i][j].z>=f && p[i][j+1].z< f && p[i+1][j+1].z>=f && p[i+1][j].z< f)||

(p[i][j].z< f && p[i][j+1].z>=f && p[i+1][j+1].z< f && p[i+1][j].z>=f))

{.put(p[i][j].x,p[i][j].y+d*cf(p[i][j].z,p[i][j+1].z,f,0),f

,p[i][j].x+d*cf(p[i][j].z,p[i+1][j].z,f,0),p[i][j].y,f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));.put(p[i][j].x+d*cf(p[i+1][j+1].z,p[i][j+1].z,f,1),p[i][j].y+d,f

,p[i][j].x+d,p[i][j].y+d*cf(p[i+1][j+1].z,p[i+1][j].z,f,1),f,zero);.push_back(line);

//isom.insert(pair<pair<int,int>,isoline>(pair<int,int>(i,j),line));;

}

}bath::ViewFigures(int size)

{

//ViewValue("-125.4",0,0,0.05,270);(!figures.exists) return;(GL_LINES);(int i=0;i<fighaba;i++)

{(int j=0;j<fighaba;j++)

{[i][j].view(size);

}

}();

}bath::countOneIso(double k)=sclz*(k-min.z-(max.z-min.z)/2);(int i=1;i<height-1;i++)

{(int j=1;j<width-1;j++)

{(

(p[i][j].e && p[i][j+1].e && p[i+1][j+1].e && p[i+1][j].e)

&&

((hideUpLimit && p[i][j].z<rmx.z && p[i][j].z>rmn.z)

|| !hideUpLimit)

)(i,j);

}

}

}bath::countIso(double IsoHaba, dinmas<double> *Isolist, bool VarIso)

{=IsoHaba;=VarIso;=Isolist;(p.n==0) return;k;.clear();("СОКО - расчёт изолиний");=1;(!difference)

{min=ReCountMin();(varIso)

{(k=0;k>min;k-=isoHaba)

{(k);=0;

}(k=isoHaba;k<max.z;k+=isoHaba)

{(k);

}

}

{(int i=0;i<isolist->size();i++)

{=(isolist->operator [](i)==0);(isolist->operator [](i));

}

}

}

{(k=0;k>-4;k-=isoHaba)

{(k);=0;

}(k=isoHaba;k<4;k+=isoHaba)

{(k);

}

}(fighaba);

}bath::CountFigures(int figh)

{

//return;(p.n==0 || iso.size()==0) return;("СОКО - расчёт цифр");=figh;.make(fighaba,fighaba);l;(int i=0;i<fighaba;i++)

{ //0.86602540378443864676372317075294(int j=0;j<fighaba;j++)

{(cfx<cfy)

{[i][j].x=-cfx/2+(cfx*i/fighaba);(i%2!=0)[i][j].y=-cfy/2+(cfy*j/fighaba);[i][j].y=-cfy/2+0.5*cfy/fighaba+(cfy*j/fighaba);

}

{[i][j].y=-cfy/2+(cfy*j/fighaba);(j%2!=0)[i][j].x=-cfx/2+(cfx*i/fighaba);[i][j].x=-cfx/2+0.5*cfx/fighaba+(cfx*i/fighaba);

}[i][j].length=MAX;(int k=0;k<iso.size();k++)

{=sqrt(sqr(iso[k].a.x-figures[i][j].x)+(iso[k].a.y-figures[i][j].y));(l<figures[i][j].length)

{[i][j].length=l;[i][j].line=&iso[k];

}

}[i][j].activate(

((cfx>cfy)?(cfy/fighaba):(cfx/fighaba))/2,-

(figures[i][j].line->a.z/sclz+min.z+

(max.z-min.z)/2)*(difference?-1:1));

}

}("СОКО");

}bath::viewIso()

{

//glEnable(GL_BLEND);(int i=0;i<iso.size();i++)

{[i].view(isolineSize);

}

//glDisable(GL_BLEND);

}bath::EraseNet()

{(!counted) return;=0;

}bath::GetDiffer(bath &src, bath &dst,TexNum, double isoHABA, int DiffBlur)

{("СОКО - расчёт разницы");

//DefConstr();(src);=1;=src.Filename+"-"+dst.Filename;

//dif=1;=src.sclxy;=src.sclz;=src.cfx;=src.cfy;=src.min;=src.max;=src.rmn;=src.rmx;=DiffBlur;=src.d;=TexNum;=src.width;=src.height;=isoHABA;=0;.make(width,height);.make(width,height);(height,width);(int j=0;j<width;j++)

{(int i=0;i<height;i++)

{[i][j].x=src.p[i][j].x;[i][j].y=src.p[i][j].y;[i][j].z=*(

((src.p[i][j].z/src.sclz+src.min.z+(src.max.z-src.min.z)/2)-

(dst.p[i][j].z/dst.sclz+dst.min.z+(dst.max.z-dst.min.z)/2))

src.min.z-(src.max.z-src.min.z)/2);[i][j].b=p[i][j].z;[i][j]=p[i][j].z;

//p[i][j].s=(src.p[i][j].s+dst.p[i][j].s)/2.;[i][j].e=src.p[i][j].e&&dst.p[i][j].e;(diffBlur==0)

{(i,j);(i,j);

}

}

}=1;=1;(diffBlur);(texNum,1,0);(isoHaba,isolist,varIso);1;bath::GetDifferPoints(bath &dst, double Range)

{("СОКО - расчёт разницы");rx=Range*(max.x-min.x)/SphereLenght(min.x, min.y, max.x, min.y);ry=Range*(max.y-min.y)/SphereLenght(min.x, min.y, min.x, max.y);<BathPoint> q1;(int i=0;i<q.size();i++)

{(int j=0;j<dst.q.size();j++)

{((fabs(q[i].r.x-dst.q[j].r.x)<=rx) &&

(fabs(q[i].r.y-dst.q[j].r.y)<=ry))

{.push_back(q[i]);kk;

}

}:(i%1000==0)

SetTitle("СОКО - расчёт разницы для "+Filename+" "+

AnsiString(FormatFloat(100*(double(i+1)/double(q.size())),2))+"%");

}.make(q1.size());(int i=0;i<q1.size();i++)

{[i]=q1[i];

}("СОКО");1;

}bath::ReBindTexture()

{(counted) exsist=1;BindTexture(texNum,1,0);

}bath::SaveNet(AnsiString FileName)

{file(FileName.c_str());(!file.is_open()) return 0;

SetTitle("СОКО - сохранение сетки");buffer [10];

int n;<<"0 ";(int i=0;i<height;i++)

{(buffer, "%.13f", p[i][0].x/sclxy+min.x+(max.x-min.x)/2);<<buffer<<" ";

}<<"\n";(int j=0;j<width;j++)

{(buffer, "%.13f", p[0][j].y/sclxy+min.y+(max.y-min.y)/2);<<buffer<<" ";(int i=0;i<height;i++)

{(buffer, "%.13f", p[i][j].z/sclz+min.z+(max.z-min.z)/2);<<buffer<<" ";

}<<"\n";

}.close();1;

}bath::SaveANI(AnsiString FileName, double minutesStep)

{("СОКО - сохранение сетки");*pFile;

pFile=fopen(AnsiString(FileName.SubString(

,FileName.Length()-4)+".dat").c_str(), "wb");(pFile==0) return 0;value;(int j=0;j<width;j++)

{(int i=0;i<height;i++)

{(p[i][j].e)

{=-p[i][j].z/sclz+min.z+(max.z-min.z)/2;

}

{=10001;

}(&value, sizeof(float), 1, pFile);

}

}(pFile);buff[256];drive[3],direc[256],name[128],ext[8];

_splitpath(FileName.c_str(),drive,direc,name,ext);file(FileName.c_str());(Filename.c_str(),buff);<<buff<<"\n";<<"Created by SOKO\n";(name,buff);<<buff<<".dat\n4\n2\n";<<width<<" "<<height<<"\n";<<"0 0 0 0\n";<<ReplaceComma(FormatFloat("0.000000",min.z)).c_str()<<

" "<<ReplaceComma(FormatFloat("0.000000",max.z)).c_str()<<" m\n";<<ReplaceComma(minutesStep).c_str()<<" "<<(minutesStep).c_str()<<" ' 0\n";<<"0 "<<DegToCoord(min.y).c_str()<<" "<<DegToCoord(min.x).c_str();<<"\n0\n";.close();1;

}bath::SavePointsGoogle(AnsiString FileName)

{file(FileName.c_str());(!file.is_open()) return 0;

SetTitle("СОКО - сохранение точек");buffer [20];

file<< AnsiString(

"<?xml version=1.0 encoding=UTF-8?><kml xmlns=#"justify">Заголовочный файлНазначение в проекте программыwindows.hРеализует доступ к API-функциям операционной системы Microsoft Windowsiostream.hРабота с потоками и консолью операционной системы, используется для связи с консольными модулями.fstream.hЧтение и запись файловstdio.hСтандартный ввод и выводmapРеализует шаблоны классов контейнеров std::map и std::multimap - Ассоциативный массив и мультиотображение.vectorРеализует шаблон класса контейнеров std::vector - динамический массив.mathОсновные математческие операции, такие как косинус или возведение в степеньstdarg.hСредства для перебора аргументов функции, количество и типы которых заранее не известны.ctimeТипы и функции для работы с датой и временем.cstdlibФункции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие.limitsОпределения характеристик общих типов переменных.

Таблица 4.2 - Использованные в программе классы стандартной библиотеки (выборочно)

Название классаНазначение в проекте программыvectorУниверсальный контейнер, используется редко: для хранения изолиний и уровней изолиний. В остальных случаях заменяется пользовательскими контейнерами семейства dinmas.mapОтображение, используется во время вычисления приливов для подготовки данных к кубической интерполяции.ifstreamЧтение файловofstreamЗапись файлов

Таблица 4.3 - Использованные в программе заголовочные файлы VCL

Заголовочный файлНазначение в проекте программыClasses.hppСтандартные классы VCLStdCtrls.hppСтандартные элементы управленияForms.hppФорма - окно настроек в программеMenus.hppГлавное менюDialogs.hppДиалоговые окнаmsxmldom.hpp XMLDoc.hpp xmldom.hpp XMLIntf.hppКлассы для работы с XML¸используются для чтения файлов в формате kml (Google Earth), а также xml-файлы треков GPS-навигатора Garmin.

Таблица 4.4 - Использованные в программе классы VCL

Название классаНазначение в проекте программыAnsiStringОсновной строковый класс программы, используется повсеместно.TDateTimeКласс для работы с датой и временем.FileInfoОперации управления файловой структурой. DirectoryInfoПолучение сведений о файлах и каталогах.TMainMenuГлавное менюTTimerТаймерTOpenDialogДиалог открытия файловTSaveDialogДиалог сохранения файловTPopupMenuКонтекстное менюTMenuItemКласс элемента главного менюTXMLDocumentКласс для работы с XMLTFormРабочее окно программы

Таблица 4.5 - Использованные в программе программе заголовочные файлы Raize

Заголовочный файлНазначение в проекте программыRzEdit.hppПоля вводаRzSpnEdt.hppПоля числового ввода, позволяющие изменять значение с помощью колёсика мышиRzPanel.hppПанели, объединяющие несколько элементовRzTabs.hppПанели управления страницамиRzButton.hppКнопкиRzChkLst.hppСписки с выбором элеметовRzLstBox.hppСпискиRzCmboBx.hppВыпадающие спискиRzRadGrp.hppГруппы, позволяющие выбрать один параметрRzRadChk.hppГруппы, позволяющие выбрать несколько параметровRzLabel.hppТекстовая строкаRzTrkBar.hppИнформационная панель внизуRzGroupBar.hppВертикальные панели, содержащие сворачиваемые группы элементов управления

Таблица 4.6 - Использованные в программе программе заголовочные файлы Raize

Название компонентаОписаниеTRzToolbarПанель инструментовTRzToolbarButtonКнопка на панели инструментовTRzPanelПанель, объединяющая другие компонентыTRzSplitterБегунок, разделяющий две панелиTRzListBoxСписокTRzGroupBarВертикальная панель со сворачиваемыми группамиTRzLabelТекстовая подписьTRzSpinEditЭлемент числового ввода, позволяющий изменять значение с помощью колёсика мыиTRzStatusBarСтрока состоянияTRzSpacerРазделитель на панели инструментовTRzBitBtnКнопка с изображениемTRzComboBoxВсплывающий списокTRzCheckBoxГруппа с выбором нескольких элементовTRzRadioGroupГруппа с выбором одного элементаTRzColorEditЭлемент управления цветомTRzCheckListСписок в выбором элементовTRzEditКомпонент текстового вводаTRzDateTimeEditЭлемент отображения и задания времени и даты

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

Далее в таблице 4.4 представлены названия основных таких классов, а в таблицах 4.5 и 4.6 дано описание их структуры.

Также следует отметить, что каждый модуль реализован в виде одного или нескольких классов, реализующих функциональность, возложенную на данный модуль.


Таблица 4.7 - Главные структуры данных пользователя, использованные в программе

Название классаНазначение в проекте программыpoint2dСтруктура «двумерная точка», используется как предок класса «трёхмерная точка»point3dСтруктура «трёхмерная точка», используется как предок классов Vertex и BathPoint, и поле в классах Camera, Cursor, Isoline, Figure, Lamp.cameraКласс камеры. Содержит методы упрощённого управления камерой в проекции OpenGL. Является предком класса control3d.cursorКласс курсора. Сожержит методы получения координат курсора на экране, преобразования их в проекцию OpenGL и обратно. Является предком класса control3dcoltrol3dКласс управления сценой, наследник классов камеры и курсора, управлять просмотром трёхмерного изображения с помощью мыши: вращать, перемещать, масштабировать.AverageLevelКласс, применяемый для расчёта сезонных изменений уровня моря.CamItemЭлемент последовательности камер, входит в качестве поля в класс CameraSequence.CameraSequenceКласс-массив камер, является наследником класса Camera, применяется для создания видеороликов.dinmasОдномерный простой динамический массив. Используется в качестве массива для большинства типов данных.dinmas2dДвумерный простой динамический массив. Используется в качестве массива для батиметрической карты и её текстуры.smartcontОдномерный динамический массив с двойной адресацией. Используется для хранения объектов, содержащих поля типа dinmas и dinmas2d, в частности для списка батиметрических треков и списка камер.TgaHeaderЗаголовок TGA-файла.RGBApixelСтруктура точки в формате TGAtextureКласс, предназначенный для чтения и записи файлов в формате TGA. Применяется как в качестве контейнера текстуры батиметрической карты, так и для сохранения изображений и видео. Является предком класса bath.DoubleTableКласс, позволяющий читать ascii-файл, представляющий собой таблицу из чисел, разделённых табуляцией и создающий на выходе двумерный массив. Применяется для чтения исходных данных.vertexСтруктура "узел батиметрии", основанная на трёхмерной точке.BathPointТочка батиметрического трека.isolineКласс одного отрезка изолинии.figureКласс цифры-подписи.OneTriСтруктура треугольника для триангуляции.bathОсновной класс для расчёта батиметрии. Содержит все функции обработки и анализа данных.glWindowКласс API-окна, реализующего вывод OpenGL-графики.lampКласс, упрощяющий работу с освещением в OpenGL.RastrFontКласс, упрощающий работу с выводом текста в среде OpenGL.WorkAreaКласс, предназначенный для чтения параметров текущего экрана.

Таблица 4.8 - Структура point2d

Вид членаОписаниеНазначениеполеdouble xАбсциссаполеdouble yОрдинатаметодpoint2d()Пустой конструкторметодpoint2d(double, double)Конструкторметодbool equal(point2d&)Проверка на равенствометодvoid mix(point2d&)Вычислить среднюю точкуметодdouble angto(point2d&)Получить ориентацию точкиВид членаОписаниеНазначениеполеdouble zАппликатаметодpoint3d()Пустой конструкторметодpoint3d(double, double, double)Конструкторметодbool equal(point3d&)Проверка на равенствометодvoid mix(point3d&)Вычислить среднюю точкуметодbool ataru(point3d&)Попадает ли в точку с радиусом EPSметодdouble zАппликатаВид членаОписаниеНазначениеполеpoint3d posПозицияметодpoint3d startposНачальная позицияметодpoint3d angВектор угла поворотаметодpoint3d startangНачальный вектор угла поворотаметодcamera()Пустой конструкторметодcamera(float, float, float, float, float, float)Конструкторметодvoid view()Применить камеруВид членаОписаниеНазначениеполеfloat xАбсцисса в среде OpenGLполеfloat yОрдината в среде OpenGLполеfloat dxТекущая скорость по оси абсцисс в среде OpenGLполеfloat dyТекущая скорость по оси ординат в среде OpenGLполеfloat sizeРазмер курсораполеfloat oldXПредыдущая абсцисса в среде OpenGLполеfloat oldYПредыдущая ордината в среде OpenGLполеint WinXАбсцисса в оконных координатахполеint WinYОрдината в оконных координатахполеint OldWinXПредыдущая абсцисса в среде OpenGLполеint OldWinYПредыдущая абсцисса в среде OpenGLполеbool RMBНажата правая кнопкаполеbool LMBНажата левая кнопкаполеbool MMBНажата средняя кнопкаметодcursor()Пустой конструкторметодvoid check(int &, int &, int, int)Получить координаты курсораметодvoid putold()Запомнить предыдущие значенияметодvoid view()Отобразить курсорметодvoid PutState(bool, bool, bool)Установить состояние кнопок мышиметодvoid PutState(bool, bool, bool, bool)Установить состояние кнопок мыши с проверкой

Таблица 4.9 - Структура класса coltrol3d, потомок классов camera и cursor

Вид членаОписаниеНазначениеметодcoltrol3d()Пустой конструкторметодcoltrol3d(float, float, float, float, float, float)Конструкторметодvoid view(bool)Установить камеру на текущую позицию в соответствии с курсоромметодvoid gets(int, int, int, int, bool)Получить координаты курсораметодwheel(bool, float)Получить сообщение прокрутки мыши, отдалив камеруметодcoltrol3d middle(coltrol3d, double)Установить позицию камеры посередине между двумя позициями

Таблица 4.10 - Структура класса AverageLevel

Вид членаОписаниеНазначениеполеTDateTime dateТекущая датаполеdouble yaГодовая амплитудаполеdouble yfГодовая частотаполеdouble hyaПолугодовая амплитудаполеdouble hyfПолугодовая частотаполеdouble tyaТретьгодовая амплитудаполеdouble tyfТретьгодовая частотаполеunsigned short yТекущий годполеunsigned short mТекущий месяцполеunsigned short dТекущий деньметодvoid put(AnsiString)Задать данные из файламетодdouble get(TDateTime)Получить уровень для выбранной даты

Таблица 4.11 - Структура класса dinmas

Вид членаОписаниеНазначениеполеtype* dataУказатель на массив данныхполеlong sizРазмер массиваметодdinmas()Пустой конструкторметодdinmas(long)Конструкторметод~dinmas()Десрукторметодbool make(long)Управляемый конструктор (выделить память)методvoid clear()Управляемый декструктор (очистить память)методtype& operator[](long)Доступ к элементу массиваметодint bytes()Вывести занимаемую памятьметодvoid insert(type &, int)Вставить элементметодvoid erase(int)Вырезать элементметодpush(type &)Вставить элемент в конецметодpop()Удалить последний элементметодtype& top()Получить последний элементметодbool SaveToFile(AnsiString)Сохранить содержимое в файлметодbool LoadFromFile(AnsiString)Загрузить содержимое из файламетодlong& size()Получить размер массиваметодoperator=(dinmas<type> &)Скопировать массив

Таблица 4.12 - Структура класса dinmas2d

Вид членаОписаниеНазначениеполеtype** dataУказатель на массив данныхполеlong nРазмер по первому измерениюполеlong mРазмер по второму измерениюполеbool existsМассив созданметодdinmas2d()Пустой конструкторметодdinmas2d(long, long)Конструкторметод~dinmas2d()Деструкторметодbool make(long, long)Управляемый конструктор (выделить память)методvoid clear()Управляемый декструктор (очистить память)методtype* operator[](long)Доступ к элементу массиваметодint bytes()Вывести занимаемую памятьметодoperator=(dinmas2d<type> &)Скопировать массивТаблица 4.13 - Структура класса smartcont

Вид членаОписаниеНазначениеполеtype** graphsУказатель на массив данныхполеint _sizeРазмер массиваполеint selectedИндекс выбранного элементаметодsmartcont(int)Конструкторметодsmartcont()Пустой конструкторметодmake(int n)Управляемый конструктор (выделить память)методint &size()Получить размер массиваметодvoid clear()Управляемый деструктор (очистить память)методtype& operator[](int)Получить элемент по индексуметодtype& operator()()Получить выбранный элементметод~smartcont()Деструкторметодinsert(type &value)Вставить элемент по индексуметодinsert()Вставить элемент в выбранное местометодvoid copy()Создать дубликат рядом с выбранным элементомметодvoid erase(int)Удалить элемент по индексуметодvoid erase()Удалить выбранный элементметодbool select(int)Выбрать элементметодint SelectedItem()Получить индекс выбранного элементаметодvoid MoveUp()Переместить элемент вверхметодvoid MoveDown()Переместить элемент вниз

Таблица 4.14 - Структура класса CamItem

Вид членаОписаниеНазначениеполеcoltrol3d ctrlПозиция камерыполеint secsЗанимает секундметодCamItem(coltrol3d, int)КонструкторметодCamItem()Пустой конструктор

Таблица 4.15 - Структура класса CameraSequence

Вид членаОписаниеНазначениеполеcoltrol3d ctrlПозиция камерыполеint secsЗанимает секундметодCamItem(coltrol3d, int)КонструкторметодCamItem()Пустой конструкторВид членаОписаниеНазначениеполеint selectedВыбранный элементполеint secsВсего секундполеint shotsВсего кадровметодdinmas<CamItem> ctrlМассив позиций камерыметодdinmas<double> xДискретный массив отрезков времениметодdinmas<double> y[6]Дискретный массив позиций и углов поворота камерыметодcubic_spline spl[6]Непрервыный массив (кубический сплайн) позиций и углов поворота камерыметодCameraSequence()Пустой конструкторметодvoid insert(coltrol3d, int)Вставить новую камеруметодvoid update(coltrol3d, int)Заменить выбранную камеруметодvoid remove()Удалить выбранную камеруметодcoltrol3d selectedCtrl()Получить выбранную камеруметодvoid countSpline()Расчитать кубическую интерполяцию

Таблица 4.16 - Структура класса RGBpixel

Вид членаОписаниеНазначениеполеGLubyte rКрасный каналполеGLubyte gЗелёный каналполеGLubyte bСиний каналметодRGBpixel(GLubyte, GLubyte, GLubyte)КонструкторметодRGBpixel()Пустой конструкторметодvoid GetPixel(GLubyte &, GLubyte &, GLubyte &)Получить пиксельметодRGBpixel ToBGR()Преобразовать в формат для записи в TGA на 24 битаметодRGBApixel ToBGRA()Преобразовать в формат для записи в TGA на 32 битаВид членаОписаниеНазначениеполеGLubyte aАльфаканалметодRGBApixel(GLubyte, GLubyte, GLubyte, GLubyte)КонструкторметодRGBApixel()Пустой конструкторметодvoid GetPixel(GLubyte &, GLubyte &, GLubyte &, GLubyte &)Получить пиксельметодRGBApixel ToBGRA()Преобразовать в формат для записи в TGA на 32 битаТаблица 4.17 - Структура класса texture

Вид членаОписаниеНазначениеполеbool exsistсуествуетполеbool bindedуже применяетсяполеint widthширинаполеint heightвысотаполеint RealWidthширина, приближённая к степени двойкиполеint RealHeightвысота, приближённая к степени двойкиполеint PixelsQntколичество точекполеint IDидентификационный номер текстуры в OpelGLполеfloat hcoeffотношение height к RealHeightполеfloat wcoeffотношение width к RealWidthполеdinmas<RGBApixel> imageDataмассив точекметодGLubyte correct(float)исправление целочисленного цвета, если он выходит из диапазона 0-255методvoid operator=(texture &)копировать текстуруметодvoid SetPixel(int, int, GLubyte, GLubyte, GLubyte, GLubyte)задать одну точку целыми числамиметодvoid SetPixelf(int, int, float, float, float, float)задать одну точку числами с плавающей точкойметодvoid GetPixel(int, int, GLubyte &, GLubyte &, GLubyte &, GLubyte &)получить одну точкуметодtexture()конструкторметодbool MakeArray(int, int)выделение памяти c проверкой на степень двойкиметодbool MakeArraySimple(unsigned int, unsigned int)выделение памяти в обход проверки на степень двойкиметодbool BindTexture(unsigned int, bool, bool)применение текстурыметодbool SaveToTGA(AnsiString)сохранение в TGAметодbool LoadFromTGA(AnsiString, unsigned int, bool, bool)чтение из TGAметод~texture()деструкторметодvoid DeleteArray()очистить массивметодvoid UnBind()отменить текстуруметодunsigned int GetWidth()Получить ширинуметодunsigned int GetHeight()Получить высотуметодunsigned int GetRealWidth()Получить ширину, ближайшую к степени двойкиметодunsigned int GetRealHeight()Получить высоту, ближайшую к степени двойкиметодunsigned int GetPixelsQnt()Получить число пикселейметодunsigned int GetID()Получить ID текстурыметодbool GetExsist()Узнать, существует ли текстураметодbool GetBinded()Узнать, наложена ли текстураметодfloat GetWCoeff()Получить отношение height к RealHeightметодfloat GetHCoeff()Получить отношение width к RealWidthметодvoid PutWidth(unsigned int)Задать ширинуметодvoid PutHeight(unsigned int)Получить высотуметодvoid PutRealWidth(unsigned int)Получить ширину, ближайшую к степени двойкиметодvoid PutRealHeight(unsigned int)Получить высоту, ближайшую к степени двойкиметодvoid PutPixelsQnt(unsigned int)Получить число пикселейметодvoid PutID(unsigned int)Получить ID текстурыметодvoid PutExsist(bool)Узнать, существует ли текстураметодvoid PutBinded(bool)Узнать, наложена ли текстураметодvoid PutWCoeff(float)Получить отношение height к RealHeightметодvoid PutHCoeff(float)Получить отношение width к RealWidth

Таблица 4.18 - Структура класса DoubleTable

Вид членаОписаниеНазначениеполеdinmas2d<double> dВыходной массив данныхметодDoubleTable(AnsiString)КонструкторметодDoubleTable()Пустой конструкторметодbool Load(AnsiString, char)Прочитать файл, узнав разделительметодdouble* operator[](unsigned int)Доступ к элементу

Таблица 4.19 - Структура класса lamp

Вид членаОписаниеНазначениеполе int lightID источника света в OpenGLполе GLUquadricObj* sunУказатель на объект-солнцеполе GLfloat position[4]Позицияполе GLfloat ambient[4]Внешний светполе GLfloat diffuse[4]Рассеянный светтполе GLfloat specular[4]Отражащий светполе GLfloat attenuationРазмер бликаполе bool activeАктивенполе bool focusedВыбранметод lamp()Пустой конструкторметод lamp(int, float, float, float)Конструкторметод make(int, float, float, float)Задать цвет на позицииметод make(int, float, float, float, float, float, float, float, float, float, float, float, float, bool, bool, float);Задать свет по всем параметрамметод void setlight(int)Установить светметод void put(bool)Включить светметод void view(bool,bool)Показать источник светаметод color(float, float, float, int)Задать цветметод pos(float, float, float)Задать позициюметод SetInfinity(bool)Установить, бесконечный ли светметод SetAttenuation(float)Установить размер бликовметод void border()Показывать рамку на источникеметод SetActive(bool)Активировать

Таблица 4.20 - Структура класса BathPoint

Вид членаОписаниеНазначениеполеpoint3d r,mТочка в географических и нормализованных к 1 координатахполеunsigned int tСколько миллисекунд прошло с начала трекаполеdouble tideВысота прилива в данной точкеметодBathPoint()КонструкторВид членаОписаниеНазначениеполеpoint3d aначалополеpoint3d bконецполеbool zeroне показыватьметодisoline()конструкторметодvoid put(double &, double &, double &, double &, double &, double &, bool &)задатьметодvoid view(int &)показать

Таблица 4.21 - Структура класса figure, потомок класса point3d

Вид членаОписаниеНазначениеполеbool existsпоказыватьполеdouble lengthразмерполеisoline *lineк какой изолинии привязанаполеchar str[8]что отображатьполеint strlдлина строкиполеdouble angleугол разворотаметодvoid activate(double, double)"прилепить" к изолинииметодvoid view(int)показатьполеdouble fуровень для расчёта изолинийполеbool zeroявляетмя ли уровень текущей изолинии нулевымполеfloat material_color[4]массив цвета материалаполеdinmas<OneTri> triнабор треугольников для триангуляцииполеisoline lineбуферная изолиния для работы функции расчёта изолинийполеbool triangulation()произвести триангуляциюполеdinmas<BathPoint> qбатиметрический трекполеdinmas2d<vertex> pбатиметрическая сеткаполеTDateTime startDateдата начала съёмкиполеTDateTime endDateдата конца съёмкиполеvector<isoline> isoвектор изолинийполеdinmas2d<figure> figuresмассив цифрполеdinmas<double> *isolistсписок уровней изолинийполеdouble dшаг сеткиполеdouble sclxyкоэффициент нормализации долготы и широтыполеdouble sclzкоэффициент нормализации высотыполеdouble cfxкоэффициент нормализации долготыполеdouble cfyкоэффициент нормализации широтыполеdouble devсуммарное математическое отклонение данных от исходных в результате сглаживания и расчёта равномерной сеткиполеdouble tmpzнормализованная высота для расчёта цветаполеdouble isoHabaчастота изолинийполеdouble isolineSizeтолщина изолинииполеpoint3d minминимум, нормализованный к 1полеpoint3d maxмаксимум, нормализованный к 1полеpoint3d rmnминимум в географических координатахполеpoint3d rmxмаксимум в географических координатахполеint kчисло строк в текстуре для доступа к ячейке одномерной текстуры по двум координатамполеint blurCountколичество проходов размытияполеint texNumID текстуры в среде OpenGLполеint fighabaРасстояние между подписямиполеint diffBlurколичество проходов размытия для сравнения батиметрийполеint stepпропуск кратных узлов сетки для ускорения отображенияполеAnsiString Filenameимя файлаполеbool texотображение текстуры средставми OpenGLполеbool varIsoпеременный список изолинийполеbool lightingосвещение включенополеbool rtрежим отображения без пропусковполеbool viewPointsотображать трекиполеbool netотображать сеткуполеbool countedсетка уже расчитанаполеbool isolinesотображать изолинииполеbool viewReliefотображать рельефполеbool visibleотображать сеткуполеbool hideFarскрыть удалённые участкиполеbool hideUpLimitскрыть участки, выходящие за границу минимума и максимумаполеbool needRecountтребуется перерасчётполеbool differenceявляется разницей между двумя батиметриямиполеbool blackAndWhiteотображать в чёрнобелых тонахполеbool slgявляется прочитанным slg-файломполеbool hasTideприлив вычтенметодbath()Конструкторметодbool LoadPoints(AnsiString, bool, bool)Чтение точек из ASCII-файламетодbool LoadSlg(DoubleTable &, AnsiString)Чтение трека из slg-файламетодbool MakeEmpty(int)Очистить батиметриюметодvoid CountTide(cubic_spline &)Расчёт приливаметодvoid ReCountMinMax()Вычисление минимума и максимумаметодdouble ReCountMin()Вычисление только минимумаметодbool CountNet(int, point3d, point3d, double, double, double, double, double, int, double, double, int, int, int, dinmas<double> *, bool)Расчёт батиметрической сеткиметодvoid blur(int)размытиеметодvoid deviation()расчёт отклоненияметодinline __fastcall void CountColor(int &, int &)Расчёт цвета для выбранного узла сеткиметодvoid ReCountColor()Перерасчёт цветаметодinline __fastcall void CountNorm(int &, int &)Вычисление нормалейметодvoid DefConstr()Конструктор (в виде вызываемой функции)методvoid OneVertex(int &, int &)Вывод одного узла сетки на экранметодvoid view()Вывод всей батиметрииметодvoid ViewPoints()Вывот трековметодdouble cf(double &, double &, double &, bool)Линейная интерполяцияметодvoid makeLine(int &, int &)Создание одной изолинииметодvoid ViewFigures(int)Отображение цифр-подписейметодvoid countOneIso(double)Расчёт одного слоя изолинийметодvoid countIso(double, dinmas<double> *, bool)Расчёт всех изолинийметодvoid CountFigures(int)Расчёт цифр-подписейметодvoid viewIso()Отображение изолинийметодvoid EraseNet()Удаление расчитанной батиметрической сеткиметодbool GetDiffer(bath &, bath &, int, double, int)Вычисление разницы между двумя батиметриямиметодbool GetDifferPoints(bath &, double)Вычислениеметодbool ReBindTexture()Наложение текстурыметодbool SaveNet(AnsiString)Сохранение сетки в ASCII-форматеметодbool SaveANI(AnsiString, double)Сохранение данных в формате.inf и.dat для программы ANIметодbool SavePointsGoogle(AnsiString)Сохранение набора точек для отображения в прорамме Google Chromeметодbool SaveTrack(AnsiString)Сохранение трека для отображения в прорамме Google Chromeметодbool SavePoints(AnsiString)Сохранение набора точек в ASCII-формате в географических коордиантахметодbool SavePointsMer(AnsiString)Сохранение набора точек в ASCII-формате в координатах меркатораметодbool SaveNetGoogle(AnsiString, int)Сохранение батиметрической карты для отображения в прорамме Google Chromeметодvoid setConstantPreset(bath &)Получение всех статических переменных батиметрии из другойметодoperator=(bath &)Полное копирование батиметрии из другойТаблица 4.22 - Структура класса glWindow

Вид членаОписаниеНазначениеметодLRESULT CALLBACK (*WindProc)(HWND,UINT,WPARAM,LPARAM)Функция обработки сообщений окнаполеAnsiString titleЗаголовок окнаполеHINSTANCE hInstanceСодержит экземпляр приложенияполеGLuintметодGLvoid KillGLWindow(GLvoid)Закрыть окнометодBOOL CreateGLWindow(char*, int, int, int, bool)Создать окнополеHDC hDCПриватный контекст устройства GDIполеHWND hWndСодержит handle окна типа hWndполеHGLRC hRCТекущий контекст воспроизведенияполеHANDLE HСодержит handle окна типа HANDLEполеint winWШирина окнаполеint winHВысота окнаполеint winLСмещение окна слеваполеint winTСмещение окна сверхуполеbool killedЗакрыто ли окнометодglWindow()Пустой конструкторметодglWindow(int, int, AnsiString, LRESULT CALLBACK (*wp)(HWND,UINT,WPARAM,LPARAM))Конструкторметодvoid make(int, int, AnsiString, LRESULT CALLBACK (*wp)(HWND,UINT,WPARAM,LPARAM))Управляемый конструкторметодvoid __fastcall Execute()Запуск окнаметодbool ConnectGlToWindow()Подключить к окну параметры OpenGL

4.2 Характеристика и структура интерфейса проекта


Интерфейс приложения состоит из двух окон, не считая стандартных всплывающих диалоговых окон и окон сообщений. Окно настроек (по-умолчанию слева) содержит все средства управления программой, кроме настроек положения, угла поворота и масштаба камеры. Данное окно реализовано средствами VCL в среде C++ Builder при помощи стандартных компонентов VCL и (в большей степени) компонетов библиотеки Raize. Окно отображения выводит результаты работы на экран и представляет собой окно, реализованное средствами Windows API, связанной контекстом воспроизведения с OpenGL. Данное окно позволяет вращать и масштабировать сцену.

Модуль «soko_code.cpp» проекта приложения имеет принципиальное значение и реализует базисный функционал системы. В графическом интерфейсе системы данный модуль реализует главное окно настроек приложения.


.2.1 Главное окно

Главная форма приложения MainForm принадлежит к типу TForm и содержит в себе остальные элементы интерфейса. При закрытии формы, если в программе были произведены изменения, возникнет диалоговое окно с вопросом, сохранить ли изменения в редактируемом файле. Главное окно содержит строку меню, панель инструментов и две сворачиваемые панели - панель сцены и панель батиметрии. Панель сцены состоит из двух частей: верхняя часть содержит элементы управления камерами, нижняя - группы настроек текущей сцены. Панель батиметрии также состоит из двух частей: верхняя часть содержит список батиметрических треков и панель управления ими, нижняя - группы настроек выбранного трека.


Таблица 4.23 - Состав основных компонентов главного окна

Название компонентыТип компоненты НазначениеTMainMenuMainMenuГлавное меню. Содержит пункты управления открытием, сохранением, испортом и экспортом данных.TRzToolbarMainToolBarГлавная панель инструментов. Повторяет функции главного меню.TRzSizePanelViewPanelСодержит элементы управления всей сценой.TRzSizePanelBathsPanelСодержит элементы управления списком треков и выбранной батиметриейTRzListBoxCameraListСписок камер для рендеринга видеоTRzToolbarCameraListEditToolBarПанель управления камерами, позволяет добавлять, удалять, заменять камерыTRzGroupbarCameraGroupBarГруппа управления камерамиTRzGroupbarSceneGroupBarГруппа управления сценойTRzCheckListPointsListСписок трековTRzToolbarTrackListEditToolBarПанель управления списком треков, позволяет импортировать и экспортировать данные, объединять и разделять треки.TRzGroupbarBathsGroupBarГруппа управления выбранной батиметрией

4.2.2 Главное меню

Главное меню содержит пункты управления файлами: окрытия, сохранения, импорта и экспорта. Также имеется возможность выйти из приложения, предварительно сохранив изменения с помощью всплывающего окна.


Таблица 4.24 - Состав компонентов главного меню

Название компонентыТип компоненты НазначениеMainMenuTMainMenuОсновной объект главного менюMenuFileTMenuItemПукт «файл», сохранение и открытие батиметрических сцен.MenuNewTMenuItemСоздать новую сцену / сбросить все настройкиMenuOpenTMenuItemОткрыть сценуMenuSaveTMenuItemСохранить текущую сценуMenuSaveAsTMenuItemСохранить новую сценуMenuSpacerTMenuItemРазделительMenuExitTMenuItemВыйти из программыMenuDataTMenuItemПункт «дата», управление импортом и экспортом данных.MenuImportTMenuItemИмпортировать данныеMenuExportTMenuItemЭкспортировать данные

4.2.3 Группа «границы»

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


Таблица 4.25 - Состав компонентов группы «границы» (выборочно)

Название компонентыТип компоненты НазначениеBordersGroupTRzGroupОбъект данной группыBordersTRzPanelПанель, ограничивающая редактирование группы в случае наличия хотя бы одной расчитанной батиметрической сетки.GetFromPointsTRzBitBtnКнопка, позволяющая автоматически получить границы из текущего набора батиметрических трековPlMinYTRzSpinEditМинимальная широтаPlMaxYTRzSpinEditМаксимальная широтаPlMinXTRzSpinEditМинимальная долготаPlMaxXTRzSpinEditМаксимальная долготаPlMinZTRzSpinEditМинимальная глубинаPlMaxZTRzSpinEditМаксимальная глубинаPlSclZTRzSpinEditМасштабирование глубиныPlaceBoxTRzComboBoxСписок доступных районов для вычисления прилива и сезонных гармонических колебанийSeparationTypeTRzRadioGroupГруппа, позволяющая выбрать тип задания сетки: с помощью деления выбранного прямоугольника на определённое число узлов сетки, либо задание шага вручнуюPlNTRzSpinEditЧисло узлов сетки по максимальному измерениюStepTRzSpinEditШагStepTypeTRzComboBoxТип задания узлов сеткиBorderLinesTCheckBoxПоказывать границыLinesTRzCheckBoxПоказывать линейкиMeasurmentTRzRadioGroupОтбражать градусную или километровую сетку

С использованием группы «границы» могут быть выполнены следующие основные действия:

Автоматическое задание границ равномерной сетки

Корректировка границ на местности

Установка диапазона глубин

Корректировка масштабирования по высоте

Установка размера и шага батиметрической сетки

Установка названия участка местности для вычисления прилива

Управление внешним видом градусной или киломентровой сетки


4.2.4 Группа «рельеф»

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

Таблица 4.26 - Состав компонентов группы «рельеф» (выборочно)

Название компонентыТип компоненты НазначениеSurfceGroupTRzGroupОбъект данной группыHideUpLimitTCheckBoxОпция, позволяющая скрывать участки рельефа, не вошедшие в диапазон глубинNetTCheckBoxПоказывать рельеф в виде сеткиPreviewSpinTRzSpinEditКратный пропуск узлов сетки, используется для ускорения просмотраReliefTCheckBoxОпция, позволяющая отображать и скрывать рельефViewPointsTCheckBoxОпция, позволяющая отображать и скрывать батиметрические треки

4.2.5 Группа «свет и цвет»

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


Таблица 4.27 - Состав компонентов группы «свет и цвет» (выборочно)

Название компонентыТип компоненты НазначениеColorAndLightGroupTRzGroupОбъект данной группыBackColorTRzColorEditОбъект редактирования цвета фонаLightingTCheckBoxВключить или отключить динамическое освещениеHotspotsTCheckBoxВключить или отключить блики (режим с бликами требует повышенных ресурсов графической системы)BlackAndWhiteTCheckBoxЧёрно-белый или цветной режимLightUVTRzSpinEditУгол поворота источника светаLightWTRzSpinEditУгол наклона источника света

4.2.6 Группа «изолинии»

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

Таблица 4.28 - Состав компонентов группы «изолинии» (выборочно)

Название компонентыТип компоненты НазначениеIsolinesGroupTRzGroupОбъект данной группыVarIsoTRzRadioGroupОпция, задающая режим постоянной или переменной частоты изолинийIsolinesTCheckBoxОтображать или скрывать изолинииIsolineSizeTRzSpinEditТолщина изолинийIsolineListOpenTRzToolbarButtonКнопка, позвляющая загрузить список уровней изолиний из файла при режиме переменной частотыIsoHabaTRzSpinEditЧастота изолиний при режиме постоянной частотыIsolineListTRzComboBoxСписок переменных уровней изолиний, получаемый после загрузки из файла

4.2.7 Группа «цифры»

Следующая группа на панели сцены отвечает за настройку цифр-подписей. Имеется возможность задать размер и частоту подписей.


Таблица 4.29 - Состав компонентов группы «цифры» (выборочно)

Название компонентыТип компоненты НазначениеFiguresGroupTRzGroupОбъект данной группыFiguresSizeTRzSpinEditВидимый размер цифр-подписейFiguresFreqTRzSpinEditЧастота расположения цифр-подписей на батиметрической сеткеFiguresCheckTRzCheckBoxОтображать или скрывать цифры-подписи

4.2.8 Группа «общие настройки»

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

Таблица 4.30 - Состав компонентов группы «общие настройки» (выборочно)

Название компонентыТип компоненты НазначениеMainOptionsGroupTRzGroupОбъект данной группыPlaceWindowTRzCheckBoxОпция, позволяющая выбрать, привязывать ли окно отображения к окну настроекScaleFigureSizeTRzSpinEditРазмер цифр шкалы глубин справа в пикселах

4.2.9 Группа «правка трека»

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


Таблица 4.31 - Состав компонентов группы «правка трека» (выборочно)

Название компонентыТип компоненты НазначениеTrackEditGoupTRzGroupОбъект данной группыPointIndTRzSpinEditНомер выбранной точкиViewOnePointTCheckBoxВыделять на экране выбранную точкуPointsCountTRzEditПоле, отображающее общее число точекPointXTRzSpinEditПоле для изменения текущей широты точкиPointYTRzSpinEditПоле для изменения текущей долготы точкиPointDepthTRzSpinEditПоле для изменения текущей глубины точкиPointDepthFinTRzSpinEditПоле для задания глубины с помощью градиента. При режиме абсолютных координат предыдущее поле выступает в качестве начального значения, а данное в качестве конечного. Смещение глубин рассчитывается с помощью линейной интерполяцииAbsoluteTRzCheckBoxРежим смещения в абсолютных или относительных координатахReplaceTRzBitBtnПроизвести смещение всего трека4.2.10 Группа «прилив»

Вторая группа на панели батиметрий отвечает за расчёт прилива. Прилив расчитывается по-умолчанию без задействования данной группы, путём выбора местности в группе «границы», однако данная группа позволяет просматривать и изменять дату начала и конца трека, отключать вычет прилива и производить его перерасчёт при изменении местности.


Таблица 4.32 - Состав компонентов группы «прилив» (выборочно)

Название компонентыТип компоненты НазначениеTideGroupTRzGroupОбъект данной группыHasTideTRzCheckBoxОпция, включающая режим вычитания приливаTideCountTRzBitBtnПроизвести перерасчёт приливаStartDateTRzDateTimeEditУправление датой начала съёмкиStartTimeTRzDateTimeEditУправление временем начала съёмкиEndDateTRzDateTimeEditУправление датой конца съёмкиEndTimeTRzDateTimeEditУправление временем конца съёмки

4.2.11 Группа «расчёт»

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


Таблица 4.33 - Состав компонентов группы «расчёт» (выборочно)

Название компонентыТип компоненты НазначениеCountGroupTRzGroupОбъект данной группыCountBtnTRzBitBtnКнопка расчёта батиметрической сеткиDeleteNetTRzBitBtnКнопка удаления сетки из объекта трекаMaxRadTRzSpinEditМаксимальный радиус, при котором между смежными данными будет построена сеткаMaskBlurCountTRzSpinEditЧисло проходов размытия сетки

4.2.12 Группа «разность»

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


Таблица 4.34 - Состав компонентов группы «разность» (выборочно)

Название компонентыТип компоненты НазначениеDifferenceGroupTRzGroupОбъект данной группыDiffListTRzComboBoxСписок батиметрий для сравненияDiffBtnTRzBitBtnКнопка расчёта разностиDiffRangeTRzSpinEditПоле задания радиуса обрезания участков, находящихся вне пересечений треков двух выбранных батиметрийNokosuTRzBitBtnКнопка, выполняющая обрезание вышеназванных участковDiffBlurTRzSpinEditЧисло проходов размытия сетки

4.2.13 Список треков

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

Таблица 4.35 - Состав компонентов списка треков и кнопки управления им

Название компонентыТип компоненты НазначениеPointsListTRzCheckListСписок треков. Позволяет отметить опцией любой трек, что отображает либо скрывает его.TrackListEditToolBarTRzToolbarСписок батиметрий для сравненияPointsOpenTRzToolbarButtonИмпорт трековPointsDeleteTRzToolbarButtonУдаление выбранного трекаCopyButtonTRzToolbarButtonКопирование трекаExportTRzToolbarButtonЭкспорт выбранного трекаConnectVisibleTRzToolbarButtonОбъединить отмеченные треки в одинSeparateTRzToolbarButtonРазделить треки на точке, отмеченной как «текущая» в группе «правка трека»RenameButtonTRzToolbarButtonПереименовать трекBathUpTRzToolbarButtonПереместить трек вверхBathDownTRzToolbarButtonПереместить трек вниз

4.2.14 Камеры

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


Таблица 4.36 - Состав компонентов списка треков и кнопки управления им

Название компонентыТип компоненты НазначениеCameraListTRzListBoxСписок камерCameraAddTRzToolbarButtonДобавить камеруCameraDeleteTRzToolbarButtonУдалить выбранную камеруCameraUpdateTRzToolbarButtonОбновить выбранную камеру на текущуюCameraReloadTRzToolbarButtonУстановить текущую камеру как выбраннуюCameraPlayTRzToolbarButtonПредварительный просмотр видеоResetCameraTRzToolbarButtonОбнулить текущую камеруShotButtonTRzToolbarButtonСохранить изображениеSaveVideoTRzToolbarButtonСохранить видеоCameraGroupBarTRzGroupBarПанель групп для камерыCameraGroupTRzGroupГруппа камерPerspectiveTCheckBoxУстановить перспективную или ортогональную проекциюCameraSmoothTCheckBoxСглаживание движения камерыShotWidthTRzSpinEditШирина экрана для сохраненияShotHeightTRzSpinEditВысота экрана для сохраненияCameraFrameRateTRzSpinEditЧастота кадров в секундуCameraSecsTRzSpinEditКоличество миллисекунд, за которые будет показана выбранная позиция камеры в видеоCameraStatTRzStatusBarПанель для вывода сообщений о размере видео и общем количестве кадров

4.2.15 Обращение к программе

Вызов и загрузка программы осуществляется запуском исполняемого файла Soko.exe. Исполняемый файл должен находится в одной папке с набором дополнительных консольных приложений и директорий, содержащих файловую базу данных к ней (в соответствии со схемой программы, приведённой в приложении 1 на рисунке 1.10).

Входные данные

Входными данными приложения являются:

) батиметрические треки, получаемые посредством съёмки с помощью картплоттера-эхолота;

) береговые треки, получаемые с помощью GPS-навигатора;

) название региона и его координаты для определения уровня прилива и сезонных изменений уровня моря;

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

Выходные данные

Выходными приложения являются:

) батиметрические карты и карты разницы для выбранных участков в чёрно-белом и цветом варианте;

) изображения трёхмерных срезов батиметрических данных, показанные с определённого ракурса;

) видео-файлы, представляющие собой съёмку трёхмерной батимет-рической карты с различных ракурсов;

) батиметрические треки и сетки, готовые для отображения в про-грамме Google Earth;

) батиметрические сетки в формате.inf для обработки в программном комплексе ANI.


4.3 Сообщения, выдаваемые программисту


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

"Сохранить изменения в файле <имя файла> перед закрытием?";

"Ошибка чтения файла";

"Ошибка чтения таблицы";

"Файл не может быть открыт";

"Файл не содержит корректных данных";

"Сетка не рассчитана";

"Ошибка записи";

"Ошибка чтения";

"Ошибка массива";

"Невозмоно создать контекст устройства OpenGL";

"Не найден подходящий формат пиксела";

"Невозможно установить формат пиксела";

"Невозможно создать контекст воспроизведения OpenGL";

"Контекст воспроизведения OpenGL не может быть активирован";

"Ошибка создания текстуры".

"Ошибка выделения памяти"

"Дата начала больше даты конца"

5. РУКОВОДСТВО ОПЕРАТОРА


.1 Назначение


Система обеспечивает выполнение следующих основных функций:

Импорт батиметрическиз данных из исходных треков, получаемых с картплоттера-эхолота, береговых линий из GPS-навигатора а также загрузка сторонних искусственно созданных данных.

Совмещение, компоновка и редактирование данных, исправление ошибок.

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

Построение и импорт батиметрических карт.

Построение карт сравнения динамики рельефа.

Экспорт данных в различные форматы.

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


5.2 Условия эксплуатации


Разрабатываемая система предназначена для использования на персональных IBM-совместимых компьютерах с центральным Intel-совместимом процессором с частотой работы не менее 1ГГц, оперативным запоминающим устройством объёмом не менее 512 Мб, свободным дисковым пространством не менее 25 Мб для хранения программного обеспечения и 500 Мб для хранения промежуточных данных. Обязательным условием является наличие манипулятора типа «мышь», SVGA-адаптера, совместимого с библиотекой OpenGL и монитора с разрешением не менее 1024х768.

5.3 Выполнение программы


Схема компонентов программы приведена на рисунке 1.10 в приложении 1. Для запуска программы необходимо наличие в каталоге указанных на данной схеме консольных приложений.

После запуска программы открывается два окна - окно настроек слева и окно отображения справа (см. приложение 1, рисунок 3.1).

Окно насроек предоставляет интерфейс ко всем функциональным возможностям программы, кроме управления текущей камерой, которое осуществляется в окне отображения. Окно разделено на несколько логических блоков. Любой элемент интерфейса окна настроек можно масштабировать и сворачивать. Имеется строка меню, панель инструментов и две сворачиваемые панели - панель сцены и панель батиметрии. Панель сцены состоит из двух частей: верхняя часть содержит элементы управления камерами, нижняя - группы настроек текущей сцены. Панель батиметрии также состоит из двух частей: верхняя часть содержит список батиметрических треков и панель управления ими, нижняя - группы настроек выбранного трека. Особенностью интерфейся приложения являются группы - сворачиваемые наборы настроек, объединённые общим назначением. Список доступных групп перечислен в таблице 99.


Таблица 5.1 - Группы интерфейса

Название НазначениеРасположениеГраницыПостоянные настройки батиме трической сетки, границы, частота сетки, местностьЛевая панельРельефВнешний вид рельефа батиметрической картыЛевая панельСвет и цветНастройка освещения и цветов в программеЛевая панельИзолинииНастройка изолиний: расположения, частоты, толщинЛевая панельЦифрыНастройка цифр-подписей на карте: размера, частотыЛевая панельОбщие настройкиОбщие настройки приложенияЛевая панельПравка трекаПравка отдельных точек, смещение всего трекаПравая панельПриливВычисление и исправление приливовПравая панельРасчётРасчёт батиметрической сеткиПравая панельРазностьВычисление разностей батиметрийПравая панельКамераСоздание одиночных изображений и динамическихЛевая панель (сверху)

После запуска программы следует нажать первую кнопку с изображением папки в самом верху панели «батиметрии». Это откроет диалоговое окно импорта исходных данных.

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

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

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

Если исходные данные не были загружены в момент запуска, следует импортировать батиметрические данные. Для этого можно выбрать пункт меню Файл?Импорт, либо нажать на изображение папки в правой панели под пустым списком треков - откроется диалоговое окно импорта исходных данных.

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


Таблица 5.2 - Форматы импорта

Название форматаРасширенияASCII координаты эхолота, глубина положительная*.txt;*.datASCII координаты эхолота, глубина отрицательная*.txt;*.datASCII координаты в градусах, глубина положительная*.txt;*.datASCII координаты в градусах, глубина отрицательная*.txt;*.datLowrance SLG*.slgLowrance SLG преобразованный*.txtGPS eXchange*.gpxТрек пути из Google*.kmlПромеры пляжа*.csv

Предположим, импортируются исходные треки в формате slg. После их загрузки на экране появится изображение. Иногда приборы могут выдать ошибочные данные, что можно легко заметить по резкому перепаду высот. Чтобы устранить ошибки, в группе «правка трека» следует установить флажок «показать», тогда будет выделена выбранная точка (см. рисунок 12). Следует изменить высоту всех ошибочных точек, если таковые имеются.

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

В программе уже хранятся настройки по-умолчанию, обеспечивающие корректный расчёт равномерной сетки. При необходимости, воспользовавшись группой «границы», можно сделать дополнительные настройки: установить частоту будущей сетки, задать пользовательские границы с помощью полей ввода, изменить масштабирование по глубине (по-умолчанию 50 раз), изменить диапазон глубин. В группе «расчёт» имеется возможность установить пользовательское число проходов размытия перед расчётом. В группе «изолинии» имеется возможность установить пользовательскую частоту изолиний. В группе «цифры» - пользовательские настройки цифр-подписей.

После нажатия кнопки «расчёт» следует подождать некоторое время. Отключится часть группы «границы», а к видимым трекам добавится рассчитанная сетка.

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

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


Таблица 5.3 - Форматы импорта

Название форматаРасширенияМатрица высот для MathCad *.grdМатрица высот для Google *.kmlНабор точек в географических координатах с положительной глубиной *.txtНабор точек для Google*.kmlНабор точек в координатах меркатора с отрицательной глубиной*.txtТрек пути для Google*.kmlМатрица для ANI*.inf

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

Для сохранения и загрузки всего состояния системы, сдедует использовать пункты меню «открыть» и «сохранить как…». Данные сохраняются в формате.soko, разработанном специально для данного приложения.

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

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


.4 Сообщения, выдаваемые оператору


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

"СОКО - сохранение точек";

"СОКО - расчёт триангуляции";

"СОКО - чтение треугольников";

"СОКО - треугольники прочитаны";

"СОКО - временные файлы удалены";

"СОКО - Чтение ASCII";

"СОКО - Чтение slg";

"СОКО - триангуляция";

"СОКО - триангуляция завершена";

"СОКО - создана сетка";

"СОКО - не создана буферная сетка";

"СОКО - создана буферная сетка";

"СОКО - создана текстура";

"СОКО - обнуление сетки";

"СОКО - расчёт треугольников";

"СОКО - расчёт цвета и нормалей";

"СОКО - наложение текстуры";

"СОКО - размытие <номер трека>";

"СОКО - расчёт ошибки";

"СОКО - расчёт цвета";

6. ПРОГРАММА И МЕТОДИКА ИСПЫТАНИЙ


.1. Объект испытаний


.1.1 Наименование системы

Наименование системы - Приложение «SOKO».


6.1.2 Назначение системы

Система обеспечивает выполнение следующих основных функций:

Ускорение, упрощение и автоматизация чтения и подготовки исходных данных из различных форматов.

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

Быстрое построение батиметрической карты в процессе её съемки на основе имеющихся данных

Экспорт данных в различные графические, текстовые и двоичные форматы.


6.2 Цель испытаний


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


6.3 Требования к программе


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

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

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


6.4 Требования к программной документации


При испытании системы использовались следующие документы:

техническое задание;

руководство оператора;

руководство программиста.


6.5 Состав и порядок испытаний


.5.1 Технические средства, используемые во время испытаний

Тестирование проводилось на рабочих станциях локальной компьютерной сети предприятия. Компьютеры, используемые для тестирования, соответствуют следующей спецификации: IBM PC совместимый персональный компьютер, оснащённый процессором с тактовой частотой не менее 2,7 ГГц, оперативной памятью не менее 8 Гб, графической подсистемой с памятью не менее 2 Гб, устройствами ввода (клавиатура и манипулятор мышь).

6.5.2 Программные средства, используемые во время испытаний

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

операционная система Microsoft Windows XP (32-битная), Windows 7 (32-битная), Windows 7 (64-битная);

среда разработки Borland C++ Builder.


6.5.3 Порядок испытаний

Испытания программы проводились в следующем порядке:

испытание на корректность (адекватно ли программа реагирует на ввод-вывод информации);

испытание на правильность (соответствуют ли полученные результаты ожидаемым);

испытание на надежность (процент отказов и сбоев системы).


6.6 Методы испытаний


.6.1 Проверка на корректность

После запуска исполняемого файла Soko.exe на экране появляются окно отображения и настройки (рисунок 3.1). В окне настроек предлагается произвести импорт исходных данных. В случае открытия неподходящего файла, пользователь получает соответственное сообщение (рисунок 3.2) и может продолжить работу с программой.

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

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

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

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

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


Таблица 6.1 - Проверка на корректность

ПроверкаРабочая операцияПричина ошибочной ситуацииСпособ устраненияКорректность обработки заданного размера сетки (рис. 3.6, рис. 3.7)Расчёт батиметрической сеткивведено слишком большое числоВвести меньшее число, такое, чтобы программа смогла ввыделить соответствующий участок памятиКорректность вычисления приливаВычисление приливаДата начала больше даты конца трекаУстановить дату начала меньше даты конца трекаКорректность октрытия файлаОткрытие импорт файловФайл повреждён или имеет неверные данныеОткрыть другой файл

6.6.2 Проверка на правильность

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

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

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


6.6.3 Проверка на надежность

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

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

7. ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКАЯ ЧАСТЬ


.1 Расчет трудоемкости разработки программного обеспечения


В качестве объекта расчета взят вариант создания программного обеспечения, разработанного с использованием среды программирования Borland C++ Builder 6.

Проведем расчёт затрат времени на выполнение работ по созданию программного обеспечения, в котором выделим два этапа:

составление необходимого перечня работ и их кодирование;

установление оценок времени продолжительности работ.

В данном случае была использована система с оптимистической и пессимистической оценками времени. Исходя из оценок, определяется ожидаемое время продолжительности каждой работы по формуле (7.1).


, (7.1)


где tmin - оптимистическая оценка, при наиболее благоприятных условиях, tmax - пессимистическая оценка, при неблагоприятных условиях.

Рассчитаем трудоемкость разработки программного обеспечения.

Расчёт трудоемкости приведен в таблице 7.1. В результате предполагаемая продолжительность работы составляет 101 человеко-день.


Таблица 7.1 - Расчет трудоемкости программного обеспечения и оптимизация на основе экспертных оценок

Формулировка работыВероятностные оценкиtmintmaxtожПостановка задачи243Сбор данных о предметной области203025Оформление ТЗ242,8Разработка метода реализации задачи304035Формирование структуры программного обеспечения575,8Разработка структуры файловой базы данных121,2Разработка графических модулей для работы с OpenGL (освещение, камера, текстуры и прочие)121513,5Разработка контейнерных типов данных486Разработка ядра системы - модуля работы с батиметрией152013,5Разработка интерфейса пользователя101512Комплексное тестирование и отладка системы6107Документирование системы5107Итого88127101

7.2 Определение себестоимости разработки программы


Стоимость разработки программы состоит в общем виде из затрат на разработку модулей информационной системы. Себестоимость разработки включает в себя следующие статьи расходов:

материальные затраты;

затраты на оплату труда разработчику;

отчисления во внебюджетные фонды;

налог на имущество;

затраты на электроэнергию;

расходы по эксплуатации оборудования;

общехозяйственные расходы;

прочие расходы.

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

Затраты на оплату труда разработчиков программы рассчитываются на основе данных о тарифных ставках, трудоемкости подготовки программного обеспечения и совокупности доплат и надбавок работникам. Трудоемкость разработки программного обеспечения рассчитывается в человеко-часах и определяется на базе скорректированных отчётных данных по аналогичным работам.

Норматив отчислений на страхование для бюджетных организаций производится в размере 34% от общего фонда заработной платы.

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

Общехозяйственные расходы составляют 75% от затрат на оплату труда разработчиков, прочие расходы - 10%.


7.2.1 Расчёт материальных затрат

В таблице 7.2. представлены данные о материалах, используемых для решения поставленной задачи.


Таблица 7.2 - Материальные затраты

Наименование материалаКоличество комплектов, шт.Цена комплекта, р.Сумма затрат, р. Картридж для принтера11 2001 200 Бумага для принтера1180180 Итого1 380

7.2.2 Затраты на оплату труда разработчика и налоговые отчисления

Месячная зарплата программиста - 21000 р.

Дневная зарплата программиста (21 рабочий день в месяце) - 1 000 р.

Тогда при трудоемкости 101 человеко-день оплата труда программиста по разработке системы составляет 101 000 р.

Отчисления во внебюджетные фонды при трудоемкости 104 ч/дн составляют 34% от зарплаты программиста (в рублях): 0,34?101000 = 34340.


7.2.3 Расходы на эксплуатации оборудования

Затраты на электроэнергию

Основным оборудованием, используемым при разработке системы, являются персональный компьютер (потребляемая мощность данного устройства составляет около 0,5 кВт), печатающее устройство (принтер), потребляемая мощность которого составляет 0,02 кВт.

Средняя стоимость 1 кВт/час для предприятий составляет 3,72 р.

При трудоемкости 101 ч/дн компьютеры использовались 808 часа, принтер эксплуатировался около 19 часов.

В итоге затраты на оплату электропитания составили:

для компьютера: 0,5?808?3,72 = 1502,88,

принтера: 0,02*19*3,72 = 1,41.

Амортизационные отчисления

При годовой амортизации в 12,5%, дневная амортизация оборудования равна 12,5/365 = 0,034%.

Стоимость компьютера с установленным системным программным обеспечением составляет 40 000 р. При указанной выше дневной амортизации и при условии использования серверного компьютера в течение 101 ч/дня, суммарная амортизация за период разработки системы составила 101?40000?0,00034 = 1373,6.

Стоимость принтера Hewlett Packard HP LaserJet 1010 составляет 3000 рублей. При указанной выше дневной амортизации и при условии использования этого устройства в течение 19 ч. (0,79 дня), суммарная амортизация за период разработки системы составила 0,79*3000*0,00034 = 0,80.

Обобщение расходов на эксплуатацию оборудования дано в таблице 7.3.


Таблица 7.3 - Расходы по эксплуатации оборудования при трудоёмкости 104 человека-дня

Вид оборудованияВремя использования, дн.Электроэнергия, р.Амортизационные отчисления, р.Суммарные затраты, р.Клиентский IBM PC1011502,91373,62977,5Лазерный принтер HP LaserJet 10100,791,410,83Итого1504,31374,42980,5

7.2.4 Общехозяйственные и прочие расходы

Общехозяйственные расходы составляют 75% от затрат на оплату труда разработчика. Таким образом, при трудоемкости разработки в 104 ч/дня данная статья расходов будет равна 101000 ? 0,75 = 75 750.

Прочие расходы составляют 10% от затрат на оплату труда разработчика, и равны 101000*0,10 = 10 100.


7.2.5 Расчет общей себестоимости разработки


Общие затраты на разработку комплекса сведены в таблицу 7.4.


Таблица 7.4 - Общие затраты на разработку комплекса

Наименование статьи расходаСумма, р.Материальные затраты1 380,00Затраты на оплату труда разработчика101 000,00Единый социальный налог34340,00Расходы по эксплуатации оборудования2 980,5Общехозяйственные расходы75 750,00Прочие расходы10 100,00Итого225 550,507.3 Капитальные вложения по внедрению системы


Для внедрения системы необходимо закупить более мощный компьютер, чем до него. Стоимость аппаратного обеспечения вместе с установленной на каждый из компьютеров операционной системой Microsoft Windows XP составляет 57 000 р.

Ремонт и обслуживание составляют 2% от стоимости оборудования и оцениваются в 57000 ? 0,02 = 1140.

Рассчитаем затраты на электроэнергию при внедрении системы.

Мощность компьютера составляет 0,5 кВт. Стоимость 1 кВт/час - 3,72 р. Представим, что обработка батиметрических данных необходима лаборатории каждый день. Тогда для создания одной батиметрической карты в день потребуется не более 30 минут = 0,5 часа в день.

,72 ? 0,5 ? 0,5 ? 500 = 465 в год на один компьютер.

Рассчитаем зарплату персонала. Работой с системой занимается 1 техник. Годовая заработная плата техника составляет 12 ? 18 000 = 216000. Согласно должностной инструкции время, потраченное на работу с системой, составляет 5% от общего фонда времени. Значит, стоимость обслуживания системы за год составляет 216000 ? 0,05 = = 10800. Подведем итог в таблице 7.5.


Таблица 7.5 - Суммарные затраты на эксплуатацию системы

НаименованиеСтоимость, р.Расходы на электроэнергию465Ремонт и обслуживание1 140Оплата персонала10 800,00Итого12 4057.4 Расчет годовой экономии от эксплуатации


7.4.1 Расчет годовых расходов при неавтоматизированном создании батиметрических карт

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

Оценим затраты на оплату труда. Средняя месячная заработная плата техника лаборатории с требуемой квалификацией составляет 18 000 р. Оплата за 1 год составляет 18 000 ? 12 = 216000.

Оценим затраты на оплату труда. Средняя месячная заработная плата лаборанта кафедры с требуемой квалификацией составляет 18 000 р., младшего научного сотрудника- 25 000 р.

Оплата за 1 год на двух работников составляет 43 000?12 = 516 000.

Отчисления во внебюджетный фонд (34%) составляют 516 000? 0,34 = = 175 440.

Общехозяйственные расходы от затрат на оплату труда (75%) составят 516 000? 0,75 = 387 000.

Прочие расходы от затрат на оплату труда (10%): 516 000 ? 0,1 = = 51 600.

При необходимости печатать одну батиметрическую карту в день при 250 рабочих днях в году, в год требуется 0,5 упаковки бумаги для принтеров в 500 листов стоимостью 180 руб. При стоимости картриджа для цветного принтера в 3290 руб., его ресурс 2200 страниц, тоесть 250/2200=11% запаса картриджа в год.

Таблица 7.6 - Затраченные материальные ресурсы при неавтоматизированном способе управления

Наименование материалаКоличество, шт.Цена комплекта, руб.Годовые затраты, руб. Картридж для принтера0,113290361,9 Бумага для принтера0,518090 Итого451,9

7.4.2 Расчет годовых расходов при автоматизированном создании батиметрических карт

Оценим затраты на оплату труда. Средняя месячная заработная плата техника лаборатории с требуемой квалификацией составляет 18 000 р.

Оплата за составляет 18 000 ?12 = 216 000.

Отчисления во внебюджетный фонд (34%) составляют: 216 000?0,34 = =73440.

Общехозяйственные расходы (75%) составят 216 000 ? 0,75 = 162 000. Прочие расходы (10%) составят 216 000 ? 0,1 = 21 600.

При необходимости печатать одну батиметрическую карту в день при 250 рабочих днях в году, в год требуется 0,5 упаковки бумаги для принтеров в 500 листов стоимостью 180 руб. При стоимости картриджа для цветного принтера в 3290 руб., его ресурс 2200 страниц, тоесть 250/2200=11% запаса картриджа в год.


Наименование материалаКоличество, шт.Цена комплекта, руб.Годовые затраты, руб. Картридж для принтера0,113290361,9 Бумага для принтера0,518090 Итого451,9

Сделаем сравнение автоматизированного и неавтоматизированного способа управления.

Таблица 7.8 - Расчёт расходов при ручном и автоматизированном способах работы с учетом годовой загрузки

Наименование статьи расходовНеавтоматизированный способ, руб.Автоматизированный способ, руб.Материальные затраты451,9451,9Затраты на оплату труда516 000216 000Отчисления во внебюджетные фонды175 44073440Общехозяйственные расходы387 000162 000Прочие расходы51 60021 600Итого614 491,9257 491,9

Приведённый выше расчет годовых эксплуатационных расходов при неавтоматизированном и автоматизированном способах работы показывает, что расходы для первого способа составляют 614 491,9 р., а для второго - 257 491,9 р. Таким образом, годовая экономия для автоматизированного способа работы составляет 357 000р. в год.


7.5 Определение экономической эффективности


К показателям экономической эффективности внедрения новой технологии обработки информации относятся следующие показатели:

годовой экономический коэффициент от внедрения технологии;

коэффициент эффективности капитальных вложений;

срок окупаемости капитальных вложений.

Годовой экономический эффект

Э = ( ЭГ - ЕН · КД ) · КТ, (7.2)где ЭГ - годовая экономия текущих затрат, ЕН - нормативный коэффициент эффективности капвложений - 0,15, КД - дополнительные капитальные вложения; КТ - коэффициент, учитывающий преимущество ускорения обработки информации, равный 1,25;

Э = (357 000- 0,15 · (225 550,50 + 12 405)) · 1,25 = 321306,68.

Расчетный коэффициент экономической эффективности капитальных затрат ЕР представляет собой отношение годовой экономии к капитальным затратам на разработку и внедрение программного обеспечения:


Ер = ЭГ / КД, (7.3)


где ЭГ - годовая экономия текущих затрат, Кд - дополнительные капитальные вложения, Ер = 357 000 / (225 550,50 + 12405) = 1,5.

Срок окупаемости (Т) представляет собой отношение капитальных затрат на разработку и внедрение ИС к годовой экономии составит следующее количество лет:


Т = КД / ЭГ = 1 / Ер, (7.4)


Т = 1 / 1,5 = 0,(6).

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

Заключение


Целью дипломной работы была разработка программного комплекса, предназначенного для чтения, обработки и анализа батиметрических данных. В процессе дипломного проектирования был проведен анализ предметной области. Изучены структуры основных входных данных, разработаны их объектно-ориентированнае модели и модель программного обеспечения. Для создания моделей использована нотация UML.

Реализация программного комплекса проведена с использованием среды разработки приложений Borland C++ Builder 6 на языке программирования C++.

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

Также был проведена оценка экономической эффективности разработки данного комплекса.

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

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


1. Вендров А.М. CASE-технологии. Современные методы и средства проектирования информационных систем. / А.М. Вендров. - М.: Финансы и статистика, 1998. - 176 с.

2. Буч Г. Объектно-ориентированное проектирование с примерами применения / Г. Буч - Киев: Диалектика, 1992. - 800 c.

. Гуннерсон Э. Введение в C#. Библиотека программиста. / Э. Гуннерсон -СПб.: Питер, 2001. -304 с.

. Дейт К. Введение в системы баз данных. / К. Дейт М., -СПб., Киев: Издательский дом «Вильямс». 2000. -950 с.: ил.

. Конноли Т. Базы данных: проектирование, реализация, сопровождение / Т. Конноли, К. Бегг, А. Страчан. - М.: издательский дом «Вильямс», 2000. -1120 с.

. Кратчен Ф. Введение в Rational Unified Process. / Ф. Кратчен - М.: Вильямс. 2002. - 456 с.

. Лупин С.А. Архитектура электронных вычислительных машин. / С.А. Лунин - М.: Инфра-М, 2009. -458 с.

. Мамаев Е. Microsoft SQL Server 2000. / Е. Мамаев -СПб.: БХВ-Петербург, 2002. -1200 с.

. Мюллер Р. Базы данных и UML проектирование. / Р. Мюллер -М.: Лори, 2002. - 420 с.

. Нейбург Э. Проектирование баз данных с помощью UML. / Э. Нейбург, Роберт Максимчук -М.: Вильямс, 2002. -288 с.

. Робинсон С. Язык программирования C# для профессионалов. Том 1. / С. Робинсон - М.: Лори, 2003. - 478 с.

. Робинсон С. Язык программирования C# для профессионалов. Том 2. / С. Робинсон- М.: Лори, 2003. - 523 с.

. Троелсен Э. Язык программирования C# / Э. Троелсен -СПб.: Питер, 2002. - 800 с.

. Хомоненко А.Д. Базы данных. / А.Д. Хомоненко, М.Г. Мальцев, В.М. Цыганков - СПб: КОРОНА принт, 2000. - 345 с.

. Шилдт Г. C#: учебный курс. / Г. Шилдт - СПб.: Питер, 2002. - 512 с.

ПРИЛОЖЕНИЕ 1


СТРУКТУРНЫЕ СХЕМЫ


Рис. 1.1

Рис. 1.2

Рис. 1.3

Рис. 1.4

Рис. 1.5

Рис. 1.6

Рис. 1.7


Рис. 1.8

Рис. 1.9


Рис. 1.10

ПРИЛОЖЕНИЕ 2


Окна программы


Рис. 2.1


Рис. 2.2


Рис. 2.3


Рис. 2.4

Рис. 2.5


Рис. 2.6


Рис. 2.7

Рис. 2.8


Рис. 2.9


Рис. 2.10

Рис. 2.11


Рис. 2.12

Рис. 2.13


Рис. 2.14

Рис. 2.15


Рис. 2.16

Рис. 2.17


Рис. 2.18

Рис. 2.19


Рис. 2.20

Рис. 2.21


Рис. 2.22

Рис. 2.23


Рис. 2.24


Рис. 2.25

Рис. 2.26


Рис. 2.27


Рис. 2.28

Рис. 2.29


Рис. 2.30

Рис. 2.31


Рис. 2.32


Рис. 2.33

Рис. 2.34


Рис. 2.35


Рис. 2.36

Рис. 2.37



Введение Изучение особенностей рельефа морского дна является одной из важнейших задач морской геологии и геофизики, картографии и навигации. Батиметрия -

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ