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

Анализ существующих систем и подходов, обзор предметной области решения. Система Macroscop. Комплекс "Интеллектуальное видеонаблюдение Kipod". Системы видеонаблюдения VOCORD. Разработка математической модели минимизации структуры. Интерфейс программы.

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

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

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

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

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

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

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

Рисунок 4.4 - Блок-схема алгоритма метода Патрика

Рисунок 4.5 - Продолжение блок-схемы алгоритма метода Патрика

Рисунок 4.6 - Продолжение блок-схемы алгоритма метода Патрика

4.3 Интерфейс программы

MatrixPatrika.exe - откомпилированная и отлаженная программа. При запуске отображается окно с основной формой программы.

Рисунок 4.7 - Вид программы и задание параметров заполнения

При задании числа строк и столбцов матрицы, а также выборе вероятности появления 1, т.е. предполагается заполнение по считанным данным состояния обработчиков видео контента - видеосерверов. После выбора режима «Генерировать» появляется окно с матрицей. По умолчанию белый цвет элемента соответствует его нулевому значению, а элемент, отмеченный знаком (*), соответствует единице.

Рисунок 4.8 - Матрица, сгенерированная программой

4.4 Результат работы программы

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

Для проверки работы программы зададим матрицу размером 7 на 7. При нажатии кнопки «Генерировать» на экране мы увидим сформированную матрицу. Матрица А имеет вид:

Рисунок 4.9 - Матрица А

Найдем кратчайшее строчное покрытие:

1. столбец 3 содержит минимальное число единиц - 1;

2. строка а является строкой с максимальным числом единиц - заносится в покрытие и удаляется из матрицы;

3. удаляются столбцы 1, 2, 3, 4, 5.

4. продолжаем работу с матрицей :

Столбец 6 содержит меньшее число единиц, строка в заносится в покрытие и удаляется из матрицы. Таким образом получаем строчное покрытие {а, в}.

Определим кратчайшее столбцовое покрытие:

1. строки б и е имеют наименьшее количество единиц, выберем строку б;

2. находим столбец с наибольшим покрывающим числом. Под это условие подходит и 2, и 6 столбец. Выбираем 2 - заносим в покрытие;

3. cтроки а, б и в, покрывающие столбец 2, удаляются из матрицы;

4. продолжаем работу с матрицей :

Строка е содержит наименьшее число единиц, столбец 7 имеет большее число единиц - заносим в покрытие. Строки г, е и ж - удаляются из матрицы.

Таким образом, получаем столбцовое покрытие {1, 2, 7} проверяемой матрицы.

Результат сходится с итогом, полученным программным методом.

Рисунок 4.10 - Программно построенные покрытия

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

5. Разработка и оформление документации

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

В качестве средства программирования выбрана среда разработки Microsoft Visual Studio, язык программирования C++, графическая оболочка приложения Windows Forms.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Синтаксис C++ унаследован от языка C. Язык программирования C++ - это универсальный язык программирования, который позволяет разрабатывать программы в соответствии с разными парадигмами: процедурным программированием, объектно-ориентированным, параметрическим.

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

5.2 Руководство программиста

Для того, чтобы программист смог внести какие-либо изменения в программу, ему необходимо открыть файл проекта. Для этого достаточно выполнить двойной клик по файлу MatrixPatrika.sln или открыть Visual Studio и выбрать этот файл через открытие проекта. Проект программы представлен на рисунке 5.1.

Рисунок 5.1 - Проект программы

Для навигации по проекту используется окно Solution Explorer, которое расположено слева. Исходный код программы находится в файлах cpp и h, ресурсы программы, такие как иконки расположены в директории Resource Files. Внешний вид формы, а также логика ее работы реализована в файле Form1.h.

После изменений нужно сохранить программу, заново скомпилировать, запустить и желательно протестировать.

5.3 Тестирование программного обеспечения

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

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

Таблица 5.1 - Виды тестирования программного обеспечения

Модульное тестирование

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

Исследовательское тестирование

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

Интеграционное тестирование

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

