Организация базы данных для хранения динамических моделей беспроводных компьютерных Ad hoc сетей

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

Организация базы данных для хранения динамических моделей беспроводных компьютерных Ad hoc сетей

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

(ФГБОУ ВПО «КубГУ»)

Кафедра вычислительных технологий



ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ

РАБОТА БАКАЛАВРА

Организация базы данных для хранения динамических моделей беспроводных компьютерных Ad hoc сетей



Работу выполнила

А.А. Памбукян

Научный руководитель

к. ф.-м. н. О.Н. Лапина




Краснодар 2015

ВВЕДЕНИЕ

С развитием беспроводных устройств связи, все большую популярность набирает технология Аd hoc сетей - динамических децентрализованных беспроводных сетей, не имеющих постоянной структуры. Подобные сети могут применяться для распределенного сбора данных, расширения пропускной способности сотовых сетей, организации сетей для служб быстрого реагирования и др. В данной технологии клиентские устройства соединяются «на лету», образуя собой сеть. Узлы сети могут перемещаться в пространстве, при этом может произойти потеря связности сети, распад ее на компоненты. Это приводит к тому, что свойства сети постоянно изменяются. Как правило, Аd-hoc система должна быть самоуправляемой, динамически настраиваемой системой. Для решения задачи управления необходимо наличие модели Аd-hoc сети.

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

1. Графы

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

Графы удобны тем, что позволяют не только некоторым стандартным образом визуализировать структуру, но и позволяют формулировать утверждения о свойствах этих структур, важных с прикладной точки зрения [1].

.1 Обыкновенные графы

В разных книгах приведены различные определения термина «граф». Но во всех этих определениях есть что-то общее. То есть, в любом случае граф состоит из двух множеств - вершин и ребер, причем для каждого ребра указана пара вершин, которые это ребро соединяет. Вершины и ребра есть элементы графа. Чтобы получить формальное определение графа того или иного типа, необходимо уточнить некоторые моменты.

Если считать пары (a,b) и (b,a) различными, то говорят, что рассматриваются упорядоченные пары, где порядок элементов важен, иначе - неупорядоченные. Если ребро e соединяет вершину a с вершиной b и пара (a,b) считается упорядоченной, то это ребро называется ориентированным, где a - его начало, b - конец. Если же эта пара считается неупорядоченной, то ребро называется неориентированным, а обе вершины - его концами.

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

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

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

Обыкновенным графом называется пара G = (V,E), где V - конечное множество, E - множество неупорядоченных пар различных элементов из V. Элементы множества V являются вершинами графа, элементы множества E - его ребрами.

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

Если множество V конечно, то граф G тоже считается конечным. Конечный граф удобно задавать с помощью квадратной матрицы смежностей M. При этом вершины во множестве V нумеруются от 1 до p = |V|. Вершине с номером i в матрице M соответствуют i-я строка и i-й столбец. Если в графе имеется дуга (vi, vj), то в матрице смежностей этого графа имеется единица на пересечении i-й строки и j-го столбца. Если дуга отсутствует, то в соответствующей позиции матрицы находится ноль. Одному и тому же графу могут соответствовать различные матрицы смежностей, так как вид матрицы, зависит от нумерации вершин графа.

1.2 Геометрические графы

В качестве вершин графа G будем рассматривать элементы некоторого конечного множества V . Чтобы задать ребра, рассмотрим конечное множество E отрезков и некоторое отображение ∂ из множества концов этих отрезков в V. Необходимо отметить, что все отрезки предполагаются «независимыми», т.е. лежащими в разных прямых. Отображение ∂ можно интерпретировать как «приклеивание» ребер графа их концевыми точками к вершинам этого графа, в результате чего все отрезки из E склеиваются друг с другом некоторыми концевыми точками. Именно такое семейство ребер-отрезков с отождествленными в соответствии с отображением ∂ концами мы и будем называть геометрическим графом, см. рис. 1

Рисунок 1 - Склейка геометрического графа G из отрезков.

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

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

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

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

Рисунок 2 - Геометрические графы G1 и G2

2. Компьютерные сети

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

.1 Основные понятия

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

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

В сетях применяются различные сетевые технологии, из которых в локальных сетях наиболее распространены Ethernet, FDDI, Token Ring, 100VG-AnyLan. И каждой технологии соответствуют свои типы оборудования[3].

2.2 Беспроводные сети

Беспроводные сети передачи данных позволяют объединить в единую информационную систему разрозненные локальные сети и компьютеры для обеспечения доступа всех пользователей этих сетей к единым информационным ресурсам без использования дополнительных проводных соединений.

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

Стандарт IEEE 802.11 <https://ru.wikipedia.org/wiki/IEEE_802.11>определяет два режима работы сети - Ad-hoc <https://ru.wikipedia.org/wiki/Ad-hoc> и клиент-сервер <https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B8%D0%B5%D0%BD%D1%82-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80>.

.2.1 Режим клиент-сервер

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

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

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

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

Обычно в сети количество клиентов значительно больше числа серверов, используемых ими. На рисунке 3 представлена принципиальная схема клиент-серверной модели.

Рисунок 3 - Модель «клиент-сервер»

