Управляемое вращение и перемещение фигуры
Листинг 56.1. Код проектирования и преобразования фигуры.
//Объявляем переменную 'i' для исходной позиции фигуры;
int i = 0;
//Объявляем объект нашего нового класса Animation и
//при помощи конструктора new создаем экземпляр объекта:
Animation myAnimation = new Animation();
//Вводим наш новый класс Animation:
class Animation
{
//Объявляем и задаем шаги горизонтального offsetX
//и вертикального offsetY перемещений фигуры
//за один интервал времени:
float offsetX = 6;
float offsetY = 2;
//Объявляем и задаем в градусах
//шаг угла поворота фигуры:
float step_alpha = 6;
//Объявляем объекты класса GraphicsPath:
GraphicsPath myGraphicsPath = new GraphicsPath();
GraphicsPath myGraphicsPath2 = new GraphicsPath();
//В классе Matrix объявляем
//объекты-матрицы преобразований:
//объект myMatrix1 - для поворота фигуры и
//объект myMatrix2 - для перемещения фигуры:
Matrix myMatrix1 = new Matrix();
Matrix myMatrix2 = new Matrix();
//Вводим конструктор нашего класса для задания фигуры
//в виде окружности (методом AddEllipse)
//и в виде линий (методом AddLine):
public Animation()
{
myGraphicsPath.AddEllipse(70, 70, 100, 100);
myGraphicsPath.AddLine(75, 100, 165, 100);
myGraphicsPath.AddLine(75, 140, 165, 140);
//При помощи клонирования
//создаем объект myGraphicsPath2
//как точную копию объекта myGraphicsPath:
myGraphicsPath2 =
(GraphicsPath)myGraphicsPath.Clone();
}
//Вводим методо FigureDraw для преобразования
//и рисования фигуры:
public void FigureDraw(Graphics myGraphics, int j)
{
//Перемещаем фигуру:
myMatrix2.Translate(offsetX, offsetY);
//При помощи клонирования
//создаем объект myGraphicsPath
//как точную копию объекта myGraphicsPath2:
myGraphicsPath =
(GraphicsPath)myGraphicsPath2.Clone();
//Задаем точку, относительно которой
//будет поворачиваться фигура:
PointF myPointF =
myGraphicsPath.GetBounds().Location;
myPointF.X = myPointF.X +
myGraphicsPath.GetBounds().Width / 2;
myPointF.Y = myPointF.Y +
myGraphicsPath.GetBounds().Height / 2;
//Поворачиваем фигуру по часовой стрелке
//на один шаг step_alpha
// при помощи метода RotateAt класса Matrix:
myMatrix1.RotateAt(step_alpha, myPointF);
//Применяем метод Transform класса GraphicsPath
//для трансформирования матриц myMatrix:
myGraphicsPath.Transform(myMatrix1);
myGraphicsPath.Transform(myMatrix2);
//Рисуем преобразованную фигуру:
myGraphics.DrawPath(new Pen(Color.Red, 3),
myGraphicsPath);
}
}
В панели Properties (для PictureBox) на вкладке Events дважды щелкаем по имени события Paint. Появляется шаблон метода PictureBox_Paint, который после записи нашего кода принимает следующий вид.
Листинг 56.2. Метод для элемента управления PictureBox.
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Вызываем метод FigureDraw
//для рисования фигуры в i-м положении:
myAnimation.FigureDraw(e.Graphics, i);
//Задаем следующее i-е положение фигуры:
i = i + 1;
}
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form9.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 56.3. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = trackBar1.Value;
}
Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form9.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 56.4. Метод для компонента Timer.
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Refresh();
}