Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Результат работы метода DrawEllipse

Рисование сегмента эллипса (DrawArc)

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

Рис. Принцип построения сегмента эллипса

Первый угол Angle1 задает расположение одного конца сегмента, а второй Angle2 — расположение другого конца сегмента.

Для рисования сегмента эллипса в C# предусмотрено четыре перегруженных варианта метода DrawArc:

public void DrawArc(Pen, Rectangle, float, float);
public void DrawArc(Pen, RectangleF, float, float);
public void DrawArc(Pen, int, int, int, int, int, int);
public void DrawArc(Pen, float, float, float, float, float, float);

Первый параметр метода DrawArc традиционно определяет перо, с помощью которой будет нарисован сегмент. Последние два параметра задают углы Angle1 и Angle2 в соответствии с рис. Расположение и размеры прямоугольной области передаются методу DrawArc также, как это делается для рассмотренного выше метода DrawEllipse.

Применим указанный метод для рисования сегмента эллипса с углами 90 и 180 соответственно.

Вызов метода будет выглядеть следующим образом.

g.DrawArc(myPen, myRect,90,180);

Код обработчика события Form1_Paint имеет вид (см слайд).

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

Pen myPen = new Pen(Color.Blue, 2);

Rectangle myRect = new Rectangle(10, 10, 200, 100);

g.DrawArc(myPen, myRect,90,180);

 

}

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

Рис. Результат работы метода DrawArc

Рисование замкнутого сегмента эллипса(DrawPie)

Для рисования замкнутого сегмента эллипса используется метод DrawPie. Имеется 4 перегруженных варианта этого метода:

public void DrawPie(Pen, Rectangle, float, float);
public void DrawPie(Pen, RectangleF, float, float);
public void DrawPie(Pen, int, int, int, int, int, int);
public void DrawPie(Pen, float, float, float, float, float, float);

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

Решим предыдущую задачу при помощи метода DrawPie. Вызов метода будет выглядеть следующим образом.

g.DrawPie(myPen, myRect, 90, 180);

Код обработчика события Form1_Paint имеет вид (см слайд).

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

Pen myPen = new Pen(Color.Blue, 2);

Rectangle myRect = new Rectangle(10, 10, 200, 100);

g.DrawPie(myPen, myRect, 90, 180);

}

Результат работы метода представлен на рис.

Рис. Результат работы метода DrawPie.

Рисование кривых Безье (DrawBezier и DrawBeziers)

Кривая Безье, представляющая собой одну из разновидностей сплайна, задается четырьмя точками. Две из них — начальная и конечная, а две другие — управляющие. Кривая Безье проходит через начальную и конечную точки, а управляющие точки задают изгибы кривой линии. Кривые Безье часто используют при работе в графических редакторах. Для рисования кривых Безье в C# имеются два группы перегруженных методов DrawBezier и DrawBeziers (см. слайд). Различие этих групп заключается в способе представления координат точек. В группе DrawBezier координаты точек являются аргументами методов в явном виде или в виде объектов классов Point и PointF, а в группе DrawBeziers аргументами метода являются массивы объектов класса Point и PointF.

 

public void DrawBezier(Pen, Point, Point, Point, Point);
public void DrawBezier(Pen, PointF, PointF, PointF, PointF);
public void DrawBezier(Pen, float, float, float, float, float, float, float, float);

 

public void DrawBeziers(Pen, Point[]);
public void DrawBeziers(Pen, PointF[]);

Продемонстрируем работу двух групп перегруженных методов на примере.

Для группы DrawBezier код будет выглядеть следующим образом. Задаем объекты класса Point.

Point point1 = new Point(10, 80);

Point point2 = new Point(50, 50);

Point point3 = new Point(110, 150);

Point point4 = new Point(190, 80);

Вызываем метод DrawBezier.

g.DrawBezier(myPen, point1,point2,point3,point4);

Для группы DrawBeziers создадим массив точек класса Point.

Point [] myPoint =

{

new Point(10, 100),

new Point(50, 90),

new Point(110, 190),

new Point(190, 60)

};

Вызов метода DrawBeziers будет выглядеть следующим образом.

g.DrawBeziers(new Pen(Color.Red),myPoint);

Код обработчика события Form1_Paint имеет вид (см слайд).

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

