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

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

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

Введение

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

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

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

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

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

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

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

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

Импорт батиметрическиз данных из исходных треков, получаемых с картплоттера-эхолота, береговых линий из 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.12

18.02.12

23.02.12

Проектирование системы

21.02.12

11.03.12

14.03.12

Программная реализация

14.03.12

21.04.12

25.04.12

Оформление технической документации (Техническое задание)

25.04.12

02.05.12

03.05.12

Оформление технической документации (Описание программы)

03.05.12

07.05.12

08.05.12

Оформление технической документации (Теоретическое описание)

08.05.12

10.05.12

11.05.12

Оформление технической документации (Текст программы)

11.05.12

13.05.12

14.05.12

Оформление технической документации (Руководство программиста)

14.05.12

16.05.12

17.05.12

Оформление технической документации (Руководство пользователя)

17.05.12

21.05.12

22.05.12

Оформление технической документации (Программа и методика испытаний)

22.05.12

24.05.12

25.05.12

Оформление технической документации (Организационно-экономическая часть)

27.05.12

28.05.12

10.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

};

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

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;

{=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].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=\"#"551204.files/image001.gif">, (7.1)

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

Рассчитаем трудоемкость разработки программного обеспечения.

Расчёт трудоемкости приведен в таблице 7.1. В результате предполагаемая продолжительность работы составляет 101 человеко-день.

Таблица 7.1 - Расчет трудоемкости программного обеспечения и оптимизация на основе экспертных оценок

Формулировка работы

Вероятностные оценки


tmin

tmax

tож

Постановка задачи

2

4

3

Сбор данных о предметной области

20

30

25

Оформление ТЗ

2

4

2,8

Разработка метода реализации задачи

30

40

35

Формирование структуры программного обеспечения

5

7

5,8

Разработка структуры файловой базы данных

1

2

1,2

Разработка графических модулей для работы с OpenGL (освещение, камера, текстуры и прочие)

12

15

13,5

Разработка контейнерных типов данных

4

8

6

Разработка ядра системы - модуля работы с батиметрией

15

20

13,5

Разработка интерфейса пользователя

10

15

12

Комплексное тестирование и отладка системы

6

10

7

Документирование системы

5

7

Итого

88

127

101


7.2 Определение себестоимости разработки программы

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

материальные затраты;

затраты на оплату труда разработчику;

отчисления во внебюджетные фонды;

налог на имущество;

затраты на электроэнергию;

расходы по эксплуатации оборудования;

общехозяйственные расходы;

прочие расходы.

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

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

Норматив отчислений на страхование для бюджетных организаций производится в размере 34% от общего фонда заработной платы.

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

Общехозяйственные расходы составляют 75% от затрат на оплату труда разработчиков, прочие расходы - 10%.

7.2.1 Расчёт материальных затрат

В таблице 7.2. представлены данные о материалах, используемых для решения поставленной задачи.

Таблица 7.2 - Материальные затраты

Наименование материала

Количество комплектов, шт.

Цена комплекта, р.

Сумма затрат, р.

 Картридж для принтера

1

1 200

1 200

 Бумага для принтера

1

180

180

 Итого



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 PC

101

1502,9

1373,6

2977,5

Лазерный принтер HP LaserJet 1010

0,79

1,41

0,8

3

Итого


1504,3

1374,4

2980,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,50

7.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 405

7.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,11

3290

361,9

 Бумага для принтера

0,5

180

90

 Итого



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,11

3290

361,9

 Бумага для принтера

0,5

180

90

 Итого



451,9


Сделаем сравнение автоматизированного и неавтоматизированного способа управления.

Таблица 7.8 - Расчёт расходов при ручном и автоматизированном способах работы с учетом годовой загрузки

Наименование статьи расходов

Неавтоматизированный способ, руб.

Автоматизированный способ, руб.

Материальные затраты

451,9

451,9

Затраты на оплату труда

516 000

216 000

Отчисления во внебюджетные  фонды

175 440

73440

Общехозяйственные расходы

387 000

162 000

Прочие расходы

51 600

21 600

Итого

614 491,9

257 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

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

 

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