Управляемое вращение и перемещение фигуры

 

Листинг 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();

}

Предлагаю ознакомиться с аналогичными статьями: