Объект Graphics для рисования



 

Для рисования линий и фигур, отображения текста, вывода изо-бражений и т. д. нужно использовать объект Graphics. Этот объект пре-доставляет поверхность рисования и используется для создания графи-ческих изображений. Ниже представлены два этапа работы с графикой.

 

2 Создание или получение объекта Graphics.

3 Использование объекта Graphics для рисования.


 

72


 

Существует несколько способов создания объектов Graphics. Од-ним из самых используемых является получение ссылки на объект Graphics через объект PaintEventArgs при обработке события Paint формы или элемента управления:

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

// Далее вставляется код рисования

}

 

Методы и свойства класса Graphics

 

Имена большого количества методов, определенных в классе Graphics, начинаются с префикса Draw* и Fill*. Первые из них предна-значены для рисования текста, линий и незакрашенных фигур (таких, например, как прямоугольные рамки), а вторые – для рисования закра-шенных геометрических фигур. Ниже рассматривается применение наиболее часто используемых методов, более полную информацию можно найти в документации по Visual Studio.

 

Метод DrawLine рисует линию, соединяющую две точки с задан-ными координатами. У метода есть несколько перегруженных версий:

 

public void DrawLine(Pen, Point, Point); public void DrawLine(Pen, PointF, PointF); public void DrawLine(Pen, int, int, int, int);

 

public void DrawLine(Pen, float, float, float, float);

 

Первый параметр задает инструмент для рисования линии – перо.

 

Перья создаются как объекты класса Pen, например:

 

Pen p = new Pen(Brushes.Black, 2);

 

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

Остальные параметры перегруженных методов DrawLine задают координаты соединяемых точек. Эти координаты могут быть заданы как объекты класса Point и PointF, а также в виде целых чисел и чисел

2 плавающей десятичной точкой.

4) классах Point и PointF определены свойства X и Y, задающие, со-ответственно, координаты точки по горизонтальной и вертикальной оси. При этом в классе Point эти свойства имеют целочисленные значения, а в классе PointF – значения с плавающей десятичной точкой.


 

73


 

Третий и четвертый варианты метода DrawLine позволяют задавать координаты соединяемых точек в виде двух пар чисел. Первая пара опре-деляет координаты первой точки по горизонтальной и вертикальной оси,

 

2 вторая – координаты второй точки по этим же осям. Разница между треть-им и четвертым методом заключается в использовании координат различ-ных типов (целочисленных int и с плавающей десятичной точкой float).

 

Чтобы испытать метод DrawLine в работе, создайте приложение DrawLineApp (аналогично тому, как Вы создавали предыдущее приложе-ние). В этом приложении создайте следующий обработчик события Paint:

 

private void Form1_Paint(object sender, PaintEventArgs e)

 

{

Graphics g = e.Graphics;

g.Clear(Color.White);

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

g.DrawLine(new Pen(Brushes.Black, 2),

10, 4 * i + 20, 200, 4 * i + 20);

}

 

Здесь мы вызываем метод DrawLine в цикле, рисуя 50 горизонталь-ных линий (рис. 10.2).

 

 

Рис. 10.2. Пример использования DrawLine

 

Вызвав один раз метод DrawLines, можно нарисовать сразу не-сколько прямых линий, соединенных между собой. Иными словами, ме-тод DrawLines позволяет соединить между собой несколько точек. Ко-


 

74


 

ординаты этих точек по горизонтальной и вертикальной осям передают-ся методу через массив класса Point или PointF:

 

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

 

Для демонстрации возможностей метода DrawLines создайте при-ложение. Код будет выглядеть следующим образом:

 

Point[] points = new Point[50];

 

Pen pen = new Pen(Color.Black, 2);

 

private void Form1_Paint(object sender, PaintEventArgs e)

 

{

Graphics g = e.Graphics;

 

g.DrawLines(pen, points);

}

 

private void Form1_Load(object sender, EventArgs e)

 

{

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

{

 

int xPos;

if (i % 2 == 0)

{

xPos = 10;

}

 

else

{

xPos = 400;

}

points[i] = new Point(xPos, 10 * i);

}

 

}

 

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

Для прорисовки прямоугольников можно использовать метод

DrawRectangle:

 

DrawRectangle(Pen, int, int, int, int);

 

2 качестве первого параметра передается перо класса Pen. Осталь-ные параметры задают расположение и размеры прямоугольника.

 

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

 

DrawPolygon(Pen, Point[]);


 

75


 

Рис. 10.3. Пример использования массива точек

 

Метод DrawEllipse рисует эллипс, вписанный в прямоугольную область, расположение и размеры которой передаются ему в качестве параметров. При помощи метода DrawArc программа может нарисовать сегмент эллипса. Сегмент задается при помощи координат прямоуголь-ной области, в которую вписан эллипс, а также двух углов, отсчитывае-мых в направлении против часовой стрелки. Первый угол Angle1 задает расположение одного конца сегмента, а второй Angle2 – расположение другого конца сегмента (рис. 10.4).

 

 

Рис. 10.4. Углы и прямоугольник, задающие сегмент эллипса

 

76


 

9) классе Graphics определен ряд методов, предназначенных для рисования закрашенных фигур. Имена некоторых из этих методов, имеющих префикс Fill*:

2 FillRectangle (рисование закрашенного прямоугольника),

3 FillRectangles (рисование множества закрашенных многоуголь-ников),

 

4 FillPolygon (рисование закрашенного многоугольника),

5 FillEllipse (рисование закрашенного эллипса),

6 FillPie (рисование закрашенного сегмента эллипса),

7 FillClosedCurve (рисование закрашенного сплайна),

8 FillRegion (рисование закрашенной области типа Region).

Есть два отличия методов с префиксом Fill* от одноименных ме-