.2.2 Режим ad hoc hoc сети - децентрализованные беспроводные сети <https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%81%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8>, не имеющие постоянной структуры. Клиентские устройства, соединяясь «на лету», образуют собой сеть. Каждый узел такой сети должен играть роль, как хоста, так и маршрутизатора, пытаясь переслать данные, предназначенные другим узлам. При этом определение того, какому узлу пересылать данные, производится динамически, на основании связности сети. Это является отличием от проводных сетей и управляемых беспроводных сетей, в которых задачу управления потоками данных выполняют маршрутизаторы <https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80> или точки доступа <https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%81%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D1%82%D0%BE%D1%87%D0%BA%D0%B0_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0> соответственно.hoc сети играют большую роль при необходимости выполнения масштабных работ в местностях с плохо развитой или разрушенной инфраструктурой. Такие сети создаются в период ликвидации чрезвычайных ситуаций, обеспечивая информационное взаимодействие участников операции. В связи с ограниченным радиусом действия приемо-передатчиков компьютерных узлов сети остро стоит вопрос обеспечения связности и живучести сети. Минимальным требованием является связность сети, т.е. наличие хотя бы одного маршрута передачи данных между двумя любыми узлами. Однако, ввиду мобильности узлов надежность односвязной сети недостаточна: в любой момент времени сеть может распасться на несколько компонент. Поэтому, достаточная живучесть сети обеспечивается только в многосвязной самоуправляемой сети [1].

Принципиальную схему ad hoc сети можно увидеть на рисунке 4.

Рисунок 4 - Схема беспроводной ad hoc сети

3. Математическая модель ad hoc сети

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

Характеристики связности беспроводной компьютерной сети зависят от координат узлов сети. Местоположение узлов изменяется со временем, поэтому для отслеживания динамики изменения и свойств компьютерной сети строится ее математическая модель, представляющая собой ранее упоминающийся в работе геометрический граф[1].

В соответствии с этой моделью, компьютерная сеть состоит из n отдельных узлов, каждому из которых соответствует вершина графа Si, i = 1..n. Структура узла включает в себя начальное местоположение, иными словами, координаты (x0,y0), в некоторый начальный момент времени t0 = 0,а также вектор скорости .

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

Рисунок 5 - Модель ad hoc сети

3.1 Моделирование поведения узлов ad hoc сети при равномерном движении на плоскости

Так как ad hoc сеть является динамической, то с течением времени местоположение некоторого узла Si меняется, при этом векторы скоростей постоянны, то есть не изменяется ни длина, ни направление. Изменение местоположения некоторого узла Si можно описать системой вида

 , (1)

где  - координаты некоторого узла Si в начальный момент времени t0,  = (ai, bi) - вектор скорости.

Требуется определить моменты изменения графа сети в некоторый временной промежуток [t0,T] и составить соответствующую последовательность t0…tk, , используя которую составляется соответствующая последовательность графов G0…Gk .

Представим компьютерную сеть соответствующим ей графом G = , где V - множество узлов Si, i = 1..n, E - множество ребер, то есть связей между узлами.

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

 , (2)

где i,j = 1..n.

Например, если сеть состоит из трех узлов, изображенных на рисунке 6,

Рисунок 6 - Сеть

то для нее соответствующий граф будет иметь вид, представленный на

рисунке 7.

Рисунок 7 - Граф

Матрица смежности представляется в виде, указанном в таблице 1.

Таблица 1 - Таблица смежности графа


1

2

3

1

0

1

1

2

1

0

1

3

1

1

0


В соответствии с формулой (1), в начальный момент времени t0 = 0 задаем граф G0. Найдем моменты изменения графа G0 по следующей схеме.

Рассмотрим узлы Si и Si+1, i = 1..n. В начальный момент времени t0 = 0 их местоположение на плоскости определяется соответственно системами вида

, (3)

, (4)

а в некоторый момент tj соответственно

,  , (5)

, , (6)

где i = 1..n, j = 1..k.

Так как сеть связна, то условием связности графа будет неравенство вида:

, (7)

где ri, ri+1 - радиусы уверенного приема сигнала соответствующих узлов,

i = 1..n, j = 1..k.

Переходя из неравенства (2) в соответствующее равенство, для каждой пары вершин Si, Si+1 рассчитаем момент времени, который удовлетворяет условию (2). В ходе преобразований получим квадратное уравнение вида

  (8)

решая которое получаем формулу для вычисления моментов изменения графа:

 (9)

где


причем отрицательные значения моментов времени не учитываем. Поскольку равенство (8) квадратное, то получим два значения момента времени, то есть возможны две ситуации:

;

.

Каждая ситуация определяется графическим решением, изображенном на рисунке 8.

t0                     t1                                 t2                           T                 t                                                                                                                                 

t0                     t1                                            t2                          T             t

Рисунок 8 - Графическое решение для двух узлов

Рассмотренные ситуации будут у каждой пары вершин. Таким образом, в момент времени tj с учетом всех пар вершин получим (n*(n-1))/2 неравенств. Изображая графические решения, представленные на рисунке 3, каждого неравенства один под другим в одном масштабе и проводя прямые через t1 и t2 каждой пары узлов соответственно, перпендикулярные оси t, получим сетку. Например, для трех узлов, каждая пара из которых будет иметь свои t1 и t2, с учетом двух возможных ситуаций и, имея граф G0, представленный Таблицей 1, будем иметь графическое решение соответственно рисунку 9.

        [S1, S2]

   t0                t1                         t2                               T       t

       [S2, S3]

   t0    t1                                                                                   t2           T       t

    [S1, S3]

  t0                                     t1                t                       T        t

Рисунок 9 - Графическое решение для трех узлов

По Рисунку 9 определяем, какой паре узлов принадлежит минимальный момент времени. В рассматриваемом примере минимальный момент времени - это t1, принадлежащий паре узлов [S2, S3], обозначим его t1(S2, S3), причем при  соответствующие узлы находились в зоне видимости друг друга, обозначим tj как tj(S2, S3). Однако в зоне видимости находились и узлы (S1, S3), так как для них . Заметим, что в этот момент t1(S2, S3) узлы (S1, S2) не имели между собой связи. Таким образом, в момент времени t1(S2, S3) будем иметь следующую матрицу смежности, указанную в таблице 2.