Функциональное тестирование

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

Нагрузочное тестирование

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

Регрессионное тестирование

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

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

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

Приемочное тестирование

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

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

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

- проект с веб-тестами производительности и нагрузочными тестами;

- проект с закодированными тестами пользовательского интерфейса.

Инструментарием тестировщика в VisualStudio является Microsoft Test Manager (MTM). MTM предназначен для управления жизненным циклом тестирования программного обеспечения, включает в себя планирование, мониторинг и тестирование. MTM интегрирован с Team Foundation Server. С помощью Microsoft Test Manager можно подготовить план тестирования, управление самим тестированием. При создании плана тестирования в него добавляются наборы тестов, тестовые случаи и конфигурации, необходимые для тестирования. Конфигурации используются для установления среды, в которой будут исполняться наборы тестов. MTM позволяет выполнять автоматические и ручные тесты, а также исследовательские тесты. Ошибки, выявленные в процессе тестирования, фиксируются для их устранения. При внесении изменений в код программной системы возникает необходимость в регрессионном тестировании, причем MTM автоматически формирует план регрессионного тестирования, выявляя какие тесты должны быть повторно выполнены.

Для тестировщиков и разработчиков программного обеспечения VisualStudio включает диспетчер виртуальной среды Lab Management. Инструментарий тестирования LabManagement позволяет создать инфраструктуру, которая максимально близко имитирует реальную среду планируемого использования программного продукта. Такие среды могут использоваться для выполнения автоматических построений, автоматизации тестов и выполнения разработанного кода.

Заключение

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

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

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

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

1. Официальный сайт компании DSSL [Электронный ресурс]: офиц. сайт. - Режим доступа: www.dssl.ru

2. Техническое зрение в системах управления 2011: сборник трудов научно-технической конференции / под ред. Р.Р. Назирова. - Москва: Механика, управление и информатика, 2012. - 236 с.

3. Яншин, В. В. Анализ и обработка изображений: принципы и алгоритмы/ В. В. Яншин. - Москва: Машиностроение, 1994. - 112 с.

4. Программа для IP-камер Macrosop [Электронный ресурс]: офиц. сайт. - Режим доступа: http://macroscop.com.

5. Синезис видеоаналитика [Электронный ресурс]: офиц. сайт. - Режим доступа: http://synesis.ru.

6. Вокорд. Системы видеонаблюдения [Электронный ресурс]: офиц. сайт. - Режим доступа: http://www.vocord.ru.

7. Системы безопасности и видеонаблюдения [Электронный ресурс]: офиц. сайт. - Режим доступа: http://www.itv.ru.

8. Храпский, С.Ф. Распределенная обработка информации/ С.Ф. Храпский. - Омск: Омский государственный институт сервиса, 2006. - 108 с.

9. Габалин, А.В. Вопросы оптимизации структуры распределенной обработки информации / А.В. Габалин // Прикладная информатика. -2007. - Выпуск 6(12) - С 129.

10. Таненбаум, Э. Распределенные системы. Принципы и парадигмы / Э. Таненбаум, М. Ван-Стеен - Санкт-Петербург: Питер, 2003. - 877 с.

11. Радченко, Г. И. Распределенные вычислительные системы [Электронный ресурс]: учеб. пособие / Г. И. Радченко - Челябинск: Фотохудожник, 2012. - 184 с. - Режим доступа: http://glebradchenko.ru/doc.

12. Писаревский, Н. Системы технического зрения / А.Н. Писаревский, Ф. Чернявский, Г. К. Афанасьев - Санкт-Петербург: Машиностроение, 2008. - 424 с.

13. Лачугин, Д.В. Проектирование программного комплекса адаптивной системы управления, сбора и анализа потоковых данных / А.А. Большаков, Д.В. Лачугин, В.В. Лобанов // Программная инженерия, 2015. - No 2. - С. 13-22.

14. Цапенко, М.П. Измерительные информационные системы: Структуры и алгоритмы, системотехническое проектирование.: Учеб. пособие для вузов / М.П. Цапенко. - М.: Энергоатомиздат, 1985. - 438 с.