Pen myPen = new Pen(Color.Blue, 2);

 

Point point1 = new Point(10, 80);

Point point2 = new Point(50, 50);

Point point3 = new Point(110, 150);

Point point4 = new Point(190, 80);

g.DrawBezier(myPen, point1,point2,point3,point4);

 

Point [] myPoint =

{

new Point(10, 100),

new Point(50, 90),

new Point(110, 190),

new Point(190, 60)

};

g.DrawBeziers(new Pen(Color.Red),myPoint);

}

Результат работы методов представлен на рис.

Рис. Результат работы методов DrawBezier и DrawBeziers

Рисование канонических сплайнов (DrawCurve и DrawClosedCurve)

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

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

public void DrawCurve(Pen, Point[]);
public void DrawCurve(Pen, PointF[]);

public void DrawCurveClosed(Pen, Point[]);
public void DrawCurveClosed(Pen, PointF[]);

Рассмотрим работу методов DrawCurve и DrawCurveClosed на примере предыдущей задачи.

Вызов метода DrawCurve выглядит следующим образом.

g.DrawCurve(myPen,myPoint);

Результат работы метода представлен на рис.

Рис. Работа метода DrawCurve

Вызов метода DrawCurveClosed имеет вид.

 

g.DrawClosedCurve(myPen, myPoint);

Результат работы метода DrawClosedCurve представлен на рис.

Рис. Результат работы метода DrawClosedCurve

Обработчик события Form1_Paint имеет вид.

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

Pen myPen = new Pen(Color.Blue,2);

g.Clear(Color.White);

 

Point[] myPoint =

{

new Point(10, 100),

new Point(50, 90),

new Point(110, 190),

new Point(190, 60)

};

 

g.DrawCurve(myPen,myPoint);

g.DrawClosedCurve(myPen, myPoint);

 

}

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

public void DrawCurve(Pen, Point[], float);
public void DrawCurve(Pen, PointF[], float);

По умолчанию значение жесткости равно 0,5. При увеличении этого параметра увеличиваются изгибы кривой линии. При жесткости большей 1 или меньшей 0 кривая может превратиться в петлю.

Решим предыдущую задачу при помощи указанных методов, жесткость равна 1,5 и 0.

Рис. Результат работы DrawCurve при жесткости 1.5 и 0

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

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

Режим Winding учитывает направление сегментов контура на каждом пересечении. В этом режиме добавляется единица для каждого пересечения по часовой стрелке и вычитается единица для каждого пересечения против часовой стрелки. Если результат отличен от нуля, точка считается расположенной внутри области заполнения или отсечения. Нулевой результат означает нахождение точки вне области заполнения или отсечения.

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

public void DrawClosedCurve(Pen, Point[], float, FillMode);
public void DrawClosedCurve(Pen, PointF[], float, FillMode);

Рисование закрашенных фигур.

В классе Graphics определен ряд методов, предназначенных для рисования закрашенных фигур. Имена некоторых из этих методов, имеющих префикс Fill, мы перечислили в табл. 10‑2.

FillRectangle - рисование закрашенного прямоугольника;

FillRectangles – рисование множества закрашенных прямоугольников;

FillPolygon - рисование закрашенного многоугольника;

FillEllipse - рисование закрашенного сегмента эллипса;

FillPie - рисование закрашенного сегмента эллипса

FillClosedCurve Рисование закрашенного сплайна

FillRegion Рисование закрашенной области типа Region

 

Есть два отличия методов с префиксом Fill от одноименных методов с префиксом Draw. Прежде всего, методы с префиксом Fill рисуют закрашенные фигуры, а методы с префиксом Draw — не закрашенные. Кроме этого, в качестве первого параметра методам с префиксом Fill передается не перо класса Pen, а кисть класса Brush.

Рассмотрим пример рисования фигуры при помощи метода FillRegion.

Класс Region описывает внутреннюю часть графической формы, состоящей из прямоугольников и контуров.

Метод FillRegion заполняет внутреннюю часть объекта заданного при помощи объекта Region.

Для решения задачи создадим инструмент для рисования SolidBrush красного цвета.

SolidBrush myBrush = new SolidBrush(Color.Red);

Зададим область заливки в виде прямоугольника при помощи объекта класса Rectangle.

Rectangle myRect = new Rectangle(10,10, 200,200);