Таблица 2 - Таблица смежности для графа в момент времени t1.


1

2

3

1

0

0

1

2

0

0

1

3

1

1

0


Аналогично рассуждая для t1(S1, S2), t1(S1, S3), t2(S1, S2), t2(S1, S3), t2(S2, S3), строим соответствующую матрицу смежности получившегося графа. Сравнивая матрицу смежности текущего промежутка с матрицей смежности, составленной для предыдущего промежутка, находим тот момент времени, где хотя бы одно значение матрицы изменилось.

В программной реализации алгоритм моделирования поведения узлов содержится в процедуре CalcGraph() и выглядит следующим образом:

__fastcall TfView::CalcGraph()

{(!dm->qGraph->IsEmpty())

{>qGraph->DisableControls();BK = dm->qGraph->GetBookmark(); //закладкаT= UpDown1->Position;>qGraph->First(); // указатель текущей записи на первую, база= dm->qGraphX->Value+dm->qGraphA->Value*T+dm->

>qGraphR->Value ,= dm->qGraphY->Value+dm->qGraphB->Value*T+dm->

>qGraphR->Value,= dm->qGraphX->Value+dm->qGraphA->Value*T-dm->

>qGraphR->Value,= dm->qGraphY->Value+dm->qGraphB->Value*T-dm->qGraphR->Value;(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next()) //указатель на след. запись в базе, цикл

{if(maxX < dm->qGraphX->Value+dm->qGraphA->Value*T+dm->

>qGraphR->Value) maxX = dm->qGraphX->Value+dm->

>qGraphA->Value*T+dm->qGraphR->Value;(maxY < dm->qGraphY->Value+dm->qGraphB->Value*T+dm->

>qGraphR->Value) maxY = dm->qGraphY->Value+dm->

>qGraphB->Value*T+dm->qGraphR->Value;(minX > dm->qGraphX->Value+dm->qGraphA->Value*T-dm->

>qGraphR->Value) minX = dm->qGraphX->Value+dm->

>qGraphA->Value*T-dm->qGraphR->Value;(minY > dm->qGraphY->Value+dm->qGraphB->Value*T-dm->

>qGraphR->Value) minY = dm->qGraphY->Value+dm->

>qGraphB->Value*T-dm->qGraphR->Value;

}(maxY> maxX) maxX=maxY;(minY< minX) minX=minY;(gImage->Width<gImage->Height)=gImage->Width / (maxX-minY);=gImage->Height / (maxX-minY);>qGraph1->SQL->Clear();(int i=0;i<dm->qGraph->SQL->Count;i++) dm->qGraph1->SQL->

>Add(dm->qGraph->SQL->Strings[i]);(int i=0;i<dm->qGraph->Params->Count;i++) >qGraph1->Params->Items[i]->Value=dm->qGraph->Params->Items[i]->Value;>qGraph->GotoBookmark(BK);>qGraph->FreeBookmark(BK);>qGraph->EnableControls();

}

}

4. Организация базы данных для хранения ad hoc сети

4.1 База данных

База данных - собрание записей, интегрированных в некоторые структуры. Записью в базах данных называют минимальную уникально идентифицируемую единицу независимого хранения данных, образованную иерархией полей[5].

Система управления базами данных - совокупность языковых и программных средств, предназначенных для создания, ведения и совместного использования БД многими пользователями.

Основные функции систем управления базами данных - это определение данных (описание структуры базы данных), обработка данных и управление данными.

Поле записи - именованный элемент данных, являющийся частью структуры записи базы данных или файла[5].

Известны три разновидности структуры данных: иерархическая, сетевая и табличная. Соответственно по признаку структуры базы данных делятся на иерархические БД, сетевые БД и реляционные БД (наиболее распространенные). Хранение динамической модели беспроводной ad hoc сети в данной работе осуществляется в реляционной БД.

Каждая таблица реляционной БД представляется как совокупность строк и столбцов, где строки соответствуют экземпляру объекта, конкретному событию или явлению, а столбцы - атрибутам (признакам, характеристикам, параметрам) объекта, события, явления.

4.2 База данных для ad hoc сети

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

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

 

Рисунок 10 - Схема БД для хранения ad hoc сети

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

Имена графов хранятся в таблице «GRAPHS_NAME», которая включает два поля:

Первичный ключ «ID». Служит для того, чтобы уникально идентифицировать каждую запись в таблице. Поле первичного ключа является автоинкрементным и не может быть пустым. Для получения автоинкремента перед вставкой был создан и установлен триггер «After insert» со следующим скриптом:

AS IF (NEW.ID IS NULL) NEW.ID = GEN_ID(GEN_GRAPHS_NAME_ID,1);

END

В переменной «NEW» находится введенная нами новая запись для таблицы. Поле «ID» этой переменной проверяется, и если оно ровно «NULL», то вызывается функция «GEN_ID», которая генерирует значение, увеличенное на 1 для генератора «GEN_GRAPHS_NAME_ID». И присваивает результат переменной «NEW.ID».

Скрипт генератора «GEN_GRAPHS_NAME_ID»:

CREATE SEQUENCE GEN_GRAPHS_NAME_ID;SEQUENCE GEN_GRAPHS_NAME_ID RESTART WITH 20;

Поле «NAME» хранит имя графа. имеет богатый язык процедурных расширений, PSQL, для написания хранимых процедур и триггеров.