15. Национальный открытый университет [Электронный ресурс]: офиц. сайт. - Режим доступа: http://www.intuit.ru

16. «MSDN» - информационный сервис для разработчиков [Электронный ресурс]: офиц. сайт. - Режим доступа: https://msdn.microsoft.com

17. Методические рекомендации по оформлению выпускных квалификационных работ, курсовых проектов/работ для студентов очной, очно - заочной (вечерней) и заочной форм обучения [Электронный ресурс] Вып. 4/ сост.: Тритенко А. Н., Сафонова О. В., Дурягина Н. В. - Вологда:, 2016. - 120 с.

Приложение

Листинг программы

BoolMatrix.h

#pragma once

class BoolMatrix

{

public:

BoolMatrix(int cols, int rows, float ver);

~BoolMatrix();

int cols;//количество столбцов

int rows;//количество строк

bool **matrix;//исходная матрица

bool *colPokr;//массив покрытия по столбцам

bool *rowPokr;//массив покрытия по строкам

private:

//функции нахождения покрытий

//вызываются рекурсивно

//cols, rows - размеры поданной матрицы

//matrix - матрица для обработки, на первом шаге идентична исходной, дальше становится меньше

//names - массив чисел с номерами строк(столбцов) для добавления в покрытие

void calcWithRows(int cols, int rows, bool **matrix, int *names);

void calcWithCols(int cols, int rows, bool **matrix, int *names);

};

BoolMatrix.cpp

#include "stdafx.h"

#include "BoolMatrix.h"

#include <stdlib.h>

BoolMatrix::BoolMatrix(int cols, int rows, float ver)

{

this->cols = cols;

this->rows = rows;

//создаем исходную матрицу

matrix = new bool *[rows];

//создаем матрицы для преобразований

bool ** matrix1 = new bool *[rows];

bool ** matrix2 = new bool *[rows];

//заполняем матрицу

for (int i = 0; i < rows; i++)

{

//создаем строки у матрицы

matrix[i] = new bool[cols];

matrix1[i] = new bool[cols];

matrix2[i] = new bool[cols];

//заполняем элементы случайными значениями

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

{

matrix[i][j] = (float)rand() / (float)RAND_MAX > (1-ver) ? true: false;

matrix1[i][j] = matrix[i][j];

matrix2[i][j] = matrix[i][j];

}

}

//создаем массивы для покрытий

colPokr = new bool[cols];

rowPokr = new bool[rows];

for (int i = 0; i < cols; i++)

colPokr[i] = false;

for (int i = 0; i < rows; i++)

rowPokr[i] = false;

//массив для номеров строк(столбцов), нужен чтобы остались оригинальные номера после уменьшения размера матрцы

int *names = new int[rows];

for (int i = 0; i < rows; i++)

names[i] = i;

//находим строчное покрытие

calcWithRows(cols, rows, matrix1, names);

delete[] names;

for (int i = 0; i < rows; i++)

delete[] matrix1[i];

delete matrix1;

names = new int[cols];

for (int i = 0; i < cols; i++)

names[i] = i;

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

calcWithCols(cols, rows, matrix2, names);

delete[] names;

for (int i = 0; i < rows; i++)

delete[] matrix2[i];

delete matrix2;

}

void BoolMatrix::calcWithRows(int cols, int rows, bool **matrix, int *names)

