на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Разработка элемента управления для отображения векторных карт
p align="left">Если кисть не определена то отрисовка ведётся пером по умолчанию. После чего процесс повторяется для других областей. После этого осуществляется вывод в центре области порядкового номера этой области. Процесс доступа к точке центра области хранимой в каждом экземпляре PathD производится через методы и свойства экземпляра класса MyMap. Печать строки осуществляется с помощью метода экземпляра класса Graphics DrawString. Затем с помощью метода экземпляра класса Graphics DrawLines выводятся границы элемента. После проверки соответствующих булевых переменных происходит вывод прямоугольника выделения.

if (flRec==true&&flag==true)

{

Pen myP= new Pen(Color.Blue,1);

e.Graphics.DrawLine(myP,oldX,oldY,oldX,curY);

e.Graphics.DrawLine(myP,oldX,oldY,curX,oldY);

e.Graphics.DrawLine(myP,curX,oldY,curX,curY);

e.Graphics.DrawLine(myP,oldX,curY,curX,curY);

}

3.5 Класс AutoColor

public class AutoColor

{

public PathD [] msPth; //коллекция замкнутых областей

public Color [] msClr; //массив цветов областей

public AutoColor() //конструктор по умолчанию

{ msPth=null;

msClr=null;

}

}

Конструктор public AutoColor(PathD [] Pth) параметром для которого является коллекция областей для которой будет производиться автоматическое раскрашивание. Раскрашивание будет производиться по принципу оптимального использования цветов. В начальный момент времени создается массив типа Color в который будут заноситься цвета для раскрашивания соответствующих областей. Далее вызывается функция private int[,] GetMsGr() которая предназначена для создания матрицы пограничных областей. Строки и столбы этой матрицы представляют собой замкнутые области а узлы матрицы границы между областями.

Например у нас есть 4 ре области как показано на Рис 3.5.

Рис 3.5 Пример расположения областей.

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

0 1 1 0

1 0 1 0

1 1 0 0

0 0 0 0

То есть если деве области имеют общую границу то в узле матрицы номер сроки и номер столбца которого соответствует граничащим областям будет находится 1, если же общей границы нет то в узе остаётся 0. Сам алгоритм проверки на существование общей границы таков: Первый цикл перебирает области которые нужно сравнить 2цикл, вложенный в него перебирает координаты которые сравнивает и запоминает их в переменный которые будут использоваться при сравнении. 3ий цикл вложенный во второй перебирает области с которыми надо сравнить исключая текущую область. 4ый вложенный цикл в 3ий перебирает сами координаты. Если координаты текущей точки текущей области совпадают со сравниваемыми координатами данной области то в узлах матрицы с соответствующими номерами столбцов и срок записывается 1. И так процесс повторяется для всех областей. Функция возвращает заполненную матрицу. Далее представлена часть кода функции GetMsGr() заполняющая матрицу

for (int i=0;i<msPth.Length;i++) //1ывй цикл