Хранимые процедуры и триггеры являются модулями компилированных, выполняемых кодов, которые выполняются на сервере. Исходный код пишется на расширении языка SQL, называемом процедурным SQL, или PSQL.

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

С данной таблицей также связаны две хранимые процедуры. Процедура «NEW_GRAPH» по добавлению нового графа в базу данных, представляющая собой скрипт:

begin=gen_id(gen_graphs_name_id,1);into graphs_name values(:outid,:inname);

end

И процедура «DELETE_GRAPH» по удалению выбранного графа:

beginfrom graphs_name where id=:inid;

end

Каждому узлу соответствует запись в таблице «GRAPHS», состоящей из семи полей:

«GRAPH_ID» является суррогатным ключом, то есть дополнительным полем, единственное предназначение которого - служить внешним ключом. Значение этого поля заполняется путем выбора значений из связанной с полем внешней таблицы и не может быть пустым.

«GRAPH_TIME» отражает момент времени, когда характеристика соответствующего узла была сохранена и экспортирована из приложения СУБД.

«X» задает одну из ключевых координат положения узла на плоскости по оси абсцисс.

«Y» задает одну из ключевых координат положения узла на плоскости по оси ординат.

«A» это одна из координат вектора скорости, задающее направление по оси абсцисс.

«B» это одна из координат вектора скорости, задающее направление по оси ординат.

Для таблицы «GRAPHS» также организованы хранимые процедуры. Это процедура по добавлению вершины «ADD_POINT»:

begininto graphs values(:ingraph_id,:ingraph_time,:inx,:iny,:inA,:inb,:inr);

end

И процедура по удалению вершины «DELETE_POINT»:

beginfrom graphs:ingraph_id=graph_id and :ingraph_time=graph_time

:inx=X and :iny=Y

:inA=A

:inb=B and :inr=R;

end

Для реализации базы данных использовалась Firebird SQL - компактная, кроссплатформенная <https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%BE%D1%81%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5>, свободная <https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B5_%D0%9F%D0%9E> система управления базами данных <https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85>. Плюсами Firebird являются высокая эффективность и мощная языковая поддержка для хранимых триггеров и процедур. Кроме того, стоит отметить, что Firebird легко поддерживает довольно большие базы данных. СУБД Firebird используется в промышленных системах различного рода как государственного, так и негосударственного сектора.

Для создания, администрирования и совершения каких-либо действий с базой данных используется GUI <https://ru.wikipedia.org/wiki/GUI>-оболочка IBExpert. Данный продукт является одним из лучших инструментальных пакетов для работы с базами данных Firebird. Он позволяет в визуальном режиме создавать и модифицировать объекты, содержащиеся в БД. После работы в одном из визуальных редакторов (таблиц, доменов, скриптов и т.д.) выполняется компиляция произведенных действий. При этом IBExpert генерирует соответствующие операторы модификации базы, выполнение которых над БД подтверждается нажатием кнопки «Commit». IBExpert также содержит средства анализа производительности выполнения запросов. С его помощью можно решать подавляющее большинство задач, возникающих при проектировании и создании баз данных Firebird.

4.3 Клиентское приложение для работы с базой данных

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

Все объекты компонентов размещаются в объектах - формах. Для каждой формы C++Builder создает отдельные модули, в которых и осуществляется программирование задачи [7].

Для реализации просмотра, добавления, удаления и сохранения информации в приложении использованы следующие компоненты С++ Builder:. Это центральный компонент, предназначен для соединения с базой данных. . Организует управление транзакциями.. В качестве источника данных используется размещенный на странице DataSource. Он связывается с набором данных своим свойством Data Set.. Компонент для выполнения запросов SQL к серверу.. Используется для просмотра и редактирования базы данных в режиме таблицы.- набор кнопок для навигации по DBGrid.

Перейдем к рассмотрению форм приложения. Общий вид главной формы представлен на рисунке 10.

Рисунок 10 - Главная форма клиентского приложения

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

Рисунок 11 - Задание нового графа вручную

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

Рисунок 12 - Форма добавления нового узла графа

В приложении существует возможность автоматического добавления графа с существующими характеристиками из текстового файла. При нажатии на кнопку «Загрузить из файла» открывается окно выбора нужного графа. Диалоговое окно выбора включает в себя список файлов. Когда пользователь выбирает файл из списка, только файлы текстового типа отображаются в диалоговом окне. Пример проиллюстрирован на рисунке 13.

Рисунок 13 - Автоматическое добавление графа из текстового файла

После того, как вся необходимая информация о графе выбранным способом поступила в приложение, можно начинать моделировать поведение узлов графа путем изменения моментов времени. Таким образом, из начального графа «Тест», который, к примеру, изображен на рисунке 10, после некоторых промежуточных графов на седьмой секунде равномерного движения получается связный граф «G7». Пример полученного графа можно увидеть на рисунке 14.

Рисунок 14 - Пример связного графа G7

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

Рисунок 15 - Сохранение графа G7 в текстовый файл

Рисунок 16 - Содержание текстового файла с данными о графе G7

Убедиться в том, что экспорт успешно осуществляется не только в текстовые файлы, но и в базу, можно обратившись к утилите IBExpert и выполнив запрос к созданной базе данных. На рисунке 17 продемонстрирован sql-запрос, выполненный в окне редактора. А на рисунке 18 соответствующий результат запроса, идентичный содержанию ранее созданного текстового файла «Тест».

Рисунок 17 - Выполнение sql-запроса к базе данных

Рисунок 18 - Результат sql-запроса к базе данных

беспроводной сеть узел граф

Заключение

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

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

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

.

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

