на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Разработка элемента управления для отображения векторных карт
ласс 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; //нажата кнопки мыши или нет

private bool flRec; //рисовать прямоугольник выделения

private int oldX; //координаты нажатия кнопки мыши

private int oldY;

private int curX; //текущее положение мыши

private int curY;

private double oldDx; //старое смещение координатных осей

private double oldDy;

public delegate void MapLoadEndDelegate(); //определение делегата

public event MapLoadEndDelegate MapLoadEnd; //определение события

}

Метод public void FileOpen(string Pth) предназначен для открывания файла векторного изображения и получении координат замкнутых областей. В начале создается новый экземпляр класса MyMap, устанавливается начальный масштаб и коэффициенты координатных осей. Затем идёт открытие потока для чтения где параметром вызова выступает строка с полным путем к файлу.

StreamReader StrmR = new StreamReader(Path);

Чтение из потока происходит по строчно, строка записывается в переменную str которая и будет использоваться для анализа, выделения команд и координат замкнутых областей. При поступлении набора символов предшествующего массивам координат замкнутых областей флаг flag устанавливается в значение true что говорит о том что начинается считывание координат замкнутых областей. Далее считывается следующая строка и происходит выделение координат. Пока не достигнут конец строки или не найден один из командных символов происходит выделение координат. Из строки по символьно читаются цифры до появления пробела что говорит об окончании значения координаты. Ведётся подсчёт считанных чисел для определения вида координаты по оси X или по оси Y. Не чётные числа означают координаты по оси X чётные числа - координаты по оси Y. Затем создается экземпляр типа PointD с полученными координатами и происходит добавление в экземпляр класса PathD. То есть формируется замкнутая область. Процесс считывания и добавления координат, формирование замкнутая области происходит до того как встречается следующая командная строка. В этот момент сформированная замкнутая область добавляется в коллекцию областей, передаётся в экземпляр класса MyMap а флаг flag устанавливается в значение false сигнализируя о том что чтение координат и формирование области закончено. Далее процесс повторяется пока не будет достигнут конец файла. После чего поток закрывается, ресурсы высвобождаются. Далее вызываются методы SetScaleToView(this.Height,this.Width) и SetXYtoView() экземпляра класса MyMap для масштабирования и расположения изображения в пределах окна. После чего если определёно то вызывается функция сопоставленная событию окончания чтения файла. Алгоритм чтения координат из файла представлен на блок-схеме Рис 3.4.

Метод private void CntrIm_MouseDown object sender, System.Windows.Forms.MouseEventArgs e) срабатывает когда происходит нажатие кнопки мыши. При этом flag устанавливается в значение true что означает кнопка нажата, и запоминаются текущие координаты мыши и смещение координатных осей.

Метод private void CntrIm_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) срабатывает когда происходит событие отпускание кнопки мыши. При этом flag устанавливается в значение false.

Метод private void CntrIm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) срабатывает когда происходит передвижение мыши и запоминаются текущие координаты мыши. Необходимые для отрисовки прямоугольника выделения.

Метод public void ScaleToPoint(int crX,int crY,double sclN) предназначен для изменения масштаба изображения на заданную величину sclN в точку int crX,int crY.

Метод public void MovePoint(int oldx,int oldy, int crx,int cry) предназначен для перемещения изображения из точки с координатами oldx, oldy, в точку с координатами crx, cry.

Метод public void ScaleToRctangle(int oldx,int oldy,int crX,int crY) предназначен для вычисления масштаба для увеличения выделенной области до размеров экрана. Размеры выделенной области определяются первой: oldx,int oldy, и последней точкой int crX,int crY

Рис 3.4 Блок-схема чтения координат из файла

Метод public void VeiwInWindow() предназначен для показа изображения в окне элемента управления. В нем вызываются методы SetScaleToView(this.Height,this.Width) и SetXYtoView() экземпляра класса MyMap для масштабирования и расположения изображения в пределах окна.

Метод RealScale() предназначен для отображения изображения в натуральную величину. Реализовано через установку свойства экземпляра класса MyMap Scale=1 и вызова метода SetXYtoView().

Свойство public bool VeiwRect предназначено для установки значения поля flRec, разрешение или запрещение отрисовки прямоугольника выделения.

Метод public void Allocate(int nPth,int type) предназначен для выделения области указанной в значением параметра nPth, и тип выделения type путём вызова метода Allocate(int nPth,int type) экземпляра класса MyMap.

Метод public void SetClrPath (int NPth,Color Clr) предназначен для установки области с номером NPth цвета окраса Clr. Путём вызова метода SetClrPth(NPth,Clr) экземпляра класса MyMap.

Метод public Color GetClrPath(int NPth) предназначен для получения цвета окраса области с номером NPth.(пример: mapD.AllPaths[NPth].ColorP)

Метод private void CntrIm_SizeChanged(object sender, System.EventArgs e) срабатывает когда изменяются размеры элемента управления. В нем вызываются методы SetScaleToView(this.Height,this.Width) и SetXYtoView() экземпляра класса MyMap для масштабирования и расположения изображения в пределах окна.

Метод protected override void OnPaint(PaintEventArgs e) является перегруженный методом вызываемым при перерисовке элемента управления. Чтобы получить изображение нам необходимо нарисовать все замкнутые области, чтобы нарисовать замкнутую область нам необходимо для данной области простись по всем точкам соединяя каждую точку с последующей. Первый цикл осуществляет перемещение по набору областей а второй цикл осуществляет переход от точки к точке внутри области выбранной в предыдущем цикле. Через методы классов мы получаем доступ к координата конкретной точки.

tmP[j].X=Convert.ToInt32((mapD.AllPaths[k].PathPoints[j].X-

mapD.DX)*mapD.KX*mapD.Scale);

tmP[j].Y=Convert.ToInt32((mapD.AllPaths[k].PathPoints[j].Y-

mapD.DY)*mapD.KY*mapD.Scale);

Эти координаты конвертируются в текущую систему координат и конвертируются из типа double в тип int и заносятся в экземпляр типа Point который находится в массиве длинна которого равна количеству точек в текущей замкнутой области. Когда все координаты текущей замкнутой области перенесены через экземпляр класса PaintEventArgs осуществляется доступ к экземпляру класса Graphics с помощью которого и осуществляется рисование на элементе управления. Сначала заливается текущая облать выбранным стилем и цветом, затем осуществляется доступ к кисти которым должна быть отрисована данная область. Доступ осуществляется через свойство экземпляра класса MyMap AllPen с указанием номера области, то есть соответствующему ей перу.

SolidBrush dBr = new SolidBrush(mapD.AllPaths[k].ColorP);

e.Graphics.FillPolygon(dBr,tmP); Pen tPen;

if(mapD.AllPen[k]==null)

{

tPen=new Pen(Color.Black,1);

}

else

{

tPen=mapD.AllPen[k];

}

e.Graphics.DrawLines(tPen,tmP);

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



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