{

int min = -1;

int ind = 0;

//ищем столбец с минимальным кол-вом элементов

for (int i = 0; i < cols; i++)

{

int cnt = 0;

//считаем кол-во эл в столбце

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

{

if (matrix[j][i])

cnt++;

}

if (cnt < min || min == -1)

{

min = cnt;

ind = i;

}

}

//ищем строку из найденного столбца с максимальным количеством элементов

int max = -1;

int indRow = 0;

for (int i = 0; i < rows; i++)

{

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

if (!matrix[i][ind])

continue;

int cnt = 0;

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

{

if (matrix[i][j])

cnt++;

}

if (cnt > max || max == -1)

{

max = cnt;

indRow = i;

}

}

//добавляем в покрытие

rowPokr[ names[indRow] ] = true;

//удаляем столбцы из покрытия

int x = 0;

for (int i = 0; i < cols; i++)

{

if (matrix[indRow][i])

continue;

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

matrix[j][x] = matrix[j][i];

x++;

}

//удаляем строку из покрытия

int y = 0;

for (int i = 0; i < rows; i++)

{

if (i == indRow)

continue;

names[y] = names[i];

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

matrix[y][j] = matrix[i][j];

y++;

}

//новые размеры матрицы

cols = x;

rows-;

//если размеры больше 0, следующий шаг

if (x != 0 && rows!=0)

calcWithRows(cols, rows, matrix, names);

}

void BoolMatrix::calcWithCols(int cols, int rows, bool **matrix, int *names)

{

int min = -1;

int ind = 0;

//ищем строку с минимальным кол-вом элементов

for (int i = 0; i < rows; i++)

{

int cnt = 0;

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

{

if (matrix[i][j])

cnt++;

}

if (cnt < min || min == -1)

{

min = cnt;

ind = i;

}

}

//ищем столбец из покрытия найденной строки с максимальным кол-вом элементов

int max = -1;

int indCol = 0;

for (int i = 0; i < cols; i++)

{

if (!matrix[ind][i])

continue;

int cnt = 0;

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

{

if (matrix[j][i])

cnt++;

}

if (cnt > max || max == -1)

{

max = cnt;

indCol = i;

}

}

//добавляем в покрытие

colPokr[names[indCol]] = true;

int x = 0;

//удаялем строки из покрытия

for (int i = 0; i < rows; i++)

{

if (matrix[i][indCol])

continue;

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

matrix[x][j] = matrix[i][j];

x++;

}

//удаляем стобец

int y = 0;

for (int i = 0; i < cols; i++)

{

if (i == indCol)

continue;

names[y] = names[i];

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

matrix[j][y] = matrix[j][i];

y++;

}

// новые размеры матрицы

rows = x;

cols-;

//если размеры больше 0, следующий шаг

if (x != 0 && cols != 0)

calcWithCols(cols, rows, matrix, names);

}

BoolMatrix::~BoolMatrix()

{

for (int i = 0; i < rows; i++)

delete[] matrix[i];

delete matrix;

}

Form1.h

#pragma once

#include "BoolMatrix.h"

#include "ResultForm.h"

namespace WindowsForms {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

using namespace MatrixZacrevskogo;

/// <summary>

/// Summary for Form1

///

/// WARNING: If you change the name of this class, you will need to change the

/// 'Resource File Name' property for the managed resource compiler tool

/// associated with all.resx files this class depends on. Otherwise,

/// the designers will not be able to interact properly with localized

/// resources associated with this form.

/// </summary>

public ref class Form1: public System::Windows::Forms::Form

{

public:

Form1(void)

{

InitializeComponent();

//

//TODO: Add the constructor code here

//

}

protected:

/// <summary>

/// Clean up any resources being used.

/// </summary>

~Form1()

{

if (components)

{

delete components;

}

}

private: System::Windows::Forms::Label^ label1;

protected:

private: System::Windows::Forms::NumericUpDown^ numericUpDown1;

private: System::Windows::Forms::NumericUpDown^ numericUpDown2;

private: System::Windows::Forms::Label^ label2;

private: System::Windows::Forms::NumericUpDown^ numericUpDown3;

private: System::Windows::Forms::Label^ label3;

private: System::Windows::Forms::Button^ button1;

private: System::Windows::Forms::Panel^ panel1;

private:

/// <summary>

/// Required designer variable.

/// </summary>

System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

void InitializeComponent(void)

{

this->label1 = (gcnew System::Windows::Forms::Label());

this->numericUpDown1 = (gcnew System::Windows::Forms::NumericUpDown());

this->numericUpDown2 = (gcnew System::Windows::Forms::NumericUpDown());

this->label2 = (gcnew System::Windows::Forms::Label());

this->numericUpDown3 = (gcnew System::Windows::Forms::NumericUpDown());

this->label3 = (gcnew System::Windows::Forms::Label());

this->button1 = (gcnew System::Windows::Forms::Button());

this->panel1 = (gcnew System::Windows::Forms::Panel());

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown1))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown2))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown3))->BeginInit();