Миков А.И. Графы и грамматики // Кубанский государственный университет, - Краснодар:2014, - 160 с.

Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии, протоколы. //«Питер», М.: 2005, - 602 с.

Таненбаум Э. Компьютерные сети. 4-е изд.// «Питер», М.: 2003, - 992 с.

Голованов М. Иерархические структуры данных в реляционных БД. [Электронный ресурс] URL: http://www.rsdn.ru/article/db/Hierarchy.xml#EZ, [Дата обращения: 28.01.2002]

Мейер М. Теория реляционных баз данных. // «Мир», - М.: 1987, - 608 с.

Ковязин А.Н., Востриков С.М. Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/Firebird/Yafill. // «КУДИЦ-ОБРАЗ», М.: 2002, - 432 с.

Архангельский А.Я. C++Builder 6. Справочное пособие. Книга 1. Язык C++// «Бином-Пресс», М.: 2002 г, - 544 с.

Хомоненко А.Д., Ададуров С.Е. Работа с базами данных в C++ Builder. // «БХВ-Петербург», М.: 2006, - 496 с.C++ Builder 5. Энциклопедия программиста// «ДиаСофт», М.: 2001, - 944 с.

Приложение А

Описание программы

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

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

В качестве СУБД для организации базы данных была использована кроссплатформенная, свободная система реляционного типа - FirebirdSQL. Для разработки и администрирования базы, а также для выбора и изменения данных применялась GUI-оболочка IBExpert.

Основная функция данного программного продукта заключается в организации базы данных для хранения динамической модели ad hoc сети. В качестве дополнительной функции выступает создание приложения СУБД для обеспечения связи с пользователем.

Программа «Организация базы данных для хранения динамических моделей беспроводных компьютерных ad hoc сетей» написана в интегрированной среде разработки C++ Builder, объединяющей в себе комплекс объектных библиотек (STL, VCL, CLX, MFC и др.), компилятор, отладчик, редактор кода и многие другие компоненты. Ключевой механизм BDE(Borland Database Engine), применяемый во всех продуктах производства корпорации Borland, обеспечивает работу визуальных компонент баз данных, действует как интерфейс между приложением и самой базой данных. BDE реализован в виде набора системных DLL файлов.

Среда C++ Builder может работать в операционных системах Microsoft Windows 2000, Microsoft Windows XP Professional, Microsoft Windows Server 2003 или Microsoft Windows Vista. Требования к ресурсам компьютера: - Процессор должен быть класса Pentium III 1,4 ГГц или более мощный;

512 Мбайт оперативной памяти;

750 Мбайт свободного места на жестком диске, в том числе для Microsoft .NET Framework и Microsoft .NET SDK.работает на аппаратных платформах x86, x64 и PowerPC, Sparc и многих других, поддерживая легкий переход между этими платформами. Наиболее широко используемыми для серверов «Firebird» операционными системами являются Linux и Microsoft Windows (включая NT) .

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

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

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

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

Разработка программного продукта состоит из следующих частей:

Организация базы данных

Разработка клиентского приложения

Разработка хранимых процедур

Разработка возможности ручного добавления в базу

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

Алгоритм ручного добавления узла в базу данных

При нажатии на кнопку «Добавить узел» происходят следующие изменения:

Модально отображается форма с вводом данных;>ShowModal();

Пользователь вносит данные и нажимает кнопку «Да»;

Происходит обращение к серверу, а именно к хранимой процедуре AddPoint ;

dm->spAddPoint->Params->Items[0]->Value = dm->>Value;>spAddPoint->Params->Items[1]->Value = 0;

…>spAddPoint->Params->Items[6]->= StrToFloat(newPoint->eRin->Text);>spAddPoint->ExecProc(); //>qGraph->Close();

dm->qGraph->Open();

Процедура AddPoint представляет собой запрос:

insert into graphs values(:ingraph_id,:ingraph_time,:inx,:iny,:inA,:inb,:inr);

В данном запросе «insert into graphs» означает добавление строки в таблицу graphs. Далее следует перечисление всех полей и вносимые значения из формы через соответствующие переменные.

При успешном выполнении операции выводится сообщение о добавлении узла в базу данных.

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

При нажатии на кнопку «Загрузить из файла» вызывается компонент для открытия файлов:->DefaultExt="txt";

Диалоговое окно выбора включает в себя выпадающий список файлов. Когда пользователь выбирает файл из списка, только файлы текстового типа отображаются в диалоговом окне. Это реализуется при помощи свойства «Filter»:->Filter="ASCII files (*.txt)|*.txt|";

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

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

AnsiString FileNameR = OpenDialog1->FileName;>LoadFromFile(FileNameR);

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

for (int i=2; i<stm->Count;i++ )