Вызов метода FillRegion будет выглядеть следующим образом.

g.FillRegion(myBrush,new Region(myRect));

Код обработчика события Form1_Paint имеет вид (см слайд).

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

SolidBrush myBrush = new SolidBrush(Color.Red);

Rectangle myRect = new Rectangle(10,10, 200,200);

g.FillRegion(myBrush,new Region(myRect));

}

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

 

Рис. Работа метода FillRegion

Тема. Инструменты для рисования

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

Стоит напомнить, что для использование некоторых возможностей класса Graphics необходимо подключить пространство имен System.Drawing.Drawing2D.

Инструмент для рисования перо (Pen) и его свойства

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

Существуют несколько видов перегруженных конструкторов.

public Pen(Color);
public Pen(Color, float);
public Pen(Brush);
public Pen(Brush, float);

Первый вариант конструктора создает перо заданного цвета. Цвет задается при помощи объекта класса Color, расположенного в пространстве имен System.Drawing.Color.

Pen myPen = Pen(Color.Red);

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

Pen myPen = Pen(Color.Red, 4);

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

Pen myPen = Pen(Brushes.Red, 4);

После того как перо создано, программа может определить его атрибуты при помощи свойств класса Pen. Рассмотрим отдельно свойства класса Pen.

Свойство PenAlignment пример использования приведен ниже. Это свойство определяет, каким образом объект Pen рисует замкнутые кривые и многоугольники. Перечислением PenAlignment задаются пять значений: Center; Inset; Right; Left; Outset. Однако только два значения — Center и Inset изменяют внешний вид рисуемой линии.

Значение Center устанавливается по умолчанию для этого свойства, и им задается центрирование ширины пера по контуру кривой или многоугольника. Значение Inset этого свойства соответствует размещению пера по всей ширине внутри границы кривой или многоугольника. Три другие значения, Right, Left и Outset задают центрированное перо.

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

myPen.Alignment = PenAlignment.Center;

Свойство Brush. Получает или задает объект Brush, определяющий атрибуты объекта Pen. Назначение этого свойства позволяет перу рисовать заполненные линии и кривые. Оно переопределяет свойство Color объекта Pen.

myPen.Brush = Brushes.Blue;

Рис. Результат работы свойства Brush

Свойство Color. Получает или задает цвет объекта Pen. Изменим цвет пера на красный при помощи этого свойства.

myPen.Color = Color.Red;

Рис. Результат работы свойства Color

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

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

Предположим, что нужно создать перо, рисующее две параллельные линии. Первую линию толщиной 20% от ширины пера, пробел, разделяющий линии, — 50% от ширины пера, а вторую линию — 30% от ширины пера.

Для этого необходимо создать массив следующего вида.

float[] d = { 0.0F, 0.2F, 0.7F, 1F };

И присвоить его значение свойству CompoundArray.

myPen.CompoundArray = d;

В результате получим следующий обработчик события Form1_Paint.

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

Pen myPen = new Pen(Color.Black,10);

myPen.Color = Color.Red;

float[] d = { 0.0F, 0.2F, 0.7F, 1F };

myPen.CompoundArray = d;

g.DrawLine(myPen,10,50,200,50);

}

Результат работы свойства представлен на рис.

Рис. Результат работы свойства CompoundArray

Свойство Width. Получает или устанавливает ширину пера Pen, в единицах объекта Graphics, используемого для рисования.

myPen.Width = 5;

Свойство EndCap. Задает окончание линий, нарисованных при помощи объекта Pen. Этому свойству присваиваются значения из перечисления LineCap.

myPen.EndCap = LineCap.ArrowAnchor;

Это перечисление содержит следующие значения.

Flat - задает плоское завершение отрезка.

Square - задает квадратное завершение отрезка.

Round - задает круглое завершение отрезка.

Triangle - задает треугольное завершение отрезка.

NoAnchor - не задает маркер.

SquareAnchor - задает квадратный маркер завершения отрезка.

RoundAnchor - задает круглый маркер.

DiamondAnchor - задает маркер в форме ромба.

ArrowAnchor - задает маркер в форме стрелки.

Свойство StartCap. Задает начало линий, нарисованных при помощи объекта Pen. Этому свойству присваиваются значения из перечисления LineCap

myPen.StartCap = LineCap.DiamondAnchor;

