Смекни!
smekni.com

Разработка элемента управления для отображения векторных карт (стр. 2 из 6)

Рис. 2.1 Иерархия классов

2.2 Дополнительные элементы управления

Класс AutoColor. Взаимодействие этого класса с элементом управления представляет собой контрактную модель. Экземпляр класса AutoColor получает коллекцию областей для анализа (массив экземпляров класса PathD), анализирует данные и выдаёт массив экземпляров класса Color, то есть цвета в которые будут раскрашены области с учётом того что рядом расположенные области не будут одинаково раскрашены. Выбор цветов производится из условия оптимального раскрашивания. Массив экземпляров класса PathD хранится в экземпляре класса MyMap. Схема взаимодействия приведена на Рис. 2.2.1

Класс UserControl1. Является элементом управления унаследованным от класса UserControl. И создан для выдачи экземпляра класса Color то есть цвета в который будет окрашена выделенная в элементе управления CntrIm замкнутая область. Схема взаимодействия приседена на рисунку 2.2.2

Рис. 2.2.1 Схема взаимодействия c классом AutoColor

Класс SetDiapColor. Является элементом управления унаследованным от UserControl и предназначен для выдачи схемы раскраски замкнутых областей. Он получает количество замкнутых областей. В этом элементе управления каждой области присваивается число и задаются диапазоны для раскрашивания. В зависимости от этих параметров выдаётся массив типа Color. То есть номер экземпляра в массиве соответствует в какой цвет будет раскрашена замкнутая область.

Рис 2.2.2 Схема взаимодействия с классом UserControl1

Рис 2.2.3 Схема взаимодействия с классом SetDiapColor.


3. Разработка кода элемента управления

3.1 Класс PointD

Предназначен исключительно для хранения координат точек x и y и организации доступа к ним. Тип переменных в которых хранятся координаты определялся исходя из того что необходимо хранить числа с не менее чем 5ью знаками поле запятой.

Структуракласса PointD:

public class PointD