{(buf, stm->Strings[i].c_str());*p = strtok(buf, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");

R = StrToFloat(String(p));

Происходит вызов сервера и обращение к хранимой процедуре «NewGraph» по добавлению имени графа в таблицу базы данных «GRAPH_NAME» и добавлению узлов в таблицу «GRAPHS» процедурой «AddPoint»

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

Компьютер стандарта IBM PC с установленной операционной системой Windows 8/7/ХР 64bit.

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

Запуск файла формата .exe.

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

текстовая информация, вводимая пользователем

файл с расширением txt

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

таблицы базы данных

Приложение В

Пояснительная записка

Введение

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

Наименование разработки «Организация базы данных для хранения динамических моделей беспроводных компьютерных ad hoc сетей».

Программное обеспечение «Организация базы данных для хранения динамических моделей беспроводных компьютерных ad hoc сетей» предназначено для моделирования поведения узлов ad hoc сети в соответствующие моменты времени при помощи базы данных и работой над ней.

Работа выполнена в рамках научного проекта "Исследование структурных и динамических свойств стохастических беспроводных компьютерных ad hoc сетей".

. Назначение и область применения

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

. Технические характеристики

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

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

Организация базы данных для хранения динамической модели беспроводной компьютерной ad hoc сети;

Реализация программы, которая по начальному графу G0 будет строить последовательность графов G0…Gk в соответствующие моменты времени t0…tk;

Реализация обратной связи: - программы, которая будет считывать данные из БД и строить соответствующую модель сети (геометрический граф).

Возможность ручного ввода в базу данных;

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

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

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

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

Для размещения системы необходим компьютер, который обеспечивает работу с ОС Windows server, а также наличие Firebird SQL Server, работающего в качестве сервера.

. Ожидаемые технико-экономические показатели

Технико-экономические показатели программного обеспечения «Организация базы данных для хранения динамических моделей беспроводных компьютерных ad hoc сетей» обеспечивают выполнение следующих требований:

Система имеет доступный и дружественный для пользователя интерфейс;

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

В системе предусмотрены различные виды ввода и вывода информации;

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

Источники, использованные при разработке

ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.

Послед Б.С. Borland C++ Builder 6. Разработка приложений баз данных. - М.: ДиаСофтЮП, 2009.


Код программы

Файл модуля UnitDM.cpp

#include <vcl.h>

#pragma hdrstop

#include "UnitDM.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"*dm;

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

__fastcall Tdm::Tdm(TComponent* Owner)

: TDataModule(Owner)

{

}

//---------------------------------------------------------------------------__fastcall Tdm::DataModuleCreate(TObject *Sender)

{s = GetCurrentDir();=s+s[3]+"GRAPH.FDB";>DatabaseName=s;>Open();opts;>IndexFieldNames="NAME;ID";

}

//---------------------------------------------------------------------------__fastcall Tdm::DataModuleDestroy(TObject *Sender)

{(IBTransaction1->Active)->Commit();

}

Модуль getstr.cpp

#include <vcl.h>

#pragma hdrstop

#include "getstr.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"*rmGetName;

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

__fastcall TrmGetName::TrmGetName(TComponent* Owner)

: TForm(Owner)

{

}

Файл модуля new_Point.cpp

#include <vcl.h>

#pragma hdrstop

#include "new_Point.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"*newPoint;

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

__fastcall TnewPoint::TnewPoint(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TnewPoint::eXKeyPress(TObject *Sender, char &Key)

{(Key!=0x8)

{*edt = dynamic_cast<TEdit *>(Sender);= edt->Text;=s.SubString(1,edt->SelStart)+Key+s.SubString((edt->SelStart)+1,s.Length());

{d=StrToFloat(s);

}(...)

{=0x0;

}

}

}

//---------------------------------------------------------------------------__fastcall TnewPoint::FormActivate(TObject *Sender)

{>Text="";>Text="";>Text="";>Text="";>Text="";;

}

//---------------------------------------------------------------------------__fastcall TnewPoint::eXChange(TObject *Sender)

{>Enabled=(eX->Text!="")&&(eY->Text!="")&&(eA->Text!="")&&(eB->Text!="")&&

(eRin->Text!="");

}

Файл модуля view.cpp

#include <vcl.h>

#include <controls.hpp>

#pragma hdrstop

#include "view.h"

#include "UnitDM.h"

#include "math.h"

#include "getstr.h"

#include "new_Point.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"*fView;

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

__fastcall TfView::TfView(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------clLine = (TColor) RGB(25,25,150);clCircle =(TColor) RGB(252,255,240);clPoint= (TColor) RGB(255,0,0);RPoint=2;min (double t1, double t2)

{(t1<t2) return t1;return t2;

}__fastcall TfView::CalcGraph()

{(!dm->qGraph->IsEmpty())

{>qGraph->DisableControls();

TBookmark BK = dm->qGraph->GetBookmark(); //идентифицировать данный фрагмент текста по закладке.

// gImage->Width = gImage->Height;T= UpDown1->Position;>qGraph->First();= dm->qGraphX->Value+dm->qGraphA->Value*T+dm->qGraphR->Value ,= dm->qGraphY->Value+dm->qGraphB->Value*T+dm->qGraphR->Value,= dm->qGraphX->Value+dm->qGraphA->Value*T-dm->qGraphR->Value,= dm->qGraphY->Value+dm->qGraphB->Value*T-dm->qGraphR->Value;(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())

{(maxX < dm->qGraphX->Value+dm->qGraphA->Value*T+dm->qGraphR->Value) maxX = dm->qGraphX->Value+dm->qGraphA->Value*T+dm->qGraphR->Value;(maxY < dm->qGraphY->Value+dm->qGraphB->Value*T+dm->qGraphR->Value) maxY = dm->qGraphY->Value+dm->qGraphB->Value*T+dm->qGraphR->Value;(minX > dm->qGraphX->Value+dm->qGraphA->Value*T-dm->qGraphR->Value) minX = dm->qGraphX->Value+dm->qGraphA->Value*T-dm->qGraphR->Value;(minY > dm->qGraphY->Value+dm->qGraphB->Value*T-dm->qGraphR->Value) minY = dm->qGraphY->Value+dm->qGraphB->Value*T-dm->qGraphR->Value;

}(maxY> maxX) maxX=maxY;(minY< minX) minX=minY;(gImage->Width<gImage->Height)= gImage->Width / (maxX-minY);= gImage->Height / (maxX-minY);>qGraph1->SQL->Clear();(int i=0;i<dm->qGraph->SQL->Count;i++) dm->qGraph1->SQL->Add(dm->qGraph->SQL->Strings[i]);(int i=0;i<dm->qGraph->Params->Count;i++) dm->qGraph1->Params->Items[i]->Value=dm->qGraph->Params->Items[i]->Value;>qGraph->GotoBookmark(BK);>qGraph->FreeBookmark(BK);>qGraph->EnableControls();

}

}__fastcall TfView::PaintGraph()

{(!dm->qGraph->IsEmpty())

{>qGraph->DisableControls();BK = dm->qGraph->GetBookmark();

// gImage->Width = gImage->Height;>Canvas->Brush->Color=clWhite;>Canvas->FillRect(gImage->ClientRect);T= UpDown1->Position;

// if (cbShowR->Checked)

{(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())(predPoint == dm->qGraph->RecNo)

{>Canvas->Pen->Color = clGray;>Canvas->Brush->Color =clCircle;x1=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T-dm->qGraphR->Value-minX),=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T-dm->qGraphR->Value-minX),=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T+dm->qGraphR->Value-minX),=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T+dm->qGraphR->Value-minX);>Canvas->Ellipse((int) x1,(int) y1,(int) x2,(int) y2);

}

}>Canvas->Pen->Color = clLine;>qGraph1->Open();>Canvas->Pen->Width=2;>Canvas->Pen->Color = clLine;(dm->qGraph1->First();!dm->qGraph1->Eof;dm->qGraph1->Next())(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())

{x1=(dm->qGraphX->Value+dm->qGraphA->Value*T),=(dm->qGraphY->Value+dm->qGraphB->Value*T),=(dm->qGraph1X->Value+dm->qGraph1A->Value*T),=(dm->qGraph1Y->Value+dm->qGraph1B->Value*T),=min(pow(dm->qGraph1R->Value,2),pow(dm->qGraphR->Value,2));(((dm->qGraph1->RecNo)<(dm->qGraph->RecNo)) && ((pow(x1-x2,2)+pow(y1-y2,2))<=d))

{>Canvas->MoveTo((int) (scale*(x1-minX)),(int) (scale*(y1-minX)));>Canvas->LineTo((int) (scale*(x2-minX)),(int) (scale*(y2-minX)));

}

}>qGraph1->Close();>Canvas->Pen->Color =clPoint;>Canvas->Brush->Color =clPoint;(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())

{x1=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T-minX)-RPoint,=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T-minX)-RPoint,=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T-minX)+RPoint,=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T-minX)+RPoint;>Canvas->Ellipse((int) x1,(int) y1,(int) x2,(int) y2);

}>qGraph->GotoBookmark(BK);>qGraph->FreeBookmark(BK);>qGraph->EnableControls();

}

}__fastcall TfView::FormActivate(TObject *Sender) //активация формы