Свойство DashCap. Получает или задает стиль окончания пунктиров, ограничивающих пунктирные линии, нарисованные при помощи объекта Pen. Свойству DashCap присваиваются одно из значений перечисления DashCap. Это перечисление содержит следующие значения для начала и окончания штриха: Flat(квадратное); Round(круглое); Triangle(треугольное).

Свойство DashOffset. Получает или задает расстояние от начала линии до начала штрихового шаблона.

Свойство DashPattern. Получает или задает массив настраиваемых штрихов и промежутков. Элементы массива dashArray задают длину всех штрихов и промежутков штрихового шаблона. Первый элемент задает длину штриха, второй — длину промежутка, третий — длину следующего штриха и так далее. Длина каждого штриха и промежутка штрихового шаблона вычисляется исходя из значения элемента массива и ширины объекта Pen.

float [] DashArray = {4.0F, 2.0F, 1.0F, 3.0F};

myPen.DashPattern = DashArray;

Свойство DashStyle. Получает или задает стиль, используемый для пунктирных линий, нарисованных при помощи объекта Pen. Значениями свойства является перечисление DashStyle, представляющее стиль, используемый для пунктирных линий, нарисованных при помощи объекта Pen. Это перечисление содержит следующие значения.

Solid - Задает сплошную линию.

Dash - Задает линию, состоящую из штрихов.

Dot - Задает линию, состоящую из точек.

DashDot - Задает штрих-пунктирную линию.

DashDotDot - Задает линию, состоящую из повторяющегося шаблона "штрих-две точки".

Custom - Задает пользовательский тип пунктирных линий.

Работа этого свойства выглядит следующим образом.

myPen.DashStyle = DashStyle.DashDotDot;

В результате получим следующий обработчик события Form1_Paint.

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

Pen myPen = new Pen(Color.Black);

myPen.Color = Color.Red;

myPen.Width = 5;

 

myPen.EndCap = LineCap.ArrowAnchor;

myPen.StartCap = LineCap.DiamondAnchor;

g.DrawLine(myPen, 10, 10, 200, 10);

 

float [] DashArray = {4.0F, 2.0F, 1.0F, 3.0F};

myPen.EndCap = LineCap.Flat;

myPen.StartCap = LineCap.Round;

myPen.DashCap = DashCap.Triangle;

myPen.DashPattern = DashArray;

g.DrawLine(myPen, 10, 20, 200, 20);

 

myPen.EndCap = LineCap.RoundAnchor;

myPen.StartCap = LineCap.Square;

myPen.DashStyle = DashStyle.DashDotDot;

g.DrawLine(myPen, 10, 30, 200, 30);

 

myPen.EndCap = LineCap.NoAnchor;

myPen.StartCap = LineCap.NoAnchor;

myPen.DashStyle = DashStyle.Dot;

g.DrawLine(myPen, 10, 40, 200, 40);

}

Рис. Результат работы обработчика события Form1_Paint

Инструмент для рисования кисть (Brush)

Внутренняя область замкнутых геометрических фигур может быть закрашена при помощи кисти. В приложениях Microsoft.NET Frameworks кисти создаются на базе классов, производных от абстрактного класса Brush. Это следующие классы: Brushes; SolidBrush; HatchBrush; TextureBrush; LinearGradientBrush; PathGradientBrush.Рассмотрим отдельно каждый из этих классов.

Кисть SolidBrush

Простейшей из кистей — является кисть SolidBrush, предназначенная для сплошной закраски фигур. Эти кисти создается при помощи конструктора с одним параметром, задающим цвет в виде объекта класса Color.

Вызов конструктора кисти SolidBrush синего цвета выглядит следующим образом.

SolidBrush mySolidBrush = new SolidBrush(Color.Blue);

Код обработчика события Form1_Paint.

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.Clear(Color.White);

SolidBrush mySolidBrush = new SolidBrush(Color.Blue);

g.FillRectangle(mySolidBrush, new Rectangle(10,10,100,100));

}

Результатом работы программы будет квадрат синего цвета нарисованный при помощи кисти SolidBrush и метода FillRectangle (рис).

Рис. Результат работы программы.

 

 

<== предыдущая лекция | следующая лекция ==>
Отображение сообщений об ошибках | Нервной системы
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 537; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.125 сек.