{

private double x; //координата x

private double y; //координата y

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

{ …

}

public PointD(double x,double y)

{…

}

public PuintD(PointD pd) //конструкторкопирования

{…

}

public double X // свойство для доступа к координате X

{…

}

public double Y //свойство для доступа к координате Y

{…

}


3.2 Класс PathD

Класс PathD несёт смысловую нагрузку и представляет собой замкнутую область. В его структуру включен массив типа PointD в который добавляются точки которые формируют замкнутую область. Включены поля хранящие количество точек в замкнутой области, координаты центра замкнутой области, цвет замкнутой области. Центр области вычисляется по формуле Xc=(x1+x2+…+xn)/n, Yc=(y1+y2+…+yn)/n, где Xc,Yc-координаты центра фигуры, n-количество точек замкнутой фигуры, x1..xn координаты по оси X точек 1..n, y1..yn координаты по оси Y точек 1..n. Добавление точек осуществляется так: создается массив длинной n+1 экземпляры класса PoitD копируются в новый массив, в последний элемент массива записывается новый экземпляр класса PoitD. Старый массив уничтожается «сборщиком мусора» элементом среды в которой идёт выполнение.

Структуракласса PathD

public class PathD

{

private int length; //количество точек в замкнутой области

private PointD[] msPtd; //массивточек

private PointD centr; //центрфигуры

private Color clr; //цвет в который будет раскрашена область при //при отрисовке

public PathD()

{…

}

public void AddPoint(PointD pointD) //методдобавляющийточкук

//области

{ …

}

public int Length

{ …

}

public PointD[] PathPoints //свойствовыдающеемассивточекобласти

{…

}

public PointD Centr //свойство выдающее центр области

{ …

}

public Color ColorP //свойство для получения и установки цвета

{ …

}

}

3.3 Класс MyMap

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

Стрктура класса MyMap:

public class MyMap

{

private double scale; //полемасштаба

private int length; //поле количество замкнутых областей

private int space; //отступ от границы элемента

private double kx; //коэффициент по оси х

private double ky; //коэффициентпооси y

private double dx; //смещениеосих

private double dy; //смещениеоси y

private PathD [] msPthd; // массив замкнутых областей

private Pen [] msPn; //массив перьев для отрисовки обастей

// iой области соответствует iое перо

}

Метод public void AddPath(PathD pathD) предназначен для добавления замкнутой области к коллекции областей в качестве параметра ей передается объект типа (PathD

Свойство public PathD[] AllPaths выдаёт копию массива замкнутых областей

Свойство public Pen[] AllPen выдаёт копию массива перьев соответствующих каждой области.

Свойство public int Length выдаёт количество замкнутых областей

Свойство public double Scale выдаёт или устанавливает масштаб изображения

Метод public void SetAxes(double kX,double kY) предназначен для установки коэффициентов по координатным осям.

Метод public void SetXYAxes(double dX, double dY) предназначен для установки смещения координатных осей относительно исходных.

Свойство public double KX предназначен для установки и получения коэффициентов по оси X.

Свойство public double KY предназначен для установки и получения коэффициентов по оси Y.

Свойство public double DX предназначен для установки и получения смещения координатной оси X относительно исходного расположения.

Свойство public double DY предназначен для установки и получения смещения координатной оси Y относительно исходного расположения.

Метод public void SetXYtoView() предназначен для нахождения смещения координатных осей для расположения изображения в видимой области в исходной системе координат. То есть находятся минимальные координаты по оси X и Y затем из них вычитается смещение от границы. Смещение от границы сделано исключительно в эстетических целях.

Метод public void SetScaleToView(int height,int width) предназначен для вычисления и установки масштаба для вписывания в окно заданных размеров height, width. Вычисление происходит методом нахождения минимальных и максимальных координат в имеющихся замкнутых областях. Затем происходит выбор наиболее протяженной разницы между максимальной и минимальной координатой по X и Y. Вычисление масштаба по формуле scale = (height-space*2)/h по оси Y и scale = (width-space*2)/l по оси X.

Метод public void Allocate(int nPth,int type) предназначен для установки пера замкнутой области с номером nPth. Переменная type предназначена для представления какой тип выделения замкнутой области. Выделение одиночной или группы областей. В данном случае реализовано только для одиночного выделения областей. Алгоритм представлен ниже на блок схеме Рис. 3.3.

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


Рис. 3.3 блок-схемаалгоритмаметода public void Allocate(int nPth,int type)

Метод public void SetClrPth(int NPth, Color Clr) Предназначен для установки свойства замкнутой области с номером NPth в значение Clr.

Метод public int GetNamberPath (int crX, int crY) предназначен для определения какой замкнутой области принадлежности координаты точки. Если точка не принадлежит ни одной из областей то метод возвращает -1 в противном случае возвращает номер области.

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

Пусть у нас есть точка с координатами x,y: Принадлежность точки стороне проверяется просто: если концевые точки стороны A(x1,y1) и B(x2,y2), то, если точка Z(x,y) принадлежит стороне, то должно существовать такое число p, 0<=p<=1, что

x=p*x1+(1-p)*x2

y=p*y1+(1-p)*y2

(тут используется то, что если прямая проходит через A и B, то точки прямой имеют координаты (p*x1+(1-p)*x2, p*y1+(1-p)*y2), p действительное число. При 0<=p<=1 мы получаем отрезок между точками A и B).

Далее, проведем из точки Z прямую, параллельную оси OX (ее уравнение будет Y=y) и проверим, сколько сторон треугольника пересекает полулуч, идущий от точки Z, например, вправо. Если 0, то Z - вне треугольника, если 1 - то внутри, если 2 - то снаружи

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

Может быть 2 случая рассмотренных на Рис. 3.3.1.

Рис 3.3.1 2а случая пересечения лучом вершины


В случае 1, когда оба ребра, входящих в вершину A, лежат по одну сторону от прямой, количество пересечений можно считать равным двум (или нулю), в случае 2, когда ребра лежат по разные стороны от прямой, число пересечений примем равным 1. Если прямая проходит по стороне, то число пересечений будем считать равным 2. Алгоритм нахождения номера выделенной области рассмотрен на блок схеме Рис. 3.3.2.



Рис. 3.3.2 Блок-схема алгоритма нахождения номера выделенной области


3.4 Класс CmpView

Предназначен для отрисовки элементов векторной каты, открытия файла с векторным изображением и получения координат замкнутых областей. А также обеспечения взаимодействия с внешней средой.

public class CntrIm: System.Windows.Forms.UserControl

{

private string Path; //поле для хранения пути к файлу

private MyMap mapD; //поле для хранения объекта MyMap

private bool flag; //нажата кнопки мыши или нет