this->SuspendLayout();

//

// label1

//

this->label1->AutoSize = true;

this->label1->Location = System::Drawing::Point(13, 13);

this->label1->Name = L"label1";

this->label1->Size = System::Drawing::Size(51, 13);

this->label1->TabIndex = 0;

this->label1->Text = L"Столбцы";

//

// numericUpDown1

//

this->numericUpDown1->Location = System::Drawing::Point(70, 11);

this->numericUpDown1->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 2, 0, 0, 0 });

this->numericUpDown1->Name = L"numericUpDown1";

this->numericUpDown1->Size = System::Drawing::Size(55, 20);

this->numericUpDown1->TabIndex = 1;

this->numericUpDown1->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });

//

// numericUpDown2

//

this->numericUpDown2->Location = System::Drawing::Point(180, 12);

this->numericUpDown2->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 2, 0, 0, 0 });

this->numericUpDown2->Name = L"numericUpDown2";

this->numericUpDown2->Size = System::Drawing::Size(55, 20);

this->numericUpDown2->TabIndex = 3;

this->numericUpDown2->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });

//

// label2

//

this->label2->AutoSize = true;

this->label2->Location = System::Drawing::Point(131, 14);

this->label2->Name = L"label2";

this->label2->Size = System::Drawing::Size(43, 13);

this->label2->TabIndex = 2;

this->label2->Text = L"Строки";

//

// numericUpDown3

//

this->numericUpDown3->DecimalPlaces = 2;

this->numericUpDown3->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 131072 });

this->numericUpDown3->Location = System::Drawing::Point(390, 12);

this->numericUpDown3->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });

this->numericUpDown3->Name = L"numericUpDown3";

this->numericUpDown3->RightToLeft = System::Windows::Forms::RightToLeft::No;

this->numericUpDown3->Size = System::Drawing::Size(55, 20);

this->numericUpDown3->TabIndex = 5;

this->numericUpDown3->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 4, 0, 0, 65536 });

//

// label3

//

this->label3->AutoSize = true;

this->label3->Location = System::Drawing::Point(250, 16);

this->label3->Name = L"label3";

this->label3->Size = System::Drawing::Size(138, 13);

this->label3->TabIndex = 4;

this->label3->Text = L"Вероятность появления 1";

//

// button1

//

this->button1->Location = System::Drawing::Point(452, 10);

this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(96, 23);

this->button1->TabIndex = 6;

this->button1->Text = L"Генерировать";

this->button1->UseVisualStyleBackColor = true;

this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

//

// panel1

//

this->panel1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom)

| System::Windows::Forms::AnchorStyles::Left)

| System::Windows::Forms::AnchorStyles::Right));

this->panel1->Location = System::Drawing::Point(16, 39);

this->panel1->Name = L"panel1";

this->panel1->Size = System::Drawing::Size(533, 312);

this->panel1->TabIndex = 7;

this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::panel1_Paint);

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(561, 363);

this->Controls->Add(this->panel1);

this->Controls->Add(this->button1);

this->Controls->Add(this->numericUpDown3);

this->Controls->Add(this->label3);

this->Controls->Add(this->numericUpDown2);

this->Controls->Add(this->label2);

this->Controls->Add(this->numericUpDown1);

this->Controls->Add(this->label1);

this->Name = L"Form1";

this->Text = L"Алгоритм поиска кратчайших покрытий методом Патрика";

this->Resize += gcnew System::EventHandler(this, &Form1::Form1_Resize);

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown1))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown2))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown3))->EndInit();

this->ResumeLayout(false);

this->PerformLayout();

}

#pragma endregion

BoolMatrix *bMatrix=0;

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