{>DataSet = dm->tGraphNames;>DataSet = dm->qGraph;=0;(Sender);>OnChange = eTimeChange;

}

//---------------------------------------------------------------------------__fastcall TfView::FormResize(TObject *Sender) //изменение размера

{();();

}

//---------------------------------------------------------------------------__fastcall TfView::gImageMouseMove(TObject *Sender, TShiftState Shift,X, int Y)

{T= UpDown1->Position;(gImage->Canvas->Pixels[X][Y]==clPoint)

{ dm->qGraph->DisableControls();BK = dm->qGraph->GetBookmark();(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())

{x1=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T-minX)-RPoint,=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T-minX)-RPoint,=scale*(dm->qGraphX->Value+dm->qGraphA->Value*T-minX)+RPoint,=scale*(dm->qGraphY->Value+dm->qGraphB->Value*T-minX)+RPoint;(((x1<=X)&&(x2>=X)&&(y1<=Y)&&(y2>=Y))&&(predPoint!=dm->qGraph->RecNo))

{(HWin == NULL)

{= new THintWindow(this);>Parent = fView;>Color = clInfoBk;

}= dm->qGraph->RecNo;= "X="+dm->qGraphX->AsString+", Y="+dm->qGraphY->AsString+", R="+dm->qGraphR->AsString;Tr;.Left = fView->Left+gImage->Left+X-gImage->Canvas->TextWidth(s)/2;.Top = fView->Top+gImage->Top+Y;.Right = Tr.Left + gImage->Canvas->TextWidth(s)+20;.Bottom = Tr.Top + gImage->Canvas->TextHeight(s);();>ActivateHint(Tr,s);

}

}>qGraph->GotoBookmark(BK);>qGraph->FreeBookmark(BK);>qGraph->EnableControls();

}

{(predPoint != 0)

{= 0;();

}= 0;(HWin!=NULL)

{>Free();=NULL;= 0;

}

}

}

//---------------------------------------------------------------------------__fastcall TfView::FormClose(TObject *Sender, TCloseAction &Action)

{>DataSet = NULL;>DataSet = NULL;

}

//---------------------------------------------------------------------------__fastcall TfView::BitBtn1Click(TObject *Sender) //новый граф

{>ShowModal();(rmGetName->ModalResult==mrOk)

{>spNewGraph->Params->Items[1]->Value = rmGetName->Edit1->Text;id;>spNewGraph->ExecProc();= dm->spNewGraph->Params->Items[0]->Value;>tGraphNames->Refresh();opt;>tGraphNames->Locate("ID",id, opt);

}(Sender);

}

//---------------------------------------------------------------------------__fastcall TfView::BitBtn2Click(TObject *Sender) //удалить граф

