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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 10.06.2013
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

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

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

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

К преимуществам данных устройств можно отнести отсутствие необходимости замены в домах старой застройки электропроводку, а к недостаткам - высокую стоимость (розетки со встроенным УЗО обойдутся примерно в 3 раза дороже, чем УЗО, устанавливаемые на распределительный щит).

Третьим видом устройств со встроенным УЗО является так называемая "УЗО-вилка".

К эффективным защитным устройства также относятся дифференциальные автоматы, которые представляют собой комбинацию автоматического выключателя с УЗО (по типу "два в одном"). Дифференциальный автомат срабатывает в обоих случаях: как при утечке тока на землю, так и при коротких замыканиях и перегрузке. Их выгодно применять в том случае, когда на установку двух отдельных устройств в электрошкафу не хватает места. Цена на дифференциальный автомат превышает цену на УЗО.

Прежде, чем купить УЗО, следует обратить внимание на маркировку прибора - на лицевой панели каждого УЗО обязательно должно присутствовать значение номинального тока, который оно способно проводить в продолжительном режиме, и номинального отключающего дифференциального тока, вызывающего срабатывание устройства. Остальные сведения можно располагать и на боковых поверхностях. Обычно производителю удается также указать на передней панели свое название, номинальное напряжение, марку и тип прибора. Последнее в виде символа: синусоида - тип AC, а если под ней еще изображении два положительных полупериода - это тип A. И, конечно, чтобы было понятно назначение кнопки, на ней ставят слово "Test" или букву "T". Стоит также отметить, что помимо оригинальных УЗО известных производителей (ABB, Legrand, Астро-УЗО, ИЭК, SASSIN и др.) на российском рынке появилось огромное количество самых разнообразных подделок УЗО неустановленного происхождения и имеющих часто привлекательный внешний вид, но по техническим параметрам не выдерживающих даже приемосдаточных испытаний. Применение подобных устройств совершенно недопустимо, поэтому, при выборе УЗО необходимо обратить внимание и на наличие сопроводительной технической документации, в том числе обязательно двух сертификатов - сертификата соответствия и сертификата пожарной безопасности.

Защитные устройства типа УЗО устанавливаются в распределительном шкафу квартиры (можно использовать и уже имеющиеся шкафы).

Номинальный отключающий дифференциальный ток IDn = ток уставки выбирается из следующего ряда: 6 мА, 10 мА, 30 мА, 100 мА, 300 мА, 500 мА - причем, реальное значение тока отключения определяется еще и номинальным неотключающим током утечки IDn0 и находится ниже уровня уставки, поскольку номинальный неотключающий дифференциальный ток IDn0 УЗО, обычно, равен половине значения тока уставки: IDn0 = 0,5 IDn. Каждое конкретное устройство имеет, как правило, определенное стабильное значение отключающего тока, находящееся в указанном диапазоне. Во избежание ложных отключений следует учитывать данное обстоятельство и сопоставлять реальное значение отключающего тока с "обычным"="фоновым" током утечки в электроустановке.

Уставку УЗО для каждого конкретного случая применения, теоретически, выбирают с учетом следующих факторов:

– значения существующего в данной электроустановке суммарного (с учетом присоединяемых стационарных и переносных электроприемников) тока утечки на землю - так называемого "фонового тока утечки";

– значения допустимого тока через человека на основе критериев электробезопасности;

– реального значения отключающего дифференциального тока УЗО, которое в соответствии с требованиями ГОСТ Р 50807-94 находится в диапазоне 0,5 IDn - IDn.

Согласно требованиям ПУЭ (7-е изд., п.7.1.83) номинальный дифференциальный отключающий ток УЗО должен быть не менее чем в три раза больше суммарного тока утечки защищаемой цепи электроустановки - ID. То есть: IDn > = 3 ID.

Суммарный ток утечки электроустановки замеряется специальными приборами, либо определяется расчетным путем. При отсутствии фактических (замеренных) значений тока утечки в электроустановке ПУЭ (п.7.1.83) предписывают принимать ток утечки электроприемников из расчета 0,4 мА на 1 А тока нагрузки, а ток утечки цепи из расчета 10 мкА на 1 м длины фазного проводника.

В некоторых случаях, для определенных потребителей значение уставки задается нормативными документами. В ГОСТ Р 50669-94 применительно к зданиям из металла или с металлическим каркасом задается значение уставки УЗО не выше 30 мА. Временные указания предписывают: для сантехнических кабин, ванных и душевых устанавливать УЗО с током срабатывания: 10 мА, если на них выделена отдельная линия; в остальных случаях, (например, при использовании одной линии для сантехнической кабины, кухни и коридора) допускается использовать УЗО с уставкой 30 мА (п.4.15); в индивидуальных жилых домах для групповых цепей, питающих штепсельные розетки внутри дома, включая подвалы, встроенные и пристроенные гаражи, а также в групповых сетях, питающих ванные комнаты, душевые и сауны УЗО с уставкой 30 мА; для устанавливаемых снаружи штепсельных розеток УЗО с уставкой 30 мА (п.6.5).

В ПУЭ (7-е изд. п.7.1.84) рекомендуется для повышения уровня защиты от возгорания при замыканиях на заземленные части на вводе в квартиру, индивидуальный дом и тому подобное установка УЗО с током срабатывания до 300 мА.

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

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

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

2. Технический проект

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

Реализация прецедента "Взрыв точек"

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