{

for(int j=0;j<msPth[i].Length;j++) //2ой вложенный цикл

{

x1 = msPth[i].PathPoints[j].X; //запоминание координат точки для сравнения

y1 = msPth[i].PathPoints[j].Y;

for (int k=0;k<msPth.Length;k++) //3ий вложенный цикл

{

for(int l=0;l<msPth[k].Length;l++) 4ый вложенный цикл

{

if(i!=k)

{

_x1 = msPth[k].PathPoints[l].X;

_y1 = msPth[k].PathPoints[l].Y;

if(x1==_x1&&y1==_y1) //сравнение координат текущей

{ //точки с запомненными

ms[i,k]=1;

}

Далее вызывается рекурсивная функция Run(i,ref mss); где параметрами являются i-номер области с которой надо начинать расчёт окраски, ref mss ссылка на массив пограничных объектов. Алгоритм работает следующим образом. В начале проверяется окрашен уже данная область или нет. Номер цвета содержится в диагонали матрицы. Если не окрашена область, то ищется цвет не принадлежащий окружающим эту область областям. Тесть выбирается jый цвет затем проходя по сроке ищет области которыми граничит и найдя такую область сравнивает текущий цвет с цветом этой области если совпадают то flag устанавливается из true в false а поиск продолжается по остальным областям. Если же нет то переход к следующей пограничной области. Если для данного j по всем граничащим областям не нашлось равного то данное число записывается как цвет данной области. Затем для всех областей в которые ёще не переходили и которые граничат с данной областью запускается рекурсивная функция Run(i,ref ms); а в узлы где номер столбца это область текущая а строка это область куда перейдём и наоборот записывается 2. Рекурсия повторяется. Пример массива на разных этапах при распределении цветов:

0 1 1 0 1 2 1 0 1 2 1 0 1 2 2 0 1 2 2 0

1 0 1 0 2 0 1 0 2 2 2 0 2 2 2 0 2 2 2 0

1 1 0 0 1 1 0 0 1 2 0 0 2 2 3 0 2 2 3 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

Затем в массив длинна которого равна количеству областей записываются соответствующие областям цвета. Массив записывается в поле msClr доступ к которому можно получить через свойство public Color [] GetMsClr. Алгоритм работы функции Run приведён в блок схеме Рис 3.5.1

Рис. 3.5.1 Блок-схема рекурсивного алгоритма распределения цветов.

3.6 Класс UserControl1

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

public class UserControl1: System.Windows.Forms.UserControl

{

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.Label label1;

private int nomber; //число, отображается в label1

public UserControl1()

{

}

protected override void Dispose(bool disposing)

{ …

}

}

Объявление делегата и события на основе этого делегата. Событие наступает после закрывания окна выбора цвета ColorDialog. Необходимо для отслеживания смены цвета для своевременного перекрашивания выделенной области.

public delegate void ColorSetDelegate();

public event ColorSetDelegate ColorSet;

Метод private void button1_Click(object sender, System.EventArgs e) срабатывает когда нажата кнопка button1. Создаётся экземпляр класса ColorDialog окна для выбора цвета если результат закрытия окна “OK” то цвет кнопки button1 меняется на выбранный. Свойство кнопки button1 BackColor используется и для хранения текущего цвета. Происходит наступление события ColorSet.

ColorDialog ClrDlg = new ColorDialog();

if(ClrDlg.ShowDialog()==DialogResult.OK)

{

button1.BackColor=ClrDlg.Color;

if(ColorSet!=null)

ColorSet();

}

Свойство public Color ClrSG предназначено для считывания и установки текущего цвета.

Свойство public int Nomber предназначено для считывания и установки числа. Данное число отображается в объекте label1. в программе примере используется для отображения номера выделенной области.

3.7 Класс SetDiapColor

Предназначен для создания массива объектов типа Color (т.е. цветов). В начале через метод SetQuant(int Quant) мы устанавливаем в экземпляр типа SetDiapColor какое количество областей мы хотим раскрасить. Затем сопоставляя некоторые числа каждой области(эти числа могут означать что угодно например количество проживающих на данной области). Затем мы вводим диапазоны и сопоставляем каждому диапазону цвет в который будет окрашена область если число попадёт в заданный интервал. Когда закончен ввод. Нажимаем кнопку и начинается анализ. Каждое число сопоставленное области проверяется в какой интервал оно входит и в соответствии с этим цвет записывается в массив индекс ячейки в которую произведут запись цвета равен номеру рассматриваемой на данный момент области. Так происходит со всеми областями. Массив доступен через свойство GetMsClr. Затем перебирая ячейки массива передаём их в класс CntrIm через метод SetClrPath(i,msc[i]); где это номер области а msc[i] это элемент цвет в полученном массиве цветов.

public class SetDiapColor: System.Windows.Forms.UserControl

{

private System.Windows.Forms.Button button4;

private System.Windows.Forms.GroupBox groupBox2;

private System.Windows.Forms.Button button2;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.ComboBox comboBox2;

private System.Windows.Forms.Button button3;

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.TextBox textBox1;

private System.Windows.Forms.ComboBox comboBox1;

private int QuantPaths; //количество областей

private double [] msCh; //сопоставленные каждой области число

private Color [] msChClr; // сопоставленные каждой области цвет

private double [] msDiap; //массив где i-ый член хранит верхнюю

//границу диапазона а i-1 нижнюю

private Color[] msClr; // сопоставленные диапазонам цвета

private int length; //длина массива диапазонов

private Color DefCol; // цвет по умолчанию

public SetDiapColor() //конструктор поумолчанию

{…

}

Определение делегата и события на основе делегата. Событие наступает по нажатии кнопки button4 “раскрасить”

public delegate void ColorRsDelegate();

public event ColorRsDelegate ColorRs;

Метод public void SetQuant(int Quant) предназначен для создании массива чисел сопоставляемых областям количество которых передано в параметре Quant. Инициализации переменных значениями.

Метод private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) вызывается когда фокус ввода находится на элементе управления textBox1 и осуществляется нажатие кнопки. Если нажатая кнопка не цифра и не “,” которую можно вводить не более 1 раза то textBox1 блокируется для ввода

Если же нажата клавиша перевода каретки то происходит конвертация значения в тип Double и запись этого значения в массив чисел сопоставленных областям. Номер области определяется по записи выделенной в ComboBox1.

Метод private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) вызывается когда меняется выделенный индекс элемента управления comboBox1 и высвечивает в textBox1 число приписанное к данной области.

Метод private void comboBox2_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) вызывается когда фокус ввода находится на элементе управления textBox1 и осуществляется нажатие кнопки. Если нажатая кнопка не цифра и не “,” которую можно вводить не более 1 раза то comboBox2 блокируется для ввода.

Метод private void button1_Click(object sender, System.EventArgs e) срабатывает когда происходит нажатие кнопки button1. Вызывается окно выбора цвета. И установка полученного цвета в соответствующую ячейку массива.

Метод private void button3_Click(object sender, System.EventArgs e) предназначен для добавления в массив диапазонов новый диапазон и также добавляется новый цвет для данного массива. При этом происходит сортировка для последующего определения принадлежности числа массиву.

Метод private void comboBox2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) срабатывает когда отрисовыватеся каждая запись выпадающего списка comboBox. Тесть В начале мы выводим цвет соответствующий данному индексу а затем верхнюю границу.

{

if(e.Index!=-1)

{

if(e.Index<length)

{

e.Graphics.FillRectangle(new SolidBrush(msClr[e.Index]), new Rectangle(e.Bounds.X+1, e.Bounds.Y+1, 13, 13));

e.Graphics.DrawString(msDiap[e.Index].ToString(),new Font("Arial",10),new SolidBrush(Color.Black),e.Bounds.X+14, e.Bounds.Y);

}

else

{

e.Graphics.FillRectangle(new SolidBrush(this.DefCol), new Rectangle(e.Bounds.X+1, e.Bounds.Y+1, 13, 13));

e.Graphics.DrawString("Default",new Font("Arial",10),new SolidBrush(Color.Black),e.Bounds.X+14, e.Bounds.Y);

}

Страницы: 1, 2, 3, 4, 5



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