int cols = (int)numericUpDown1->Value;

int rows = (int)numericUpDown2->Value;

float ver = (float)numericUpDown3->Value;

//создаем класс с матрицей и покрытиями

bMatrix = new BoolMatrix(cols, rows, ver);

//обновляем изображение

panel1->Invalidate();

ResultForm ^form = gcnew ResultForm(bMatrix);

form->Show();

}

private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {

if (!bMatrix)

return;

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

int widRect = (panel1->Width -1 )/ (bMatrix->cols + 2);

int heiRect = (panel1->Height - 1) / (bMatrix->rows + 2);

//берем минимальное значение, чтобы все вместилось

int size = widRect < heiRect ? widRect: heiRect;

Graphics ^gr = e->Graphics;

System::Drawing::Font^ drawFont =

gcnew System::Drawing::Font("Arial", 16);

System::Drawing::StringFormat^ drawFormat =

gcnew System::Drawing::StringFormat();

System::Drawing::Size^ textSize = TextRenderer::MeasureText("*", drawFont);

//выводим матрицу

for (int i = 0; i < bMatrix->rows; i++)

{

for (int j = 0; j < bMatrix->cols; j++)

{

//прямоугольник, куда будет выводиться

Rectangle reck = Rectangle(size * 2 + j*size, size * 2 + i*size, size, size);

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

//if (bMatrix->matrix[i][j])

//gr->FillRectangle(Brushes::Blue, reck);

//else

//gr->FillRectangle(Brushes::White, reck);

gr->FillRectangle(Brushes::White, reck);

if (bMatrix->matrix[i][j])

gr->DrawString("*", drawFont, Brushes::Black,

size * 2 + j*size + size / 2 - textSize->Width/2,

size * 2 + i*size + size / 2 - textSize->Height / 2, drawFormat);

//рисуем рамку квадратика

gr->DrawRectangle(Pens::DarkBlue, reck);

}

}

}

private: System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e) {

panel1->Invalidate();

}

};

}

ResultForm.h

#pragma once

#include "BoolMatrix.h"

namespace MatrixZacrevskogo {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

/// <summary>

/// Сводка для ResultForm

/// </summary>

public ref class ResultForm: public System::Windows::Forms::Form

{

public:

ResultForm(BoolMatrix *bMatrix)

{

this->bMatrix = bMatrix;

InitializeComponent();

//считаем количество столбцов в покрытии

int cnt = 0;

for (int i = 0; i < bMatrix->cols; i++)

if (bMatrix->colPokr[i])

cnt++;

//выводим

labelCols->Text = "" + cnt;

//считаем количество строк в покрытии

cnt = 0;

for (int i = 0; i < bMatrix->rows; i++)

if (bMatrix->rowPokr[i])

cnt++;

//выводим

labelRows->Text = "" + cnt;

}

private: System::Windows::Forms::Label^ label5;

public:

private: System::Windows::Forms::Label^ labelCols;

private: System::Windows::Forms::Label^ labelRows;

private: System::Windows::Forms::Label^ label4;

private: System::Windows::Forms::Panel^ panel1;

protected:

BoolMatrix *bMatrix;

/// <summary>

/// Освободить все используемые ресурсы.

/// </summary>

~ResultForm()

{

if (components)

{

delete components;

}

}

private:

/// <summary>

/// Требуется переменная конструктора.

/// </summary>

System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

/// <summary>

/// Обязательный метод для поддержки конструктора - не изменяйте

/// содержимое данного метода при помощи редактора кода.

/// </summary>

void InitializeComponent(void)

{

this->label5 = (gcnew System::Windows::Forms::Label());

this->labelCols = (gcnew System::Windows::Forms::Label());

this->labelRows = (gcnew System::Windows::Forms::Label());

this->label4 = (gcnew System::Windows::Forms::Label());

this->panel1 = (gcnew System::Windows::Forms::Panel());

this->SuspendLayout();

//

// label5

//

this->label5->AutoSize = true;

this->label5->Location = System::Drawing::Point(225, 9);

this->label5->Name = L"label5";

this->label5->Size = System::Drawing::Size(119, 13);

this->label5->TabIndex = 13;

this->label5->Text = L"Столбцовое покрытие";

//

// labelCols

//

this->labelCols->AutoSize = true;

this->labelCols->Location = System::Drawing::Point(350, 9);

this->labelCols->Name = L"labelCols";

this->labelCols->Size = System::Drawing::Size(13, 13);

this->labelCols->TabIndex = 15;

this->labelCols->Text = L"0";

//

// labelRows

//

this->labelRows->AutoSize = true;

this->labelRows->Location = System::Drawing::Point(22, 183);

this->labelRows->Name = L"labelRows";

this->labelRows->Size = System::Drawing::Size(13, 13);

this->labelRows->TabIndex = 14;

this->labelRows->Text = L"0";

//

// label4

//

this->label4->AutoSize = true;

this->label4->Location = System::Drawing::Point(12, 170);

this->label4->Name = L"label4";

this->label4->Size = System::Drawing::Size(106, 13);

this->label4->TabIndex = 12;

this->label4->Text = L"Строчное покрытие";

//

// panel1

//

this->panel1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom)

| System::Windows::Forms::AnchorStyles::Left)

| System::Windows::Forms::AnchorStyles::Right));

