Файл: Практикум по информатике рекомендовано в качестве учебного пособия.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 30.11.2023

Просмотров: 735

Скачиваний: 14

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
10.3. Методы и свойства класса
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
, а также в виде целых чисел и чисел с плавающей десятичной точкой.
В классах
Point и
PointF
определены свойства
X
и
Y
, задающие, со- ответственно, координаты точки по горизонтальной и вертикальной оси.
При этом в классе
Point эти свойства имеют целочисленные значения, а в классе
PointF
– значения с плавающей десятичной точкой.

74
Третий и четвертый варианты метода
DrawLine позволяют задавать координаты соединяемых точек в виде двух пар чисел. Первая пара опре- деляет координаты первой точки по горизонтальной и вертикальной оси, а вторая – координаты второй точки по этим же осям. Разница между треть- им и четвертым методом заключается в использовании координат различ- ных типов (целочисленных 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 позволяет соединить между собой несколько точек. Ко-


75 ординаты этих точек по горизонтальной и вертикальной осям передают- ся методу через массив класса
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
);
В качестве первого параметра передается перо класса
Pen
. Осталь- ные параметры задают расположение и размеры прямоугольника.
Для прорисовки многоугольников можно использовать следующий метод:
DrawPolygon(
Pen
,
Point
[]);

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

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

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

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

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

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

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

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

FillRegion
(рисование закрашенной области типа
Region
).
Есть два отличия методов с префиксом
Fill*
от одноименных ме- тодов с префиксом
Draw*
. Прежде всего, методы с префиксом
Fill*
ри- суют закрашенные фигуры, а методы с префиксом
Draw*
– незакрашен- ные. Кроме этого, в качестве первого параметра методам с префиксом
Fill*
передается не перо класса
Pen
, а кисть класса
SolidBrush
. Ниже приведем пример, выводящий закрашенный прямоугольник:
SolidBrush
B = new
SolidBrush
(
Color
.DeepPink); g.FillRectangle(B, 0, 0, 100, 100);
Индивидуальное задание
Изучите с помощью справки MSDN
1
методы и свойства классов
Graphics
,
Color
,
Pen и
SolidBrush
. Создайте собственное приложение – выводящий на форму рисунок, состоящий из различных объектов (ли- ний, многоугольников, эллипсов, прямоугольников и пр.), не закрашен- ных и закрашенных полностью. Используйте разные цвета и стили ли- ний (сплошные, штриховые, штрих-пунктирные).
1
http://msdn.microsoft.com/ru-ru/library/system.drawing(v=vs.100).aspx


78
ЛАБОРАТОРНАЯ РАБОТА № 11.
АНИМАЦИЯ
Цель лабораторной работы:
изучить возможности Visual Studio по созданию простейшей анимации. Написать и отладить программу, выводящую на экран анимационное изображение.
11.1. Работа с таймером
Класс для работы с таймером
Timer формирует в приложении по- вторяющиеся события. События повторяются с периодичностью, ука- занной в миллисекундах в свойстве
Interval
. Установка свойства
Enabled в значение true запускает таймер. Каждый тик таймера порож- дает событие
Tick
, обработчик которого обычно и создают в приложе- нии. В этом обработчике могут изменяться какие-либо величины и вы- зываться принудительная перерисовка окна. Для создания анимации весь код, рисующий что-либо на форме, должен находиться в обработ- чике события
Paint
11.2. Создание анимации
Для создания простой анимации достаточно использовать таймер, при тике которого будут изменяться параметры изображения (например, координаты концов отрезка) и вызываться обработчик события
Paint для рисования по новым параметрам. При таком подходе не надо заботиться об удалении старого изображения, ведь оно создается в окне заново.
В качестве примера рассмотрим код анимации секундной стрелки часов:
// Глобальные переменные private int x1, y1, x2, y2, r; private double a; private
Pen pen = new
Pen
(
Color
.DarkRed, 2);
// Перерисовка формы private void
Form1_Paint(
object sender,
PaintEventArgs e)
{
Graphics g = e.Graphics;
// Рисуем секундную стрелку g.DrawLine(pen, x1, y1, x2, y2);
}