На рисунке 2.1 показана диаграмма последовательностей системных операций, разработанная на основе прецедента "Взрыв точек". Исполнителем сценария прецедента "Взрыв точек" является Пользователь. Диаграмма была построена в соответствии с правилами и обозначениями языка UML.

Рисунок 2.1 - Диаграмма последовательностей системных операций

(для сценария прецедента "Взрыв точек")

Тестовые наборы, построенные по данным вариантов использования

Рассмотрим прецедент "Взрыв точек". По сценарию прецедента "Взрыв точек" в соответствии с требованиями к тестированию аналитических и проектных моделей были построены следующие тестовые наборы:

1. Случай использования: пользователь в меню программы выбирает автоматическую смену точки обзора (Представление->Автоматическая смена точки обзора).

Предусловие: пользователь открыл в приложении файл вида Таблица XML 2003.

Тестовый случай: в текущем представлении нет сходящихся точек.

Ожидаемый результат: оповещение пользователя, о том что сходящихся точек нет, положение точек на экране не изменилось.

2. Случай использования: пользователь в меню программы выбирает автоматическую смену точки обзора (Представление - >Автоматическая смена точки обзора).

Предусловие: пользователь открыл в приложении файл вида Таблица XML 2003.

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

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

3. Случай использования: пользователь в меню программы выбирает автоматическую смену точки обзора (Представление - >Автоматическая смена точки обзора).

Предусловие: файл пользователь открыл в приложении файл вида Таблица XML 2003.

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

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

4. Случай использования: пользователь в меню программы выбирает автоматическую смену точки обзора (Представление - >Автоматическая смена точки обзора).

Предусловие: файл пользователь открыл в приложении файл вида Таблица XML 2003.

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

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

Концептуальная модель предметной области

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

1. Составлен список кандидатов на роль концептуальных классов на основе текстового описания прецедентов: "Обозреватель", "Справка", "Точки", "Группы точек", "Параметры представления", "Взрыв", "Параметры взрыва".

2. Добавлены необходимые ассоциации, отражающие связи, для которых требуется выделение памяти и кратность. Разработанные ассоциации представлены в таблице 2.1.

Таблица 2.1 - Разработанные ассоциации

Объекты

Ассоциации

Кратность

1

2

3

Обозреватель - Справка

Включает

1 - 1

Обозреватель - Параметры представления

Включает

1 - 1

Параметры представления - Точки

Включает

1 - 1

Группы точек - Точки

Включает

1 - 1

Точки - Группы точек

Включает

1 - 1

Взрыв точек - Группы точек

Взаимодействует

1 - 1

Взрыв точек - Группы точек

Включает

1 - 1

Взрыв точек - параметры взрыва

Включает

1 - 1

3. Добавлены атрибуты, необходимые для выполнения информационных требований.

На рисунке 2.2 показана концептуальная модель предметной области, разработанная на основе текстового описания прецедента "Взрыв точек".

Рисунок 2.2 - Концептуальная модель предметной области

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

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

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

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

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

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

Рассмотрим реализацию системной операции компьютерного распознавания.

На рисунке 2.3 представлена диаграмма коопераций, отражающая взаимодействие объектов в процессе выполнения системной операции startButton_Explosion взрыва точек. Диаграмма была построена в соответствии с правилами и обозначениями языка UML.

Рисунок 2.3 - Диаграмма коопераций

Операция: выполнить взрыв ().

Ссылки: прецеденты: взрыв точек.

Предусловия: отмечены особым цветом сходимости.

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

Операция: создать объект ().

Ссылки: прецеденты: взрыв точек.

Предусловия: отмечены особым цветом сходимости.

Постусловия: создан объект "Explosion".

Операция: смена точки обзора ().

Ссылки: прецеденты: взрыв точек.

Предусловия: отмечены особым цветом сходимости.

Постусловия: поменялся точка обзора.

Операция: проверка сходимостей ().

Ссылки: прецеденты: взрыв точек.

Предусловия: отмечены особым цветом сходимости.

Постусловия: получили список сходимостей (список может быть пустым).

Тестовые наборы, построенные на основании покрытий диаграмм взаимодействия

На основании покрытий диаграмм взаимодействия были построены следующие тестовые наборы:

1. Операция: проверка сходимостей ().

Предусловие: отмечены особым цветом сходимости.

Тестовый случай: ProblemPoints. Count == 0.

Ожидаемый результат: выдаёт сообщение, что нет сходимостей.

2. Операция: смена точки обзора ().

Предусловие: выделены крупнее, отмечены особым цветом сходимости.

Тестовый случай: CurrentPointравен 1.

Ожидаемый результат: CurrentPoint увеличивается на 1.

3. Операция: новое совпадение ().

Предусловие: выделены крупнее, отмечены особым цветом сходимости.

Тестовый случай: несколько точек проецируется в одну.

Ожидаемый результат: точка выделяется особым цветом.

Диаграмма классов

На рисунке 2.4 показана разработанная диаграмма классов пакета TravelingSalesmanProblemLibrary. Диаграмма была построена в соответствии с правилами и обозначениями языка UML [1 с.291].

Рисунок 2.4 - Диаграмма классов для реализации прецедента "Взрыв точек"

Диаграмма активностей

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

Рисунок 2.5 - Диаграмма активностей

Тестовые наборы

Тестовые наборы для отладки системы

Тестовые наборы для отладки системы представлены в таблице 2.2

Таблица 2.2 - Тестовые наборы

Описание

Ввод

Вывод

Состояние

Событие

Состояние

Системные сообщения

1

2

3

4

5

Запуск приложения

Приложение не запущено

Запуск приложения