{(MessageDlg("Удалить граф "+dm->tGraphNamesNAME->AsString+"?",mtConfirmation,TMsgDlgButtons() << mbYes<<mbNo,0)== mrYes)

{>spDeleteGraph->Params->Items[0]->Value = dm->tGraphNamesID->Value;>spDeleteGraph->ExecProc();>tGraphNames->Refresh();

}(Sender);

}

//---------------------------------------------------------------------------__fastcall TfView::Button2Click(TObject *Sender) //удалить узел

{(MessageDlg("Удалить узел?",mtConfirmation,TMsgDlgButtons() << mbYes << mbNo,0)== mrYes)

{>spDeletePoint->Params->Items[0]->Value = dm->qGraphGRAPH_ID->Value;>spDeletePoint->Params->Items[1]->Value = dm->qGraphGRAPH_TIME->Value;>spDeletePoint->Params->Items[2]->Value = dm->qGraphX->Value;>spDeletePoint->Params->Items[3]->Value = dm->qGraphY->Value;>spDeletePoint->Params->Items[4]->Value = dm->qGraphA->Value;>spDeletePoint->Params->Items[5]->Value = dm->qGraphB->Value;>spDeletePoint->Params->Items[6]->Value = dm->qGraphR->Value;>spDeletePoint->ExecProc();>qGraph->Close();>qGraph->Open();

}(Sender);

}

//---------------------------------------------------------------------------__fastcall TfView::Button1Click(TObject *Sender) //добавить узел

{>ShowModal();(newPoint->ModalResult==mrOk)

{>spAddPoint->Params->Items[0]->Value = dm->tGraphNamesID->Value;>spAddPoint->Params->Items[1]->Value = 0;>spAddPoint->Params->Items[2]->Value = StrToFloat(newPoint->eX->Text);>spAddPoint->Params->Items[3]->Value = StrToFloat(newPoint->eY->Text);>spAddPoint->Params->Items[4]->Value = StrToFloat(newPoint->eA->Text);>spAddPoint->Params->Items[5]->Value = StrToFloat(newPoint->eB->Text);>spAddPoint->Params->Items[6]->Value = StrToFloat(newPoint->eRin->Text);>spAddPoint->ExecProc();>qGraph->Close();>qGraph->Open();

}(Sender);

}

//---------------------------------------------------------------------------__fastcall TfView::dsNamesDataChange(TObject *Sender, TField *Field)

{>qGraph->Close();>qGraph->Params->Items[0]->Value = dm->tGraphNamesID->Value;>qGraph->Params->Items[1]->Value = 0;>qGraph->Open();(Sender);

}

//---------------------------------------------------------------------------__fastcall TfView::eTimeChange(TObject *Sender)

{();();

}

//---------------------------------------------------------------------------__fastcall TfView::BitBtn3Click(TObject *Sender) //сохранить

{>qGraph->DisableControls();BK = dm->qGraph->GetBookmark();T= UpDown1->Position;*stm = new TStringList();>Add(dm->tGraphNamesNAME->AsString);>Add(eTime->Text);(dm->qGraph->First();!dm->qGraph->Eof;dm->qGraph->Next())

{X =dm->qGraphX->Value+dm->qGraphA->Value*T,=dm->qGraphY->Value+dm->qGraphB->Value*T;>Add(FloatToStr(X)+" "+FloatToStr(Y)+" "+dm->qGraphA->AsString+" "+dm->qGraphB->AsString+" "+dm->qGraphR->AsString);

}>qGraph->GotoBookmark(BK);>qGraph->FreeBookmark(BK);>qGraph->EnableControls();->DefaultExt="txt";->Filter="ASCII files (*.txt)|*.txt|";->Title="Сохранить граф "+dm->tGraphNamesNAME->AsString;(SaveDialog1->Execute())

{

{FileNameR = SaveDialog1->FileName;>SaveToFile(FileNameR);

}(...)

{("Не удалось сохранить",mtError, TMsgDlgButtons() << mbOK ,0);

}

}stm;

}

//---------------------------------------------------------------------------__fastcall TfView::Button3Click(TObject *Sender) //загрузить из файла

{->DefaultExt="txt";->Filter="ASCII files (*.txt)|*.txt|";->Title="Сохранить граф "+dm->tGraphNamesNAME->AsString;(OpenDialog1->Execute())

{ int T=0;*stm = new TStringList(); // а надо ли в Мемо?FileNameR = OpenDialog1->FileName;>LoadFromFile(FileNameR);(stm->Count>2)

{buf[100];(buf, stm->Strings[0].c_str());= String(buf);>spNewGraph->Params->Items[1]->Value = FileNameR ;>spNewGraph->ExecProc();id = dm->spNewGraph->Params->Items[0]->Value;>tGraphNames->Refresh();opt;>tGraphNames->Locate("ID",id, opt);(buf, stm->Strings[1].c_str());= StrToInt(String(buf));X,Y,A,B,R;(int i=2; i<stm->Count;i++ )

{(buf, stm->Strings[i].c_str());*p = strtok(buf, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));= strtok(NULL, " \r\n");= StrToFloat(String(p));>spAddPoint->Params->Items[0]->Value = id;>spAddPoint->Params->Items[1]->Value = 0;>spAddPoint->Params->Items[2]->Value = X-A*T;>spAddPoint->Params->Items[3]->Value = Y-B*T;>spAddPoint->Params->Items[4]->Value = A;>spAddPoint->Params->Items[5]->Value = B;>spAddPoint->Params->Items[6]->Value = R;>spAddPoint->ExecProc();

}

}>qGraph->Close();>qGraph->Open();stm;->Position=T;(Sender); }

}

Похожие работы на - Организация базы данных для хранения динамических моделей беспроводных компьютерных Ad hoc сетей

 

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