79
// Действия при загрузке формы private void
Form1_Load(
object sender,
EventArgs e)
{ r = 150;
// Радиус стрелки a = 0;
// Угол поворота стрелки
// Определяем центр формы – начало стрелки x1 = ClientSize.Width / 2; y1 = ClientSize.Height / 2;
// Конец стрелки x2 = x1 + (
int
)(r *
Math
.Cos(a)); y2 = y1 ‐ (
int
)(r *
Math
.Sin(a));
}
// Действия при очередном «тике» таймера 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();
}
11.3. Движение по траектории
Движение по траектории реализуется аналогично вышерассмот- ренному примеру. Для реализации движения по прямой нужно увеличи- вать переменные, являющиеся узловыми точками, на определенные константы: в приведенном выше примере это переменные x2
и y2
. Для задания более сложной траектории можно использовать различные па- раметрические кривые.
В случае движения на плоскости обычно изменению подвергает- ся один параметр. Рассмотрим пример реализации движения окруж- ности по декартову листу. Декартов лист – это плоская кривая третьего порядка, удовлетворяющая уравнению в прямоугольной сис- теме x
3
+
y
3
=
3·a·x·y. Параметр 3·a определяется как диагональ квадрата, сторона которого равна наибольшей хорде петли.
При переходе к параметрическому виду получаем:
, где t
=
tg φ.


80
Рис. 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)
{
2
https://ru.wikipedia.org/wiki/Циклоидальная_кривая

81 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();
}
Индивидуальное задание
1.
Создайте программу, показывающую пульсирующее сердце.
2.
Создайте приложение, отображающее вращающийся винт са- молета.
3.
Разработайте программу анимации двигающегося человечка.
4.
Создайте программу, показывающую движение окружности по синусоиде.
5.
Создайте приложение, отображающее движение окружности по спирали.
6.
Разработайте программу анимации падения снежинки.
7.
Создайте программу, показывающую скачущий мячик.
8.
Создайте приложение, отображающее движение окружности вдоль границы окна. Учтите возможность изменения размеров окна.
9.
Разработайте программу анимации летающего бумеранга.
10.
Создайте программу, показывающую падение нескольких звезд одновременно.
11.
Создайте приложение, отображающее хаотичное движение звезды в окне.
12.
Разработайте программу анимации взлета ракеты. Старт осу- ществляется по нажатию специальной «красной» кнопки.
13.
Создайте программу, показывающую движение окружности вдоль многоугольника. Число вершин вводится пользователем до анимации.
14.
Создайте приложение, отображающее броуновское движение молекулы в окне.
15.
Разработайте программу анимации движения планет в Солнеч- ной системе.
16.
Создайте программу, показывающую движение квадратика по траектории, состоящей из 100 точек, хранящихся в специальном массиве.
17.
Создайте приложение, имитирующие механические часы.
18.
Разработайте программу анимации падения нескольких лист- ков с дерева. Движение не должно быть линейным.
19.
Создайте программу, показывающую движение окружности по спирали с плавно изменяющейся скоростью.
20.
Создайте приложение, отображающее движение автомобиля с вращающимися колесами.