Приложение запущено

нет

Повторный запуск приложения

Приложение запущено

Повторный запуск приложения

Приложение запущено

нет

Открытие файла

Приложение запущено

Открытие файла

Приложение запущено

нет

Настройка параметров

Запущено приложение, активировандиалог "Взрыв точек"

Изменение параметров по умолчанию

Система сохраняет изменённые параметры вкладки "Настройки" до закрытия диалога

нет

Взрыв точек

Открыт диалог "Взрыв точек "

Пользователь подтверждает начало "взрыва"

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

Система оповещает об изменениях

3. Рабочий проект

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

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

- набор кнопок управления;

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

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

Таблица 3.1 - Структура вкладок

Название вкладки

Назначение

Файл

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

Выборка

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

Представление

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

Вид

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

Справка

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

На рисунке 3.1 представлен внешний вид главного окна приложения (данный вид будет отображен после запуска приложения).

1 - названия вкладок; 2 - кнопка вызова диалога настроек параметров; 3 - кнопки инструментов; 4 - вызов справки.

Рисунок 3.1 - Внешний вид главного окна приложения

На рисунке 3.2 представлен внешний вид окна при наведении на точку.

Рисунок 3.2 - внешний вид окна при наведении на точку

На рисунке 3.3 представлено окно надстроек осей.

Рисунок 3.3 - Окно настроек осей

Описание программного кода для данной кладки содержится в приложении А.

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

Для отладки интерфейса разработаны следующие тестовые наборы:

1. Случай использования: Открытие файла.

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

Тестовый случай: Подтверждение открытия файла.

Ожидаемый результат: Открытие дочернего окна с представленными данными из выбранного файла (рисунок 3.5).

Рисунок 3.5 - Открыто дочернее окно с представленными данными из файла

2. Случай использования: Перенос начала координат в выбранную точку.

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

Рисунок 3.6 - Начало координат переместилось в выбранную точку

2. Случай использования: Изменение веса осей.

Предусловие: Открыто главное окно программы. Открыто представление данных из файла.

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

Ожидаемый результат: В зависимости от воздействия, вес оси соответственно меняется. Если в большую сторону, то точки прижимаются к оси, если в меньшую - отдаляются (рисунок 3.7).

Рисунок 3.7 - Изменение веса оси

2. Случай использования: Автоматический поиск представления.

Предусловие: Открыто главное окно программы. Открыто представление данных из файла.

Тестовый случай: Нажатие кнопки компьютерного поиска представления.

Ожидаемый результат: Начало координат переместится в точку относительно которой схождений не будит, или их количество будит минимальным на данном наборе (рисунок 3.8).

Рисунок 3.8 - Произведен автоматический поиск представления

3. Случай использования: Просмотр количества схождений в точке.

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

Тестовый случай: Нажатие на точке со схождением (крупнее остальных, выделены темным цветом).

Ожидаемый результат: Рядом с точкой появился список сходящихся в неё точек (рисунок 3.9).

Рисунок 3.9 - Представлен список точек, сходящихся в выбранную

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

На основе диаграмм классов, разработанных ранее, были созданы базовые определения классов на объектно-ориентированном языке программирования C++. Примеры описания классов WViewer и WPoint отображены на рисунках 3.10 - 3.12.

#ifndef WVIEWER_H

#define WVIEWER_H

#include <QtGui>

#include <QFile>

#include "wpoints. h"

#include "axl. h"

#include "mainwindow. h"

class points;

class WPoint;

class WViewer: public QMainWindow

{

Q_OBJECT

protected:

void paintEvent (QPaintEvent *);

void resizeEvent (QResizeEvent *);

void wheelEvent (QWheelEvent *);

void mouseMoveEvent (QMouseEvent *);

void mousePressEvent (QMouseEvent *);

void mouseReleaseEvent (QMouseEvent *);

void closeEvent (QCloseEvent *);

bool eventFilter (QObject *, QEvent *);

QSize sizeHint ();

QLabel* label;

int px1, py1, px2, py2;

int **xy;

double zoom;

int dltCenterXAxl;

int dltCenterYAxl;

public:

QList<points*> ps;

QList<Axl*> axls;

QDialog* dialog;

int* range;

// +++++++++++++++++++++++++++++++++

// параметры переноса точек по группам

int numPoints;

// +++++++++++++++++++++++++++++++++

//

bool isVisibleFromAxl;

int axlId;

void visibleFromAxl ();

// +++++++++++++++++++++++++++++++++

//

bool isVisibleFromPlanes;

QList<double> coefcs;

void setupPlanesCoefcs ();

void visibleFromPlanes ();

int mks;

// +++++++++++++++++++++++++++++++++

//

int Visiblefrom;

int Visibleto;

Рисунок 3.10 - Базовое описание класса WViewer

// +++++++++++++++++++++++++++++++++

// Параметры классификации

void selectNewClass ();

int numPsAuto;

double rgAuto;

bool total;

bool nextSteps;

// +++++++++++++++++++++++++++++++++

// Поиск начала

void seachBeginVisible ();

//

WPoint* currentCentr;

void seachCurrentCentrMass ();

explicit WViewer (QFile* file, QWidget *parent = 0);

~WViewer ();

void increaceZoom ();

void decreaceZoom ();

double getZoom ();

void setCenterXAxl (int);

void setCenterYAxl (int);

int getCenterXAxl ();

int getCenterYAxl ();

int getCountAxl ();

void setPsForSelectPoints ();

void add (QFile*);

void recomp ();

void updateVisible ();

void invers ();

void unselect ();

void selectFromAxl (int numAxl, int v1, int v2);

void visibleAll ();

signals:

};