this->panel1->Location = System::Drawing::Point(127, 39);

this->panel1->Name = L"panel1";

this->panel1->Size = System::Drawing::Size(421, 302);

this->panel1->TabIndex = 16;

this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &ResultForm::ResultForm_Paint);

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(560, 363);

this->Controls->Add(this->panel1);

this->Controls->Add(this->label5);

this->Controls->Add(this->labelCols);

this->Controls->Add(this->labelRows);

this->Controls->Add(this->label4);

this->Name = L"ResultForm";

this->Text = L"Результат";

this->ResumeLayout(false);

this->PerformLayout();

}

#pragma endregion

private: System::Void ResultForm_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {

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

int widRect = (panel1->Width - 1) / (bMatrix->cols + 2);

int heiRect = (panel1->Height - 1) / (bMatrix->rows + 2);

//берем минимальное значение, чтобы все вместилось

int size = widRect < heiRect ? widRect: heiRect;

Graphics ^gr = e->Graphics;

System::Drawing::Font^ drawFont =

gcnew System::Drawing::Font("Arial", 16);

System::Drawing::StringFormat^ drawFormat =

gcnew System::Drawing::StringFormat();

System::Drawing::Size^ textSize = TextRenderer::MeasureText("*", drawFont);

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

for (int j = 0; j < bMatrix->cols; j++)

{

Rectangle reck = Rectangle(size * 2 + j*size, 0, size, size);

//if (bMatrix->colPokr[j])

//gr->FillRectangle(Brushes::Blue, reck);

//else

//gr->FillRectangle(Brushes::White, reck);

gr->FillRectangle(Brushes::White, reck);

if (bMatrix->colPokr[j])

gr->DrawString("*", drawFont, Brushes::Black,

size * 2 + j*size + size / 2 - textSize->Width / 2,

0 + size / 2 - textSize->Height / 2, drawFormat);

//рисуем рамку квадратика

gr->DrawRectangle(Pens::DarkBlue, reck);

}

//выводим столбцовое покрытие

for (int j = 0; j < bMatrix->rows; j++)

{

Rectangle reck = Rectangle(0, size * 2 + j*size, size, size);

//if (bMatrix->rowPokr[j])

//gr->FillRectangle(Brushes::Blue, reck);

//else

//gr->FillRectangle(Brushes::White, reck);

gr->FillRectangle(Brushes::White, reck);

if (bMatrix->rowPokr[j])

gr->DrawString("*", drawFont, Brushes::Black,

0 + size / 2 - textSize->Width / 2,

size * 2 + j*size + size / 2 - textSize->Height / 2, drawFormat);

//рисуем рамку квадратика

gr->DrawRectangle(Pens::DarkBlue, reck);

}

}

};

}

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


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

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