82
ЛАБОРАТОРНАЯ РАБОТА № 12.
ОБРАБОТКА ИЗОБРАЖЕНИЙ
Цель лабораторной работы:
изучить возможности Visual Studio по открытию и сохранению файлов. Написать и отладить программу для обработки изображений.
12.1. Отображение графических файлов
Обычно для отображения точечных рисунков, рисунков из мета- файлов, значков, рисунков из файлов в формате BMP, JPEG, GIF или
PNG используется объект
PictureBox
,
т. е. элемент управления
PictureBox действует как контейнер для картинок. Можно выбрать изо- бражение для вывода, присвоив значение свойству
Image
. Свойство
Image может быть установлено в окне свойств или в коде программы, указывая на рисунок, который следует отображать.
Элемент управления
PictureBox содержит и другие полезные свой- ства, в том числе свойство
AutoSize
, определяющее, будет ли изображе- ние растянуто в элементе
PictureBox
, и
SizeMode
, которое может ис- пользоваться для растягивания, центрирования или увеличения изображения в элементе управления
PictureBox
Перед добавлением рисунка к элементу управления
PictureBox в проект обычно добавляется файл рисунка в качестве ресурса
3
. После добавления ресурса к проекту можно повторно использовать его. На- пример, может потребоваться отображение одного и того же изображе- ния в нескольких местах.
Необходимо отметить, что поле
Image само является классом для ра- боты с изображениями, у которого есть свои методы. Например, метод
FromFile используется для загрузки изображения из файла. Кроме класса
Image существует класс
Bitmap
, который расширяет возможности класса
Image за счет дополнительных методов для загрузки, сохранения и ис- пользования растровых изображений. Так, метод
Save класса
Bitmap по- зволяет сохранять изображения в разных форматах, а методы
GetPixel и
SetPixel
– получить доступ к отдельным пикселям рисунка.
3
В приложениях Visual C# часто содержатся данные, неявляющиеся исходным ко- дом. Такие данные называются ресурсами проекта и могут включать двоичные дан- ные, текстовые файлы, аудио- и видеофайлы, таблицы строк, значки, изображения,
XML-файлы или любой другой тип данных, необходимых для приложения. Данные ресурсов проекта хранятся в формате XML в файле с расширением RESX (имя по умолчанию – Resources.resx), который можно открыть в Обозревателе решений.


83
12.2. Элементы управления OpenFileDialog и SaveFileDialog
Элемент управления
OpenFileDialog является стандартным диало- говым окном. Он аналогичен диалоговому окну «Открыть файл» операци- онной системы Windows. Элемент управления
OpenFileDialog позволяет пользователям просматривать папки личного компьютера или любого компьютера в сети, а также выбирать файлы, которые требуется открыть.
Для вызова диалогового окна для выбора файла можно использо- вать метод
ShowDialog()
, который возвращает значение
DialogResult.OK
при корректном выборе. Диалоговое окно возвращает путь и имя файла, который был выбран пользователем в специальном свойстве
FileName
12.3. Простой графический редактор
Создайте приложение, реализующее простой графический редак- тор. Функциями этого редактора должны быть: открытие рисунка, рисо- вание поверх него простой кистью, сохранение рисунка в другой файл.
Для этого создайте форму и разместите на ней элементы управления
Button и
PictureBox
(рис. 12.1).
Рис. 12.1. Форма для графического редактора

84
В этом случае не понадобится из панели элементов размещать на форме элементы диалоговых окон
OpenFileDialog и
SaveFileDialog
Эти элементы будут порождены динамически в ходе выполнения про- граммы с помощью конструктора. Например, так:
OpenFileDialog dialog = new
OpenFileDialog
();
Далее они будут вызываться с помощью метода
ShowDialog()
Для кнопок «Открыть» и «Сохранить» создайте свои обработчики события. Также создайте обработчик события
Load для формы. Для элемента управления pictureBox1
создайте обработчики события
MouseDown
,
MouseMove
Код приложения будет выглядеть следующим образом:
// Глобальные переменные private
Point
PreviousPoint, point; private
Bitmap bmp; private
Pen blackPen; private
Graphics g;
// Действия при загрузке формы private void
Form1_Load(
object sender,
EventArgs e)
{
// Подготавливаем перо для рисования blackPen = new
Pen
(
Color
.Black, 4);
}
// Действия при нажатии кнопки загрузки изображения private void button1_Click(
object sender,
EventArgs e)
{
// Описываем объект класса OpenFileDialog
OpenFileDialog dialog = new
OpenFileDialog
();
// Задаем расширения файлов dialog.Filter =
"Image files (*.BMP, *.JPG, "
+
"*.GIF, *.PNG)|*.bmp;*.jpg;*.gif;*.png"
;
// Вызываем диалог и проверяем выбран ли файл if
(dialog.ShowDialog() ==
DialogResult
.OK)
{
// Загружаем изображение из выбранного файла
Image image =
Image
.FromFile(dialog.FileName); int width = image.Width; int height = image.Height; pictureBox1.Width = width; pictureBox1.Height = height;
// Создаем и загружаем изображение в формате bmp bmp = new
Bitmap
(image, width, height);