тодов с префиксом Draw*. Прежде всего, методы с префиксом Fill* ри-суют закрашенные фигуры, а методы с префиксом Draw* – незакрашен-ные. Кроме этого, в качестве первого параметра методам с префиксом Fill* передается не перо класса Pen, а кисть класса SolidBrush. Ниже приведем пример, выводящий закрашенный прямоугольник:

 

SolidBrush B = new SolidBrush(Color.DeepPink); g.FillRectangle(B, 0, 0, 100, 100);

 

Индивидуальное задание

 

Изучите с помощью справки MSDN1 методы и свойства классов Graphics, Color, Pen и SolidBrush. Создайте собственное приложение – выводящий на форму рисунок, состоящий из различных объектов (ли-ний, многоугольников, эллипсов, прямоугольников и пр.), не закрашен-ных и закрашенных полностью. Используйте разные цвета и стили ли-ний (сплошные, штриховые, штрих-пунктирные).

 

10) http://msdn.microsoft.com/ru-ru/library/system.drawing(v=vs.100).aspx


 

77


 

 

ЛАБОРАТОРНАЯ РАБОТА № 11.

 

АНИМАЦИЯ

 

Цель лабораторной работы: изучить возможностиVisual Studioпо созданию простейшей анимации. Написать и отладить программу, выводящую на экран анимационное изображение.

 

Работа с таймером

 

Класс для работы с таймером Timer формирует в приложении по-вторяющиеся события. События повторяются с периодичностью, ука-занной в миллисекундах в свойстве Interval. Установка свойства Enabled в значение true запускает таймер. Каждый тик таймера порож-дает событие Tick, обработчик которого обычно и создают в приложе-нии. В этом обработчике могут изменяться какие-либо величины и вы-зываться принудительная перерисовка окна. Для создания анимации весь код, рисующий что-либо на форме, должен находиться в обработ-чике события Paint.

 

Создание анимации

 

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

 

12) качестве примера рассмотрим код анимации секундной стрелки

часов:

 

11) Глобальные переменные private int x1, y1, x2, y2, r; private double a;

 

private Pen pen = new Pen(Color.DarkRed, 2);

 

12) Перерисовка формы

 

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

14) Рисуем секундную стрелку g.DrawLine(pen, x1, y1, x2, y2);

 

}


 

78


 

16) Действия при загрузке формы

 

private void Form1_Load(object sender, EventArgs e)

{

r = 150; // Радиус стрелки

a = 0; // Угол поворота стрелки

15) Определяем центр формы – начало стрелки

x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

16) Конец стрелки

x2 = x1 + (int)(r * Math.Cos(a));

y2 = y1 ‐ (int)(r * Math.Sin(a));

}

 

17) Действия при очередном «тике» таймера

 

private void timer1_Tick(object sender, EventArgs e)

{

a ‐= 0.1; // Уменьшаем угол на 0,1 радиану

и Новые координаты конца стрелки

x2 = x1 + (int)(r * Math.Cos(a)); y2 = y1 ‐ (int)(r * Math.Sin(a));

и Принудительный вызов события Paint Invalidate();

 

}

 

Движение по траектории

 

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

4. случае движения на плоскости обычно изменению подвергает-ся один параметр. Рассмотрим пример реализации движения окруж-ности по декартову листу. Декартов лист – это плоская кривая третьего порядка, удовлетворяющая уравнению в прямоугольной сис-теме x3 + y3 = 3·a·x·y. Параметр 3·a определяется как диагональ квадрата, сторона которого равна наибольшей хорде петли.

При переходе к параметрическому виду получаем:

 

,

 

где t = tg φ.


 

79


 

Рис. 11.1. Декартов лист

 

Описание ряда интересных кривых для создания траектории дви-жения можно найти в Википедии в статье Циклоидальная кривая2.

Программная реализация выглядит следующим образом:

 

private int x1, y1, x2, y2;

 

private double a, t, fi;

private Pen pen = new Pen(Color.DarkRed, 2); private void Form1_Load(object sender, EventArgs e)

 

{

x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

 

a = 150;

fi = –0.5;

t = Math.Tan(fi);

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

y2 = y1 ‐ (int)((3 * a * t * t) / (1 + t * t * t));

 

}

 

private void Form1_Paint(object sender, PaintEventArgs e)

 

{

Graphics g = e.Graphics; g.DrawEllipse(pen, x2, y2, 20, 20);

 

}

 

private void timer1_Tick(object sender, EventArgs e)

 

{

 

 

и https://ru.wikipedia.org/wiki/Циклоидальная_кривая 80


 

fi += 0.01;

 

t = Math.Tan(fi);

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

y2 = y1 ‐ (int)((3 * a * t * t) / (1 + t * t * t)); Invalidate();

 

}

 

Индивидуальное задание

 

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

Создайте приложение, отображающее вращающийся винт са-

молета.

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

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

Создайте приложение, отображающее движение окружности по спирали.

Разработайте программу анимации падения снежинки.

Создайте программу, показывающую скачущий мячик.

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

Разработайте программу анимации летающего бумеранга.

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

Создайте приложение, отображающее хаотичное движение звезды в окне.

 

Разработайте программу анимации взлета ракеты. Старт осу-ществляется по нажатию специальной «красной» кнопки.

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

 

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

 

Разработайте программу анимации движения планет в Солнеч-ной системе.

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

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

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

 

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

Создайте приложение, отображающее движение автомобиля

у вращающимися колесами.


 

81


 

ЛАБОРАТОРНАЯ РАБОТА № 12.

 

ОБРАБОТКА ИЗОБРАЖЕНИЙ

 

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

 


Дата добавления: 2020-04-08; просмотров: 1331; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!