СОДЕРЖАНИЕ
1. Постановка и анализ задачи
2. Разработка логической схемы данных
4. Основные алгоритмы
4.1 Описаниеалгоритма
4.2Блок-схема алгоритма
5. Программная реализация
5.1 Выборсреды разработки программы
5.2 Работа стаблицами
5.3 Работа сграфикой
5.4Разработка интерфейса
5.5Некоторые особенности алгоритмов
5.6Тестирование
6. Описание программы
7. Инструкция по установке
8. Руководство пользователя
8.1 Главноеменю
8.2 Панельбыстрых кнопок
8.3 Вкладка«Таблица»
8.4 Вкладка«План»
9. Контрольный пример
Заключение
Список литературы
Приложение
1.ПОСТАНОВКА И АНАЛИЗ ЗАДАЧИ
Задача: разработать программуинформационной поддержки создания плана местности.
Исходные данные: Windows98, система описания точекплана местности с возможностью легкой модификации, возможность графическогопредставления плана, построение маршрутов, оценка длины маршрута, выводинформации на экран и печать.
Назначение программы –она позволяет рисовать на карте маршруты, оценивать их длину и расстояния, чтоможет понадобиться пользователям как в личных целях (например, туристам), так ипри проведении геодезических работ, работ по прокладке кабеля и трубопровода ит.д. и т.п.
Рассмотрим это задание попунктам.
Так как мы создаем планместности, подразумевается, что координаты точки плана местности задаются ввиде широты и долготы, те в градусах. При этом мы должны учитывать, что широтаподразделяется на северную и южную, каждя от 0 до 90 градусов; а долгота – назападную и восточную, от 0 до 180 градусов.
Кроме координатпользователю может понадобиться: номер маршрута, чтобы осуществить рисованиенескольких маршрутов, тип объекта, находящегося в данной точке, а такжекакие-либо дополнительные комментарии.
При таком раскладе систему описанияточек плана лучше всего представить в виде таблицы, где каждая запись будетсодержать обе координаты, тип объекта, номер маршрута и комментарии. При этом «возможностьлегкой модификации» по отношению к таблице обеспечить более просто, чем,скажем, по отношению к файлу.
Но для оценки длинымаршрута, так как там вычисляется длины отрезков, удобнее будет использоватьеще одну таблицу.
И можно будет ввести ещетаблицу, в которую будет заноситься перечень типов объектов, чтобы пользователюбыло удобнее их вносить в главную таблицу.
Возможность графическогопредставление плана означает, что пользователь должен увидеть результат работыпрограммы на экране, либо в распечатанном виде, те должно быть наличиеэкранного интерфейса, чтобы пользователю было удобнее работать с такойпрограммой.
Так же для удобстваработы с графическим представлением плана необходимо реализовать возможностьего масштабирования. А для наглядности можно добавить вывод на рисунок названийобъектов и расстояний.
Учитывая в качествеоперационной системы Windows98и наличие экранного интерфейса, а также работу с таблицами и графикой, на мойвзгляд для разработки программы больше подходит среда С++ Builder 5.
2. РАЗРАБОТКА ЛОГИЧЕСКОЙСХЕМЫ ДАННЫХ
В программе для храненияданных используются таблицы: одна основная, с которой работает пользователь, идве вспомогательных, с данными которых оперирует программа.
Все таблицы хранятся вформате таблиц ParadoxDatabase, в файлах с расширением *.db.
Главная таблица состоитиз шести полей со следующими характеристиками:
ID – идентификаторзаписи. Это поле является ключевым – то есть по нему сортируются данные втаблице. Тип – автоинкремент. Поле ID доступно только для чтения. При создании таблицы его значение равноединице, и будет увеличиваться на единицу при каждом создании новой записи. Удаление записи не изменяет значенияполя ID других записей.
Latitude – содержит значение широты текущейточки на карте в формате чисел с плавающей точкой, на которые накладываетсяограничение в виде области допустимых значений от –90 до 90. Положительныечисла соответствуют северной широте, отрицательные – южной.
Longitude — – содержит значение долготытекущей точки на карте в формате чисел с плавающей точкой, на которыенакладывается ограничение в виде области допустимых значений от –180 до 180.Положительные числа соответствуют восточной долготе, отрицательные – западной.
Object Type – поле типа–«строка». В нем указывается типобъекта, находящегося в данной точке.
Course – поле типа «целое число».Содержит номер маршрута, к которому принадлежит данная точка.
Comments – поле типа «строка», отведенодля комментариев.
Ввод значений в поля Latitude, Longitude и Course обязательно.
Вспомогательная таблицаObjectTable, хранящаяся в фале objects.db, содержит перечень типов объектов,ее присутствие в каталоге программы обязательно. Данные из этой таблицызаносятся вполе со списком, с помощью которого пользователь легко может занестинужный тип объекта в главную таблицу, не набирая его вручную. В программевозможно добавление типа объекта в таблицу, удалить тип или очистить всютаблицу. В явном виде ObjectTable не отображается.
Она имеетследующие поля:
Object_ID – идентификатор записи. Тип поля – автоинкремент.
Object Type – тип объекта.
Вспомогательная таблица RasstTable также находится в каталоге программыв файле Rasst.db. Она используется программой в процессе рисования плана: в неезаносится индекс маршрута и расстояния его отрезков. Пользователь можетпосмотреть содержимое этой таблицы, отключив флажок «Скрыть таблицурасстояний».
Эта таблица содержитполя:
Course – номер маршрута. Тип поля – целоечисло.
Distance – расстояние, в километрах. Тип поля– число с плавающей точкой.
На рис.2.1 показана схемаданных в виде таблиц и связей между ними.
/>
Рис.2.1. Схема данных.
3. СТРУКТУРНАЯ СХЕМАПРОГРАММЫ
Основные функции, которыенеобходимо реализовать в нашей программе, следуют из постановки и анализазадачи:
1)Отображениеданных пользователя в виде таблицы и работа с ней.
2)Добавления и удалениятипов объектов.
3)Графическое представление плана свозможностью масштабирования.
4)Работа сфайлами и вывод результатов на печать.
5)Удобныйпользовательский интерфейс.
Нижеприведена функциональная структурная схема программы, изображенная в видеосновных модулей и связей между ними. Она наглядно представляет реализациювышеперечисленных требований в программе.
/>
Рис. 3.1. Функциональнаяструктура программы.
Главной частью программыявляется модуль управления и формирования интерфейса. Он представляетсобой главную форму, на которой находятся элементы управления, позволяющиеосуществлять остальные функции, а также формирующие пользовательский интерфейс.
4.ОСНОВНЫЕ АЛГОРИТМЫ
Основным является алгоритмпостроения изображения по данным из главной таблицы, реализованный в видеметода plandraw().
Ниже приведены егоблок-схема и описание.4.1Описание алгоритма
Если не активированавкладка, на которой находится наше изображение плана, мы ее активируем.
Далее активируем кнопкиувеличения масштаба и установки масштаба по умолчанию.
Подготавливаем таблицурасстояний, очистив ее от предыдущих записей.
Устанавливаем параметрыфона (цвет) и рисуем его, затем устанавливаем параметры пера (толщина линии истиль), от которых будет зависеть отображение линий маршрута на рисунке. Вначале толщина линии равна единице – для рисования координатной сетки.
С помощью свойстватаблицы RecordCount находим количество строк в главнойтаблице.
Устанавливаем указательтекущей записи на первую, и организуем цикл прохода по всем записям таблицы, вкотором подсчитываем количество маршрутов.
Далее организуем циклрисования каждого маршрута, в котором количество повторений определяется ранееподсчитанным количеством маршрутов.
В самом начале циклаосуществляем подготовку для отображения масштаба – переменной масштабаприсваиваем коэффициент увеличения (в целых единицах), для обеих полоспрокрутки определяем максимальную величину, которая зависит от степени увеличенияи размеров рисунка.
Если номер маршрута равеннулю, тогда выполняется условие рисования координатной сетки – меридианов ипараллелей. Сначала выполняется цикл рисования меридианов – мы проходим от 0 до360 градусов с шагом, зависящим от степени увеличения (15, 6, 3, или 1градусов), причем возле каждого меридиана подписывается соответствующий емуградус долготы (восточная долгота – со знаком "+", западная – сознаком "-"). Нулевой меридиан изображается черным цветом. Аналогичныедействия осуществляются и в цикле рисования параллелей, единственное отличие –цикл проходит от 0 до 180 градусов. Со знаком "+" обозначаетсясеверная широта, со знаком "-" — южная.
Меняем толщину линии на2, для изображения линий маршрутов.
Создаем три массива, вкоторые будем заносить индексы записей текущего маршрута и координаты. Далееорганизуем цикл, в котором проходим по записям таблицы и для текущего маршрутазаполняем эти массивы. Причем в массивы координат заносят ужеотмасштабированные величины. В этом же цикле подсчитываем количество точекмаршрута.
В следующем циклесортируем содержимое массива индексов, чтобы потом нарисовать точки маршрутов втом порядке, в котором они находятся в таблице.
Задаем цвет линии взависимости от номера маршрута. И организуем цикл, рисующий линии.
В цикле рисования линийпроделываем следующее: учитывая позиции лент прокрутки, вычисляется положениеокна по отношению к карте, и относительно этого положения вычисляютсякоординаты точки в окне. Если у нас первое прохождение, то мы просто перемещаемкурсор в точку с вычисленными координатами, если нет, и флажок рисования линийвключен, – рисуем линию от предыдущей точки до этой. Если флажок отключен, накарте ставятся только точки.
Затем вычисляетсярасстояние между точками, находящимися на Земном шаре, проекции которых мытолько что изобразили на нашей карте. Расстояния вычисляются в километрах,радиус Земли берется равным 6371км. Вычисление расстояния производится в томслучае, если i не равно 0, те не первое прохождение по циклу. Это условие необходимо,так как мы используем координаты предыдущей точки, чтобы найти расстояние дотекущей.
Так как поверхность землиимеет шарообразную форму, нам нужно вычислить длину дуги. Основной проблемойздесь является нахождение угла, на который опирается дуга.
Рассматриваются трислучая:
1)если точки находятся наодной долготе, угол определить просто — он будет равен разности между большим именьшим значением широты.
2)если точки находятся наодинаковой широте, то тут его определение тоже не представляет сложности – онравен разности между большим и меньшим значением долготы, умноженной напоправку cos(f), где f – текущая широта.
3)если точкирасполагаются на разной широте и долготе, этот случай нахождения угла являетсяболее сложным. Рассмотрим его подробно.
Сначала находим разностьдолгот точек, как если бы они находились на одной широте, помножаем на поправкуcos(f), и вычисляем линейное расстояние между ними по теоремекосинусов (другие две стороны треугольника – радиусы Земли). Таким же образомрассчитываем расстояние между точками, как если бы они находились на однойдолготе. Эти расстояния обозначим l1 и l2.
Теперь у нас естьпрямоугольный треугольник с катетами l1, l2, гипотенузой которого являетсярасстояние l3. Вычисляем ее по теореме Пифагора.Нашей целью является найти угол a. С помощью теоремы косинусов находим косинус этого угла. Вычислив понему арккосинус, мы получаем угол! Ниже приводится поясняющий рисунок.
/>
Рис. 4.1. Пояснение красчету расстояния на различных широте и долготе.
После нахождения угла,вычисляем длину дуги и заносим полученное расстояние в таблицу расстоянийвместе с номером текущего маршрута.
Замечание:так как функции косинуса и арккосинуса оперируют с углами, заданными врадианах, в программе производится пересчет радианов в градусы и наоборот. Всеэти вычисления приводят к накоплению погрешности.
Всеупомянутые формулы даны в Приложении Д.
Вычислив расстояние,выводим его на план рядом с текущей точкой, если включен соответствующийфлажок. Причем в связи с условием оценки длины маршрута на рисунке отображаетсяне длина одного отрезка, а сумма длин отрезков, предшествующих этой точке.Длины же отдельных отрезков пользователь может посмотреть в таблице расстояний.
Также на картеотображаются тип объекта для данной точки, если флажок «показывать типобъекта» установлен.
Если флажок «непоказывать таблицу расстояний» отключен, делаем ее видимой.
После того, как всемаршрут отрисованы, освобождаем память, отведенную под массивы индексов икоординат.
4.2Блок-схема алгоритма
/>
Рис. 4.2. Блок-схемаалгоритма рисования плана.
5. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
5.1 Выборсреды разработки программы
Как уже говорилось в «Постановкезадачи», для создания этой программы была выбрана среда разработки Borland C++Builder 5. Эторешение обуславливается тем, что в ней процесс создания интерфейса непредставляет труда даже для программиста, столкнувшегося с Builder’ом впервые, и там хорошо поставленаработа с базами данных и графикой, что как раз и нужно для разработки нашейпрограммы.
Недостатком на мой взглядявляется большой исполняемый код программы – чтобы она работала на машине, где Builder не установлен, необходимо включить внего все используемые библиотеки, из-за чего размер программы становиться внесколько раз больше.
Кроме того в Builder хорошо и то, что компоненты обладаютмножеством свойств, которые можно менять не только при конструировании, но ипри выполнении программы, что деалет раоту с ними более гибкой.
5.2 Работас таблицами
В качестве драйвера базыданных используем Paradox. Этот типбазы данных был выбран, во-первых, потому, что Builder имеет встроенные средства для работы с таблицами Paradox, такие как Borland Database Engine, а также с ним поставляетсяпрограмма Database Desktop. Во-вторых, преимущество Paradox состоит еще и в том, что в качестве имени базы данныхможно указывать путь к каталогу, где находится файл таблицы, причем все таблицыхранятся в отдельных файлах. В третьих, они занимают мало места и являютсянаиболее простыми из локальных таблиц. В-четвертых, именно таблицы Paradox позволяют создавать ключевые поля.
Чтобыобеспечить работу с таблицей мы установили на форме следующие компоненты:
— сетка DBGrid, с помощью которой мы можем вставлять, удалять, или редактироватьданные в таблице, или просто отображать их.
— список DBComboBox, с помощью которого мы можем вставлять данные из таблицыобъектов в текущую запись главной таблицы. Перед использованием этого спискаего нужно заполнить значениями из таблицы объектов. Для этого при запускепрограммы проходим по всем ее записям и заносим их содержимое в поле Items этого списка.
— навигатор DBNavigator – с помощью него можно удалять,добавлять, редактировать записи в таблице, а также перемещаться по ним.Связываем его с сеткой, в которой будет отображаться наша таблица.
Всеэти компоненты связываются с таблицей через DataSourse, в свойствах которого мы указываемее имя. Причем сама таблица тоже представляется в виде компонента, Table, у которого наибольшее вниманиеследует уделить трем свойствам:
1)Active – показывает, активна ли таблица.Если попытаться обратиться к ней, если это свойство отключено, то программавыдаст ошибку «Cannot perform this operation on closed dataset». При тестировании все возможные ситуации,которые могли привести к этой ошибке, были отслежены и обработаны.
2)DatabaseName – имя базы данных, в качестве негоберется путь к каталогу, из которого открыта или создана таблица.
3)TableName – имя таблицы — файл с расширением .db, в котором храниться таблица.
Всеэти свойства меняются в процессе выполнения программы.
КомпонентTable нужен нам для того, чтобы избавитьсяот конкретизации. Те мы можем под видом Table открыть любую конкретную таблицу, и изменить при этомтолько свойства Table, незатрагивая других компонентов. Например, при открытии таблицы мы закрываем идезактивируем предыдущую, при этом имя базы данных и имя таблицы в свойствахкомпонента Table удаляются, и открываем и активируемновую, при открытии записав в DatabaseName и TableName новые имена каталога и файла. (См.методы TBOpenFileClick и TBCloseFileClick в Приложении А).
КомпонентыDataSourse и Table располагаются на форме, но они видны только приработе с программой в Builder’е.5.3 Работас графикой
Для рисования плана мыиспользуем компонент Image.Этот объект обладает двумя важными свойствами:
1)Picture – представляет собой объект класса TPicture, который является контейнером дляграфики любого вида. Т.е. этот компонент может хранить bitmap-графику, иконку или другой вид графики, определенныйпользователем. В Picture как раз инаходится наш рисунок. С его помощью мы сохраняем в файл полученный рисунок.(См Приложение А, метод TBSaveFileClick). Также следует учесть, что размер Picture и Image могут не совпадать. Об этой проблеме более подробнобудет рассказано ниже.
2)Canvas – канва. Весь процесс рисованияосуществляется именно на канве компонента Image. Canvasпозволяет устанавливать параметры пера, кисти, шрифта, выполнять рисованиетаких объектов, как линии, прямоугольники, эллипсы, а также выводить текст.
В нашей программе мыиспользуем рисование линий с помощью методов канвы MoveTo и LineTo,рисование точек с помощью Ellipse,а также вывод текста методом TextOut.(см. Приложение А, plandraw).
Т.е. канва позволяет намработать с функциями Windows GDI, не обращаяськ ним непосредственно, что значительно упрощает работу с графикой.
5.4Разработка интерфейса
Разработке интерфейсатакже следует уделить особое внимание, так как необходимо сделать его удобнымдля пользователя. Средства Builder'апозволяют легко реализовать интерфейс в стандартах Windows.
Основные элементыстандартного интерфейса Windows-программ:
1) Меню — обеспечивают простой путь длявыполнения пользователями логически сгруппированных команд.
Главное меню создается спомощью компонента MainMenu, причемего очень удобно редактировать при создании программы, так как для проверки ненужно запускать ее — все его содержимое отображается уже на форме.
2) Панельинструментов — содержиткнопки инструментов, которые соответствуют элементам в меню программы и даютпользователю большее количество прямого доступа к ее командам.
Панель инструментовреализуется с помощью компонента ToolBar,позволяющего быстро добавлять и размещать кнопки. Все кнопки инструмента на инструментальной панелиимеют одинаковую ширину и высоту.
Для каждой кнопки можнозадать иконку, отображающую реализуемое ею действие выбором номера иконки изхранящихся в компоненте ImageList изображений. Это удобно тем, что можно легко сменить пиктограмму, незагружая каждый раз иконку из файла.
В соответствие состандартом Windows, я создала на панели кнопки,соответствующие пунктам меню «Новый», «Открыть», «Сохранить»,«Печать».
3) Кнопки – с ихпомощью пользователь запускает выполнение действия, приписанного этой кнопке.
Обычно по стандартуинтерфейса Windows кнопки почти не используются, чтобыне загромождать окно программы. Вместо них применяются панели инструментов именю.
Но так как наша программавыполняет не очень большое количество действий, можно использовать и кнопки.Это удобно хотя бы тем, что, в отличии от меню, они располагаются рядом с темэлементом, по отношению к которому осуществляется вызываемое ими действие(например, кнопки добавления и удаления объектов, находятся рядом со спискомобъектов, а кнопки масштабирования – рядом с рисунком), что конечно же будетудобно для пользователя.
К тому же на них можносделать подписи, объясняющие их назначение, что тоже удобн.
Кнопка создаетсяразмещением на форме компонента Button.При разработке программы используется его свойство Caption – надпись на кнопке, а во время выполнения — свойствоEnabled, чтобы сделать кнопку неактивной илинаоборот активировать ее. (см. Приложение А, HideButtons() и ShowButtons()). Например, при открытиитаблицы мы активируем кнопки рисования плана, а при закрытии – делаем ихнеактивными.
4) Выпадающие списки– применяются, чтобы пользователь мог выбрать элемент из списка. Это гораздоудобнее, чем вводить его вручную.
В данной программе полесо списком используется для внесения типа объекта в таблицу (DBComboBox, о нем говорилось выше), и дляудаления типа объекта из таблицы объектов (ComboBox).
Отличие DBComboBox от ComboBox заключается в том, что первый связанс полем таблицы, а второй является простым списком. Использование простогосписка ComboBox позволяет решить проблемывзаимодействия с таблицей и DBComboBox, которые возникают при удалении объекта из таблицы.
5) Полосы прокрутки– реализуются с помощью компонента ScrollBox, в нашем случае они необходимы для прокрутки изображенияплана при его увеличении. В программе осуществляется изменение в зависимости отмасштаба параметра Max, которыйопределяет максимальную величину прокрутки.
6) Флажки(переключатели) – определяют, включена или нет представляемая ими опция.
В Builder’e это компонент CheckBox.
В программе флажкиопределяют включение или выключение следующих возможностей:
— рисование линиймаршрутов;
— отображение расстоянияна плане;
— отображение типаобъекта на плане;
— показать таблицурасстояний.
Обычно флажки находятся вменю настроек. Но в связи с простотой нашей программы, они вынесены на панельрядом с полем рисунка, что очень удобно для пользователя.
7) Вкладки – вданной программе таблица и рисунок плана располагаются на разных вкладках. Ясчитаю, что так для пользователя будет удобнее, так как вся программасодержится в одном окне, и при этом и область таблицы, и область рисункарасполагаются не в ущерб друг другу.
В Builder есть два типа вкладок: TabControl и PageControl.
В программе используется PageControl, так как в отличие от первого, этоткомпонент может содержать на вкладках разнородные элементы управления. У TabControl все страницы одинаковы.
8) Диалоги – оченьудобное средство, помогающее реализовать такие диалоги с пользователем, какиспользуемые в данной программе сохранение, открытие файла, печать и выборцвета.
Все необходимые диалогиразмещаются на форме, но для пользователя остаются невидимыми. Они вызываютсяпрограммой и реализуют стандартный интерфейс Explorer’а.
С помощью диалогов OpenDialog и SaveDialog программа получает имя файла и каталога,который выбирает пользователь. С помощью диалога печати PrintDialog вызываются настройки печати. А ColorDialog помогает выбрать цвет (ониспользуется для выбора цвета фона рисунка).
Назначение каждоговидимого для пользователя компонента интерфейса описано в руководствепользователя.
Стоит заметить, что укаждого объекта интерфейса есть такое свойство, как Align – выравнивание. Оно позволяет выровнять элементуправления по правой, левой, верхней или нижней стороне формы и панели, причемэлемент остается там, даже если размер формы меняется. Например, панель скнопками возле рисунка выровнена по правому краю, таблица расстояний – полевому, а поле рисунка выровнено по alClient, те занимает все свободное пространство между таблицей ипанелью. При растягивании форму эти элементы управления тоже будутрастягиваться, оставаясь при этом на своих местах.
Использование свойства Align удобно тем, что уж на этапепроектирования можно расположить компоненты так, как нужно, и чтобы потом незадавать вручную их размеры при каждом изменении формы.5.5Некоторые особенности алгоритмов
Алгоритм рисования
Так как он был ужедовольно подробно описан, добавлю лишь одно замечание касательно егоразработки: он рисует карту в равноугольной проекции. Те сохраняетсяравенство углов междунаправлениями на карте и в натуре. При этом искажаются размеры площадейтерриторий.
Этот вид проекции былвыбран потому, что для него проще всего осуществить рисование координатнойсетки, так как она состоит из прямых линий. (Более подробно о картографическихпроекциях и координатной сетке см. Приложение Е.)
Расстояния жерассчитываются в реальных размерах.
Алгоритм расчетарасстояния.
О нем также подробнорассказывается в «Описании алгоритма». Он является частью алгоритмарисования.
Он был выведен авторомпрограммы, так как нигде не нашлось его аналогов. Его особенность состоит втом, что необходимо учитывать кривизну земной поверхности, те вычислять длинудуги. Это особенно сложно, если точки располагаются на равной широте и долготе.
В качестве формы земнойповерхности берется шар. Это может привести к погрешностям, так как форма землина самом деле представляет с собой эллипсоид, но значительно упрощает расчеты.Средний радиус земли берется 6371 км. Это дает погрешность около 0.3%.
Также следует отметить,что для вычисления расстояния, особенно в самом сложном случае, применяетсянесколько последовательных расчетов, в результате чего накапливаетсяпогрешность. Также на величину ошибки влияет и пересчет градусной меры угла врадианы и обратно. Но при современной точности вычислений на компьютере этаошибка будет невелика, к тому же задании не указывалось, что оценка маршрутадолжна быть точной.Созданиетаблицы
Тут следует сказать, чтоалгоритм создания таблицы программным способом не был мною найден ни в однойимеющейся у меня книге. Во всей литературе говорилось о создании таблиц в DatabaseDesktop, что для пользователя было бынеудобно – ставить программу еще большего размера, только чтобы решить проблемусоздания новых таблиц.
Но все-таки этот алгоритмбыл найден в помощи Builder’а, хотятам он содержал ошибки.
В программе жепредставлен его рабочий пример (см. Приложение А, TBNewFileClick).
В качестве особенностиэтого алгоритма следует отметить то, что до того, как вызвать процедурусоздания таблицы CreateTable(),нужно проинициализировать все поля, указав их название, тип, длину (еслитребуется), и требуемость значения (те обязательно его наличие или нет). Послеинициализации полей объявляем ключевое поле, и только потом вызываем процедурусоздания таблицы. После этого необходимо привязать новую таблицу к компоненту Table, чтобы можно было с ней работать спомощью сетки и навигатора. Имя файла новой таблицы запрашивается с помощью SaveDialog.Проблемаразмера графики
Приразработки программы возникла довольно-таки серьезная проблема с рисованиемкартинки – при изменении размеров формы должен был меняться и размер картинки,но этого не происходило.
Причиной было то, чторазмер компонента Image все-такиизменялся, а вот размер картинки Pictureоставался прежним. В связи с этим была создана процедура ResizeForm (см. Приложение А), котораяреагировала на изменение размеров формы и менял размер картинки в соответствиис изменившимся размером компонента Image. 5.6 Тестирование
В течение всего временипроектирования программы выполнялись ее тестирования и отладка. Особое вниманиеуделялось двум моментам – правильности работы с таблицами и правильностирисования плана.
При работе с таблицами впервую очередь нужно было отследить все проблемы, связанные с открытием,созданием таблиц и рисованием. Например, если не дезактивировать кнопкирисования, то нажатие на них при неоткрытой таблице могло привести к ошибке.Для устранения такой ошибки при отсутствии открытой таблицы кнопки делаютсянеактивными.
Еще одной важной ошибкой,которая была устранена – проблема размера графики (см. выше).
Также нужно было следить,чтобы при отключении/включении флажков и изменении размеров формы не рисоваласькартинка, если пользователь еще не нажимал на кнопку «рисовать».Такое отслеживание в программе выполняется флагом draw, который устанавливается, когда пользователь нажимаетна кнопку рисования, и снимается, когда нажимает кнопку очистки. В процессетестирования все ситуации, в которых необходима проверка этого флага, былиотслежены и отлажены.
Важнейшей сторонойтестирования была проверка работоспособности программы на компьютере, накотором не установлен Builder.Это помогло определить следующее:
1) при компиляции программынеобходимо включить в нее все используемые библиотеки. Это достигается спомощью отключения двух опций в настройках компилятора. Исполняемый кодпрограммы при этом становится больше, но зато она сможет работать и на машинебез Builder’а.
2) для работы программытребуется Borland Database Engine. Если его нет на компьютере, его необходимоустановить.
6.ОПИСАНИЕ ПРОГРАММЫ
Программапредназначена для информационной поддержки создания плана местности. Онапозволяет хранить данные о точках плана в таблице, осуществлять их графическоеотображение, создавать новую таблицу, добавлять и удалять типы объектов,рассчитывать расстояния и оценивать длину маршрута, рисовать несколькомаршрутов, сохранять результаты в файл или выводить на печать.
Программа создана дляоперационной системы Windows,и обладает стандартизованным под нее и удобным для пользователя интерфейсом.Вместе с ней поставляется пример в виде таблицы с маршрутами поездов.
7.ИНСТРУКЦИЯ ПО УСТАНОВКЕ
Для установкипрограммы должны быть выполнены требования: процессор 233МГц и выше,оперативная память от 16Мб, ОС Windows98и выше.
Чтобыустановить программу, необходимо проделать следующие действия:
1) Создать новую папкудля программы.
2) С носителя, на которомнаходится архив программы (дискета или диск), скопировать его в эту папку.
3) Распаковать архив вэту папку.
4) Убедитесь, что фалы objects.db и rasst.db находятся в той же папке, что ипрограмма.
5) Убедитесь,что у этих файлов снят атрибут «Только чтение». Если нет, снимитеего.
6) Распакуйте архив сбиблиотеками в папку Windows.
7) Теперь можно запуститьпрограмму и пользоваться ею.
8.РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ8.1 ГлавноеменюМеню«Файл»
Для того, чтобы начатьработу в программе, необходимо открыть файл с таблицей или создать новый. Этоможно выполнить с помощью пунктов меню «Файл» «Открыть» и «Новый».
«Открыть» — открыть уже существующую таблицу. Вызывает диалог, а котором пользователь долженвыбрать файл с расширением .db.
«Новый» — создание новой таблицы. Вызывается диалог, в котором пользователь задает имяновой таблицы.
«Закрыть» — закрывает таблицу.
«Сохранить» — сохраняет картинку в файл с расширением .bmp. Таблица же сохраняется автоматически при утвержденииизменений кнопкой «Сохранить изменения» навигатора.
«Печать» — взависимости от открытой вкладки печатает рисунок или таблицу. При выборе этогопункта открывается диалоговое окно настройки печати, после нажатия кнопки «ОК»,задание отправляется на печать.Меню«Таблица»
«Построить план»- если таблица открыта, активирует вкладку «План» и рисует план.
«Добавить типобъекта» — вызывает форму добавления типа объекта.
«Удалить тип объекта»- вызывает форму удаления типа объекта.Меню«Помощь»
«О программе» — выводит название программы и сведения об авторе.
«Содержание» — выводит файл подсказки.
8.2 Панельбыстрых кнопок
Действия этих кнопоканалогичны одноименным пунктам меню «Файл».
/> - «Новый» — созданиеновой таблицы.
/> - «Открыть» — открытьуже существующую таблицу.
/> - «Сохранить» — сохраняет картинку в файл с расширением .bmp.
/> - «Печать» — вывести напечать рисунок или таблицу.8.3 Вкладка«Таблица»
Сетка таблицы – в нее загружается таблица. Спомощью этой сетки пользователь может редактировать и просматривать записи таблицы.
Навигатор – располагается под сеткой, позволяетредактировать и просматривать таблицу.Кнопкинавигатора
/> - «Первая запись» — выполняет переход на первую запись в таблице.
/> - «Предыдущая запись» — выполняет переход на предыдущую запись в таблице.
/> - «Следующая запись» — выполняет переход на следующую запись в таблице.
/> - «Последняя запись» — выполняет переход на последнюю запись в таблице.
/> - «Добавить запись» — таблица переводится в режим редактирования, перед активной записью вставляетсяновая пустая запись.
/> - «Удалить запись» — удаляет текущую запись, предварительно запросив подтверждение.
/> - «Редактировать» — редактирование текущей записи.
/> - «Сохранить изменения»- заносит изменения текущей записи в таблицу.
/> - «Отменить изменения»- отменяет изменения текущей записи, возвращая ее предыдущее значение.
/> - «Обновить». Обновляеттаблицу в сетке.
Под навигатором находятсяСписок объектов и кнопки удаления и добавления объектов.
Список объектов – содержит перечень типов объектов.При выборе типа из списка, он заносится в текущую запись в таблице.
Добавить тип объекта – вызывает форму добавления типа.При его добавлении он тут же заносится в список.
Удалить тип объекта – вызывает форму удаления типаобъекта.Формадобавления типа объекта
Содержит полередактирования для ввода текста, в которое заносится название нового типа.
«Добавить» — добавляет тип объекта к списку и в таблицу, не закрывая форму.
«Ок»- если объект не был добавлен, заносит его в список и таблицу, и закрываетформу.
«Отмена» — закрывает форм без добавления.Формаудаления типа объекта
Список объектов – из него пользователь выбирает,какой объект нужно удалить.
«Удалить»- удаляет выбранный тип объекта из таблицы и списка.
«Удалить все» — полностью очищает таблицу объектов и списки.
«ОК» — закрывает форму.
8.4 Вкладка «План»
Поле рисунка – область, на которую выводитсярисунок плана.
Полосы прокрутки – появляются при увеличенииизображения нажатием на кнопку «Увеличить». Позволяют прокручиватьувеличенное изображение.
Таблица расстояний – показывает для каждого маршрутаего номер и длины отрезков, в километрах. Таблица видима, если снят флажок «Скрытьтаблицу расстояний».
Кнопки:
«Очистка карты»- очищает поле рисунка.
«Нарисовать» — рисует план.
«Цвет фона» — позволяет выбрать цвет фона рисунка. При нажатии на эту кнопку выводитсядиалоговое окно выбора цвета.
"+ Увеличить" — увеличивает изображение на плане.
" — Уменьшить" — уменьшение изображения на плане. Эта кнопка становиться активной при нажатиикнопки увеличения.
«По умолчанию»- устанавливает изначальный размер изображения.
Флажки:
«Рисовать линии маршрутов»- если он установлен, на плане будут рисоваться маршруты, если нет – будутобозначаться только точки.
«Показыватьрасстояния на карте» — если флажок установлен, рядом с каждой точкоймаршрута выводится расстояние в виде сумм длин отрезков, предшествующих этойточке. Возле первой точки маршрута ставится «0».
«Показывать типобъекта на карте» — если флажок установлен, рядом с каждой точкойвыводится тип объекта.
«Скрыть таблицурасстояний» — если флажок установлен, таблица расстояний невидима. Если снят,таблица появится справа от поля рисунка.
Все флажки по умолчаниюустановлены.
9.КОНТРОЛЬНЫЙ ПРИМЕР
В качествеконтрольного примера изобразим маршруты нескольких поездов Горьковской железнойдороги.
Возьмемследующие поезда:
N 497Г Горький-Моск — Адлер
N 471Г Горький-Моск — Новороссийск
N 431Г Горький-Моск — Адлер
N 367Г Горький-Моск — Самара
N 059A Горький-Моск — Санкт-Петербург-Главн
N 039Г Горький-Моск — МоскваКурская
Занесем в таблицу вкачестве точек каждого маршрута координаты наиболее крупных населенных пунктов.В качестве объектов будем использовать названия городов.
/>
Рис. 9.1. Общий вид программы навкладке «Таблица», ввод в запись названия объекта с помощью списка.
Ранее мы занесли в таблицу объектовстанцию Красный Узел, но так как она нам не понадобиться, мы ее удалим.
/>
Рис. 9.2. Удаление типаобъекта.
При наборемаршрута поезда 431 нам понадобиться Владимир. Так как его нет в списке, нужноего добавить.
/>
Рис. 9.3. Добавление типаобъекта.
Итак, мы набрали всемаршруты, какие хотели. В итоге у нас получилась такая таблица.
/>
Рис. 9.4. Таблица
Теперь по нашей табличке построимплан.
/>
Рис. 9.5. Изображениеплана со всеми надписями.
По умолчанию у нас отображаются илинии, и расстояния, и названия городов.
Посмотрим, как будутвыглядеть маршруты без подписей.
/>
Рис. 9.6. Изображение плана без всехнадписей.
Теперь посмотрим толькорасстояния.
/>
Рис. 9.7. Изображениеплана только с расстояниями.
На самом деле онирассчитаны не очень точно, но это оттого, что мы учли не все пункты этихмаршрутов, а также координаты взяты не совсем верные — они были определены покарте «на глаз».
Теперь посмотрим наш плантолько с названиями городов.
/>
Рис. 9.8. Изображениеплана с выводом только типов объектов.
/>
Рис. 9.9. Изображениеплана в виде точек со всеми подписями.
Можно посмотреть и таблицурасстояний.
/>
Рис. 9.11. Общий видпрограммы на вкладке «План» с видимой таблицей расстояний.
Еще мы можем сохранитькартинку в файл или распечатать результаты. Тогда мы будем обладать своейсобственной схемой маршрутов поездов.
ЗАКЛЮЧЕНИЕ
Задача, поставленная взадании бакалаврской работы, была успешно выполнена. Разработанная программаполностью удовлетворяет начальным условиям, описанным в постановке задачи. Вчастности в программе были реализованы работа с таблицами, графикой и файлами.
Работа пользователяпрограммы осуществляется с помощью несложного интерфейса, выполненного постандартам интерфейса программ Windows.
В качестве дальнейшихулучшений и расширения возможностей данного проекта можно указать добавлениерасчета кратчайшего маршрута, нанесение на рисунок пиктограмм объектов,изображение рельефа, а также возможность загрузки в качестве фона изображениякарты.
СПИСОКЛИТЕРАТУРЫ
1. П. Густавсон, М. Кэшмэн, Б. Сворт, Дж. Холингворт. Borland C++ Builder6. Руководство разработчика. – Вильямс, 2004.
2. А. Архангельский. Программирование в C++ Builder 6.– Бином, 2002.
3. Т.А. Павловская. С/С++. Программирование на языкевысокого уровня. – Питер, 2001.
ПРИЛОЖЕНИЕПРИЛОЖЕНИЕЕ. Картографические проекции и координатная сетка
Сферическуюповерхность развернуть на плоскости без разрывов и складок невозможно, то естьее плановое изображение на плоскости нельзя представить без искажений, с полнымгеометрическим подобием всех ее очертаний. Полного подобия спроектированных науровненную поверхность очертаний островов, материков и различных объектов можнодобиться лишь на шаре (глобусе). Изображение поверхности Земли на шаре(глобусе) обладает равномасштабностью, равноугольностью и равновеликостью.
Этигеометрические свойства одновременно и полностью сохранить на карте невозможно.Построенная на плоскости географическая сетка, изображающая меридианы ипараллели, будет иметь определенные искажения, поэтому будут искаженыизображения всех объектов земной поверхности. Характер и размеры искаженийзависят от способа построения картографической сетки, на основе которойсоставляется карта.
Отображениеповерхности эллипсоида или шара на плоскости называетсякартографическойпроекцией. Существуют различные виды картографических проекций. Каждому изних соответствуют определенная картографическая сетка и присущие ей искажения.В одном виде проекции искажаются размеры площадей, в другом — углы, в третьем — площади и углы. При этом во всех проекциях без исключения искажаются длинылиний.
Картографическиепроекции классифицируют по характеру искажений, виду изображения меридианов ипараллелей (географической сетке) и некоторым другим признакам. По характеруискажений различают следующие картографические проекции:
— равноугольные, сохраняющиеравенство углов, между направлениями на карте и в натуре. На рис.Е.1 показанакарта мира, на которой картографическая сетка сохраняет свойстворавноугольности. На карте сохранено подобие углов, но искажены размерыплощадей. Например, площади Гренландии и Африки на карте почти одинаковы, а вдействительности площадь Африки примерно в 15 раз больше площади Гренландии.
/>
Рис.Е.1Карта мира в равноугольной проекции.
— равновеликие, сохраняющиепропорциональность площадей на карте соответствующим площадям на земномэллипсоиде. На рис Е.2 показана карта мира, составленная в равновеликой проекции.На ней сохранена пропорциональность всех площадей, но искажено подобие фигур,то есть отсутствует равноугольность. Взаимная перпендикулярность меридианов ипараллелей на такой карте сохраняется только по среднему меридиану.
— равнопромежуточные, сохраняющие постоянство масштаба по какому-либонаправлению;
— произвольные, не сохраняющие ни равенства углов, нипропорциональности площадей, ни постоянства масштаба. Смысл примененияпроизвольных проекций заключается в более равномерном распределении искаженийна карте и удобстве решения некоторых практических задач.
/>
Рис.Е. 2 Карта мира в равновеликой проекции.
Повиду изображения сетки меридианов и параллелейкартографической проекцииподразделяются на конические, цилиндрические, азимутальные и др.Причем в пределах каждой из этих групп могут быть разные по характеру искаженийпроекции (равноугольные, равновеликие и т. д.). Геометрическая сущностьконических и цилиндрических проекций заключается в том, что сетка меридианов ипараллелей проектируется на боковую поверхность конуса или цилиндра споследующим развертыванием этих поверхностей в плоскость. Геометрическаясущность азимутальных проекций заключается в том, что сетка меридианов ипараллелей проектируется на плоскость, касательную к шару в одном из полюсовили секущую по какой-либо параллели. Картографическую проекцию, наиболееподходящую по характеру, величине и распределению искажений для той или инойкарты, выбирают в зависимости от назначения, содержания карты, а также отразмеров, конфигурации и географического положения картографируемой территории.Благодаря картографической сетке все искажения, как бы велики они ни были, самипо себе не влияют на точность определения по карте географического положения(координат) изображаемых на ней объектов. В то же время картографическая сетка,являясь графическим выражением проекции, позволяет при измерениях по картеучитывать характер, величину и распределение искажений. Поэтому любая географическаякарта представляет собой математически определенное изображение земнойповерхности.