#endif // WVIEWER_H

Рисунок 3.11.

Базовое описание класса WViewer

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

Фрагмент описания методов, определенных для класса WViewer, представлены на рисунке 3.12.

void WViewer:: updateVisible () {

for (int i=0; i<this->ps. size (); ++i)

{

for (int ii=0; ii<this->ps [i] - >pointJoin. size (); ++ii)

{

delete ps [i] - >pointJoin [ii];

}

ps [i] - >pointJoin. clear ();

}

this->visibleAll ();

for (int i=0; i<this->ps. size (); ++i) {

ps [i] - >updateVisible ();

}

if (isVisibleFromAxl)

visibleFromAxl ();

if (isVisibleFromPlanes)

visibleFromPlanes ();

for (int i = 0; i<this->ps. size (); ++i) {

for (int ii = 0; ii<this->ps [i] - >point. size (); ++ii) {

if (ps [i] - >point [ii] - >isVisible ()) {

for (int iii = 0; iii<this->ps [i] - >point. size (); ++iii)

{

if (ps [i] - >point [iii] - >isVisible () &&

iii! = ii &&

(abs (ps [i] - >point [iii] - >x () - ps [i] - >point [ii] - >x ()) < 2) &&

(abs (ps [i] - >point [iii] - >y () - ps [i] - >point [ii] - >y ()) < 2))

{

ps [i] - >pointJoin << new WPointJoin (this, ps [i] - >point [ii]);

ps [i] - >pointJoin [ps [i] - >pointJoin. size () - 1] - >setVisible (true);

ps [i] - >pointJoin [ps [i] - >pointJoin. size () - 1] - >point << ps [i] - >point [ii];

ps [i] - >pointJoin [ps [i] - >pointJoin. size () - 1] - >point << ps [i] - >point [iii];

ps [i] - >point [ii] - >setVisible (false);

ps [i] - >point [iii] - >setVisible (false);

for (int iiii = 0; iiii<this->ps [i] - >point. size (); ++iiii)

{

if (ps [i] - >point [iiii] - >isVisible () &&

iiii! = ii &&

(abs (ps [i] - >point [iiii] - >x () - ps [i] - >point [ii] - >x ()) < 2) &&

(abs (ps [i] - >point [iiii] - >y () - ps [i] - >point [ii] - >y ()) < 2))

{

ps [i] - >pointJoin [ps [i] - >pointJoin. size () - 1] - >point << ps [i] - >point [ii];

ps [i] - >point [iiii] - >setVisible (false);

}

Рисунок 3.12 - Фрагмент описания методов класса WViewer

Описание всех классов и определенных в них методов представлено в приложении А.

Тестовые наборы для отладки методов класса WViewer

Тестовые наборы для отладки методов класса WViewer включают в себя тестовые наборы из таблицы 2.2, а также примеры тестовых наборов, представленные в таблице 3.2.

Таблица 3.2 - Тестовые наборы для отладки методов класса WViewer

Ввод

Вывод

Установка

Метод

Результат

Системное сообщение

1

2

3

4

Открытие файла

WViewer:: WViewer (QFile*file,QWidget*parent)

Открывается дочернее окно с представлением данных из файла

Нет

Добавление файла

void WViewer:: add (QFile*file)

Будут добавлены новые классы из выбранного файла

Нет

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

void WViewer:: seachNotCompactClass ()

Будет найдена точка, с минимальным схождением

Нет

Перенос начала координат

Void WViewer:: updateVisible ()

Построение точек относительно нового начала координат

Нет

Класс драйвера тестирования

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

Заключение

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

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

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

Возможность взаимодействия с такими широко распространёнными программами как Excel и Open Office дает широкие перспективы в дальнейшей эксплуатации программы. Все эти качества определяют социальную и экономическую значимость работы.

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

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

1 Ларман, К. Применение UML и шаблонов проектирования [Текст]: пер. с англ. / К. Ларман; М.: Изадетельский дом "Вильямс", 2004.624 с.

2 Макгрегор, Д. Тестирование объектно-ориентированного программного обеспечения [Текст]: практическое пособие: пер. с англ. / Д. Макгрегор, Д. Сайкс; К.: ООО "ТИД "ДС", 2002.432 с.

3 Кватрани, Т. Rational Rose 2000 и UML. Визуальное моделирование [Текст]: пер. с англ. / Т. Кватрани; М.: ДМК Пресс, 2001.176 с.

4 Смирнова И.М. Геометрия. Расстояния и углы в пространстве. М.: Академкнига, 2005.

5 Jasmin Blanchette C++ GUI Programming With Qt

6 Mats Henricson and Erik Nyquist Programming in C++ - Rules and Recommendations.

7 Бьерн Страуструп, Переводчик Николай Мартынов The C++ Programming Language. М.: Бином, 2011.

8 Устройства защитного отключения (узо): Н. Душкин, Владимир Монаков, Владимир Старшинов, Издательство: Энергосервис, 2006 г.

Приложение

Текстпрограммы

Main. cpp

#include<QtGui/QApplication>

#include"mainwindow. h"

intmain (intargc,char*argv [])

{

QApplicationa (argc,argv);

QTextCodec:: setCodecForCStrings (QTextCodec:: codecForName ("Windows-1251"));

MainWindoww;

w. show ();

w. showMaximized ();

returna. exec ();

}

MainWindow. h

#ifndefMAINWINDOW_H

#defineMAINWINDOW_H

#include<QMainWindow>

#include<QLabel>

#include"wviewer. h"

#include"dialogs. h"

classWViewer;

namespaceUi{

classMainWindow;

}

classMainWindow: publicQMainWindow

{

Q_OBJECT

private:

QStringcurDir;

public:

QSizesizeHint ();

explicitMainWindow (QWidget*parent=0);

booleventFilter (QObject*,QEvent*);

~MainWindow ();

QList<WViewer*>viewers;

QStringtool;

QLabel*iconLabel;

QLabel*toolLabel;

WViewer*activeViewer;

publicslots:

voidopen ();

voidadd ();

voidselectOnAxis ();

voidinvers ();

voidselect ();

voidcheck ();

voidreview ();

voidabout ();

private:

Ui:: MainWindow*ui;

privateslots:

privateslots:

voidon_toolButton_8_clicked ();

voidon_toolButton_10_clicked ();

voidon_toolButton_11_clicked ();

voidon_toolButton_9_clicked ();

};

#endif // MAINWINDOW_H

MainWindow. cpp

#include<QtGui>

#include<QtWebKit>

#include"mainwindow. h"

#include"ui_mainwindow. h"

#include"xmlviewhandler. h"

#include"wviewer. h"

MainWindow:: MainWindow (QWidget*parent):

QMainWindow (parent),

ui (newUi:: MainWindow)

{

ui->setupUi (this);

activeViewer=0;

curDir=QDir:: currentPath ();

connect (ui->toolButton_3,SIGNAL (clicked ()),this,SLOT (select ()));

connect (ui->toolButton_4,SIGNAL (clicked ()),this,SLOT (check ()));

connect (ui->toolButton_5,SIGNAL (clicked ()),this,SLOT (review ()));

toolLabel=newQLabel ();

iconLabel=newQLabel ();

select ();

ui->tabWidget->setTabText (0,"Файл");

ui->tabWidget->setTabText (1,"Выборка");

ui->tabWidget->setTabText (2,"Представление");

ui->tabWidget->setTabText (3,"Вид");

ui->tabWidget->setTabText (4,"Справка");

connect (ui->toolButton,SIGNAL (clicked ()),this,SLOT (open ()));

connect (ui->toolButton_2,SIGNAL (clicked ()),this,SLOT (add ()));

connect (ui->toolButton_6,SIGNAL (clicked ()),this,SLOT (selectOnAxis ()));

connect (ui->toolButton_7,SIGNAL (clicked ()),this,SLOT (invers ()));

connect (ui->pushButton,SIGNAL (clicked ()),this,SLOT (on_toolButton_10_clicked ()));

connect (ui->pushButton_2,SIGNAL (clicked ()),this,SLOT (on_toolButton_10_clicked ()));

connect (ui->pushButton_3,SIGNAL (clicked ()),this,SLOT (on_toolButton_10_clicked ()));

}

voidMainWindow:: add () {

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Переддобавлением, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

QStringfileName=

QFileDialog:: getOpenFileName (this,tr ("OpenBookmarkFile"),

QDir:: currentPath (),

tr ("XMLFiles (*. xml)"));

if (fileName. isEmpty ())

return;

QFile*file=newQFile (fileName);

activeViewer->add (file);

}

voidMainWindow:: review () {

toolLabel->setText ("review");

iconLabel->setPixmap (QPixmap (QDir:: currentPath () +"/review. bmp"));

tool="review";

}

voidMainWindow:: select () {

toolLabel->setText ("select");

iconLabel->setPixmap (QPixmap (QDir:: currentPath () +"/select. bmp"));

tool="select";

}

voidMainWindow:: check () {

toolLabel->setText ("check");

iconLabel->setPixmap (QPixmap (QDir:: currentPath () +"/check. bmp"));

tool="check";

}

voidMainWindow:: invers () {

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Передработой, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

this->activeViewer->invers ();

}

voidMainWindow:: open () {

QStringfileName=

QFileDialog:: getOpenFileName (this,tr ("OpenBookmarkFile"),

QDir:: currentPath (),

tr ("XMLFiles (*. xml)"));

if (fileName. isEmpty ())

return;

QFile*file=newQFile (fileName);

WViewer*view=newWViewer (file,this);

view->setGeometry (50, 200,800,530);

view->show ();

viewers<<view;

activeViewer=view;

}

voidMainWindow:: selectOnAxis () {

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Передработой, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

SelectFromAxlDialog*dial=newSelectFromAxlDialog (this);

dial->setVisible (true);

}

voidMainWindow:: about () {

AboutDialog*dial=newAboutDialog (this);

dial->setGeometry (50,50,400,128);

dial->show ();

}

boolMainWindow:: eventFilter (QObject*obj,QEvent*event) {

if (event->type () ==QEvent:: WindowActivate) {

this->activeViewer= (WViewer*) obj;

}

if (event->type () ==QEvent:: Close) {

this->activeViewer=NULL;

}

returnQMainWindow:: eventFilter (obj,event);

}

QSizeMainWindow:: sizeHint () {

QSizesize;

size. setHeight (600);

size. setWidth (600);

returnsize;

}

MainWindow:: ~MainWindow ()

{

deleteui;

}

voidMainWindow:: on_toolButton_9_clicked ()

{

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Передработой, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

activeViewer->increaceZoom ();

}

voidMainWindow:: on_toolButton_11_clicked ()

{

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Передработой, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

activeViewer->decreaceZoom ();

}

voidMainWindow:: on_toolButton_10_clicked ()

{

QWebView*webView=newQWebView ();

webView->show ();

webView->setUrl (QUrl ("file: // /"+curDir+"/help/index.html"));

}

voidMainWindow:: on_toolButton_8_clicked ()

{

if (activeViewer==0) {

QMessageBox:: information (0,"Message","Передработой, загрузитенаборизфайлатаблицаXML",QMessageBox:: Yes);

return;

}

activeViewer->dialog->setVisible (! activeViewer->dialog->isVisible ());

}

Dialogs. h

#ifndefDIALOGS_H

#defineDIALOGS_H

#include<QObject>

#include<QtGui>

#include"mainwindow. h"

classSelectFromAxlDialog: publicQDialog

{

Q_OBJECT

public:

SelectFromAxlDialog (QWidget*parent=0);

~SelectFromAxlDialog ();

QDialogButtonBox*dialogButtonBox;

QLineEdit*lineEditNumAxl;

QLineEdit*lineEditValue1;

QLineEdit*lineEditValue2;

QSlider*slider;

private:

voidcloseEvent (QCloseEvent*);

QLabel*labelAxl;

QLabel*labelValue1;

QLabel*labelValue2;

QLabel*labelDelta;

publicslots:

voidchange (int);

voidaccept ();

voidreject ();

};

classAboutDialog: publicQDialog

{

Q_OBJECT

public:

AboutDialog (QWidget*parent=0);

~AboutDialog ();

QPushButton*okButton;

private:

voidcloseEvent (QCloseEvent*);

QLabel*labelLogo;

QLabel*labelText;

publicslots:

voidclose ();

};

#endif // DIALOGS_H

Dialogs. cpp

#include"dialogs. h"

SelectFromAxlDialog:: SelectFromAxlDialog (QWidget*parent):

QDialog (parent)

{

setGeometry (150,150,220,100);

labelAxl=newQLabel (this);

labelAxl->setText ("Axl#");

labelAxl->setGeometry (0,3,26, 20);

labelValue1=newQLabel (this);

labelValue1->setText ("Valuefrom");

labelValue1->setGeometry (70,3,54, 20);

labelValue2=newQLabel (this);

labelValue2->setText ("to");

labelValue2->setGeometry (169,3,10, 20);

labelDelta=newQLabel (this);

labelDelta->setText ("Delta=0");

labelDelta->setGeometry (3, 20,60, 20);

lineEditNumAxl=newQLineEdit (this);

lineEditNumAxl->setGeometry (28,0,40, 20);

lineEditValue1=newQLineEdit (this);

lineEditValue1->setGeometry (126,0,40, 20);

lineEditValue2=newQLineEdit (this);

lineEditValue2->setGeometry (180,0,40, 20);

dialogButtonBox=newQDialogButtonBox (QDialogButtonBox:: Ok

|QDialogButtonBox:: Cancel,Qt:: Horizontal,this);

dialogButtonBox->setGeometry (20,70,180,25);

dialogButtonBox->setVisible (true);

slider=newQSlider (Qt:: Horizontal,this);

slider->setGeometry (2,40,216, 20);

slider->setRange (-200, 200);

slider->setValue (0);

connect (slider,SIGNAL (valueChanged (int)),this,SLOT (change (int)));

connect (dialogButtonBox,SIGNAL (accepted ()),this,SLOT (accept ()));

connect (dialogButtonBox,SIGNAL (rejected ()),this,SLOT (reject ()));

}

SelectFromAxlDialog:: ~SelectFromAxlDialog () {

deletelabelAxl;

deletelabelValue1;

deletelabelValue2;

deletelineEditNumAxl;

deletelineEditValue1;

deletelineEditValue2;

deletedialogButtonBox;

}

voidSelectFromAxlDialog:: change (intvalue) {

labelDelta->setText ("Delta="+QVariant (slider->value ()). toString ());

accept ();

}

voidSelectFromAxlDialog:: accept () {

( (MainWindow*) parent ()) - >activeViewer->unselect ();

( (MainWindow*) parent ()) - >activeViewer->selectFromAxl (lineEditNumAxl->text (). toInt () - 1,lineEditValue1->text (). toInt () +slider->value (),

lineEditValue2->text (). toInt () +slider->value ());

}

voidSelectFromAxlDialog:: reject () {

this->close ();

}

voidSelectFromAxlDialog:: closeEvent (QCloseEvent*) {

deletethis;

}

AboutDialog:: AboutDialog (QWidget*parent):

QDialog (parent)

{

labelLogo=newQLabel (this);

labelLogo->setPixmap (QPixmap (QDir:: currentPath () +"/logo. bmp"));

labelText=newQLabel (this);

labelText->setGeometry (140,10,350,40);

labelText->setText ("ProgramPoliViewer\n\nDevelopers: WasilevskyValentin&LisicinAlexander");

okButton=newQPushButton (this);

okButton->setGeometry (330,100,60, 20);

okButton->setText ("ok");

connect (okButton,SIGNAL (clicked ()),this,SLOT (close ()));

}

AboutDialog:: ~AboutDialog () {

deletelabelLogo;

deletelabelText;

deleteokButton;

}

voidAboutDialog:: closeEvent (QCloseEvent*) {

deletethis;

}

voidAboutDialog:: close () {

deletethis;

}

WPoints. h

#ifndefWPOINTS_H

#defineWPOINTS_H

#include<QWidget>

#include"wviewer. h"

#include"wtransitdata. h"

#include"mainwindow. h"

classpoints;

classWPoint: publicQWidget

{

Q_OBJECT

protected:

voidpaintEvent (QPaintEvent*);

voidmousePressEvent (QMouseEvent*);

intvx;

intvy;

int*value;

boolselect;

public:

points*ps;

WPoint (points*,QWidget*parent=0);

WPoint (WTransitPoint*trpoint,QWidget*parent,points*pnts);

boolsel ();

voidrecomp ();

voidsetSelect (bool);

intx () const;

inty () const;

intgetV (int);

signals:

publicslots:

};

classWViewer;

classpoints

{

protected:

// constforstyleSheet

public:

WViewer*viewer;

QList<WPoint*>point;

constQColor*color;

QStringcssDefault;

QStringcssActive;

voidupdateVisible ();

// voidadd (WPoint*);

voidselectArea (intx1, inty1, intx2, inty2);

voidselectFromAxl (intnumAxl, intv1, intv2);

intsizePoints; // размерточекдописать

boolarea; // аурадописать

voidunselect ();

voidinvers ();

voidrecomp ();

points (WViewer*,QColor*);

points (WViewer*,WTransitPoints*trpoints);

};

#endif // WPOINTS_H

WPoints. cpp

#include<QPainter>

#include<QStyleOption>

#include<QMessageBox> // fordelete

#include<QVariant> // fordelete

#include<QEvent>

#include<math. h>

#include"wpoints. h"

points:: points (WViewer*v,WTransitPoints*trpoints)

{

viewer=v;

QStringstr ("Currentitemcount: ");

str. append (QString ("%1"). arg (viewer->ps. length ()));

QMessageBox:: information (0,"Message",str. toStdString (). c_str (),QMessageBox:: Yes);

switch (viewer->ps. length ())

{

case0:

this->cssActive="QWidget{background-color: \

qradialgradient (cx: 0.5,cy: 0.5,fx: 0.5,fy: 0.5,\

radius: 0.5,stop: 0.2#e11,stop: 0.9#fff); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

this->cssDefault="QWidget{\

background-color: qradialgradient (\

cx: 0.5,cy: 0.5,\

fx: 0.5,fy: 0.5,radius: 0.5,\

stop: 0.3#FFF,stop: 0.8#F00); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

break;

case1:

this->cssActive="QWidget{background-color: \

qradialgradient (cx: 0.5,cy: 0.5,fx: 0.5,fy: 0.5,\

radius: 0.5,stop: 0.2#11e,stop: 0.9#fff); \

border: 1pxsolid#00F; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

this->cssDefault="QWidget{\

background-color: qradialgradient (\

cx: 0.5,cy: 0.5,\

fx: 0.5,fy: 0.5,radius: 0.5,\

stop: 0.3#FFF,stop: 0.8#00F); \

border: 1pxsolid#00F; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

break;

case2:

this->cssActive="QWidget{background-color: \

qradialgradient (cx: 0.5,cy: 0.5,fx: 0.5,fy: 0.5,\

radius: 0.5,stop: 0.2#e11,stop: 0.9#fff); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

this->cssDefault="QWidget{\

background-color: qradialgradient (\

cx: 0.5,cy: 0.5,\

fx: 0.5,fy: 0.5,radius: 0.5,\

stop: 0.3#FFF,stop: 0.8#F00); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

break;

case3:

this->cssActive="QWidget{background-color: \

qradialgradient (cx: 0.5,cy: 0.5,fx: 0.5,fy: 0.5,\

radius: 0.5,stop: 0.2#e11,stop: 0.9#fff); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

this->cssDefault="QWidget{\

background-color: qradialgradient (\

cx: 0.5,cy: 0.5,\

fx: 0.5,fy: 0.5,radius: 0.5,\

stop: 0.3#FFF,stop: 0.8#F00); \

border: 1pxsolid#F00; \

border-radius: 6px}\

QWidget: hover{\

border: 1pxsolid#000; }";

break;

default:

QMessageBox:: critical (0,QObject:: tr ("Applicationerror"),

"ERROR");

throw0;

}

QColor*clr=newQColor ();

intdlt=0,s=255,h=255;

if (v->ps. size () /30%4==1) {dlt=6; s=255; h=190; }

elseif (v->ps. size () /30%4==2) {dlt=4; s=190; h=255; }

elseif (v->ps. size () /30%4==3) {dlt=2; s=190; h=190; }

clr->setHsv (30+60* (v->ps. size () %5) +8* (v->ps. size () /5%6) +dlt,s,h);

color=clr;

for (inti=0; i<trpoints->point. size (); ++i) {

WPoint*tmp=newWPoint (trpoints->point [i],v,this);

tmp->setSelect (false);

point<<tmp;

}

}

voidpoints:: recomp () {

for (inti=0; i<point. size (); i++) {

point [i] - >recomp ();

}

}

voidpoints:: invers () {

for (inti=0; i<point. size (); ++i) {

if (point [i] - >sel () ==true)

point [i] - >setSelect (false);

else

point [i] - >setSelect (true);

}

}

voidpoints:: unselect () {

for (inti=0; i<point. size (); i++)

point [i] - >setSelect (false);

}

voidpoints:: selectArea (intx1, inty1, intx2, inty2) {

for (inti=0; i<point. size (); i++)

if (point [i] - >x () *viewer->getZoom () +viewer->getCenterXAxl () >x1

&&point [i] - >x () *viewer->getZoom () +viewer->getCenterXAxl () <x2

&&point [i] - >y () *viewer->getZoom () +viewer->getCenterYAxl () >y1

&&point [i] - >y () *viewer->getZoom () +viewer->getCenterYAxl () <y2) {

point [i] - >setSelect (true);

}

else

point [i] - >setSelect (false);

}

voidpoints:: selectFromAxl (intnumAxl, intv1, intv2) {

for (inti=0; i<point. size (); ++i) {

if (this->point [i] - >getV (numAxl) >=v1&&this->point [i] - >getV (numAxl) <=v2)

point [i] - >setSelect (true);

}

}

voidpoints:: updateVisible () {

for (inti=0; i<point. size (); ++i) {

if ( ( (viewer->getCenterXAxl () +point [i] - >x () *viewer->getZoom ()) >viewer->width () - 2)

|| ( (viewer->getCenterXAxl () +point [i] - >x () *viewer->getZoom ()) <2)

|| ( (viewer->getCenterYAxl () +point [i] - >y () *viewer->getZoom ()) >viewer->height () - 2)

|| ( (viewer->getCenterYAxl () +point [i] - >y () *viewer->getZoom ()) <2))

point [i] - >setVisible (false);

else

point [i] - >setVisible (true);

}

}

WPoint:: WPoint (WTransitPoint*trpoint,QWidget*parent,points*pnts):

QWidget (parent) {

select=false;

this->setCursor (Qt:: PointingHandCursor);

ps=pnts;

value=trpoint->getValues ();

installEventFilter (parent);

}

WPoint:: WPoint (points*pnts,QWidget*parent):

QWidget (parent) {

select=false;

this->setCursor (Qt:: PointingHandCursor);

ps=pnts;

value=newint [ ( (WViewer*) parent) - >getCountAxl ()];

installEventFilter (parent);

}

voidWPoint:: paintEvent (QPaintEvent*) {

this->setGeometry ( ( (WViewer*) this->parent ()) - >getCenterXAxl () +vx* ( (WViewer*) this->parent ()) - >getZoom () - 6, ( (WViewer*) parent ()) - >getCenterYAxl () +vy* ( (WViewer*) this->parent ()) - >getZoom () - 6,12,12);

QStyleOptionopt;

opt. init (this);

QPainterp (this);

style () - >drawPrimitive (QStyle:: PE_Widget,&opt,&p,this);

}

voidWPoint:: mousePressEvent (QMouseEvent*) {

( (MainWindow*) ( (WViewer*) this->parent ()) - >parent ()) - >check ();

for (inti=0; i< ( (WViewer*) this->parent ()) - >getCountAxl (); ++i)

( (WViewer*) this->parent ()) - >range [i] =this->value [i];

( (WViewer*) this->parent ()) - >recomp ();

( (WViewer*) this->parent ()) - >updateVisible ();

( (WViewer*) this->parent ()) - >update ();

}

intWPoint:: x () const{

returnvx;

}

intWPoint:: getV (inti) {

returnvalue [i];

}

intWPoint:: y () const{

returnvy;

}

voidWPoint:: setSelect (boolb) {

if (! b) {

this->setStyleSheet (this->ps->cssActive);

}else{

this->setStyleSheet (this->ps->cssDefault);

}

this->select=b;

this->update ();

}

boolWPoint:: sel () {

returnselect;

}

Void WPoint:: recomp () {

doublel=0;

for (inti=0; i< ( (WViewer*) this->parent ()) - >getCountAxl (); i++)

l=l+pow ( (value [i] - ( (WViewer*) this->parent ()) - >range [i]),2);

l=sqrt (l);

doublex=0;

for (inti=0; i< ( (WViewer*) this->parent ()) - >getCountAxl (); i++)

x=x+ (value [i] * ( (WViewer*) this->parent ()) - >axls [i] - >getLvl ()

( (WViewer*) this->parent ()) - >range [i] * ( (WViewer*) this->parent ()) - >axls [i] - >getLvl ())

* ( (WViewer*) this->parent ()) - >axls [i] - >getCos ();

doubley=0;

for (inti=0; i< ( (WViewer*) this->parent ()) - >getCountAxl (); i++)

y=y+ (value [i] * ( (WViewer*) this->parent ()) - >axls [i] - >getLvl ()

( (WViewer*) this->parent ()) - >range [i] * ( (WViewer*) this->parent ()) - >axls [i] - >getLvl ())

* ( (WViewer*) this->parent ()) - >axls [i] - >getSin ();

doublevec=sqrt (pow (x,2) +pow (y,2));

if (vec! =0)

{

vx= (int) (l*x/vec);

vy= (int) (l*y/vec);

}

else

{

vx=0;

vy=0;

}

}

Размещено на Allbest.ru


Подобные документы

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

    дипломная работа [554,8 K], добавлен 06.04.2014

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

    реферат [413,6 K], добавлен 10.04.2010

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

    курсовая работа [3,0 M], добавлен 14.11.2013

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

    дипломная работа [1019,9 K], добавлен 13.10.2017

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

    курсовая работа [645,2 K], добавлен 05.04.2015

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

    курсовая работа [462,2 K], добавлен 15.01.2014

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

    презентация [31,6 K], добавлен 06.01.2014

  • Рассмотрение программных продуктов, обеспечивающих решение задач по распознаванию образов. Видеопотоки от камер видеонаблюдения. Изменение размера и формата представления кадра. Отслеживание движения объекта в кадре. Распознавание номеров автотранспорта.

    лабораторная работа [1,4 M], добавлен 28.11.2021

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

    дипломная работа [2,3 M], добавлен 20.05.2013

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

    курсовая работа [2,6 M], добавлен 29.04.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.