Язык программирования:
C#
Среда программирования:
Visual Studio 2013
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Circle_lines { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); //запускаем таймер timer1.Interval = 80; //Timer объект запускает Timer.Elapsed событий каждые 0.08 секунды (80 миллисекунд) } int cycle = 0;// переменная для хранения текущего состояния прорисовки double delta = 6.28 / 20;// Переменная, задающая количество линий в одном круге double deltaDist = 15; // Переменная, задающая расстояние между кругами double mom = 0.01;// Переменная, хранящая момент анимации // Функция, рисующая анимируемое изображение void draw(int c, double moment, Graphics g2) { //Создаём экземпляр класса BufferedGraphics, вызвав метод Allocate BufferedGraphicsContext currentContext; BufferedGraphics myBuffer; currentContext = BufferedGraphicsManager.Current; myBuffer = currentContext.Allocate(this.pictureBox1.CreateGraphics(), this.pictureBox1.DisplayRectangle); Pen pen = new Pen(Color.White,2);//создаём новое перо указывая его цвет и толщину for(double distance=deltaDist,step=1;distance<200;distance+=deltaDist) { for(double d=0 ;d<6.28;d+=delta) { // Для удобства обращения создаётся массив точек, вокруг текущей (той, что будет рисоваться) Point[] p ={ new Point((int)(distance*Math.Cos(d)),(int)( distance*Math.Sin(d))), new Point((int)(distance*Math.Cos(d+step*delta)),(int)( distance*Math.Sin(d+step*delta))), new Point((int)((distance+deltaDist)*Math.Cos(d+step*delta)),(int)( (distance+deltaDist)*Math.Sin(d+step*delta))), new Point((int)((distance+deltaDist)*Math.Cos(d)),(int)( (distance+deltaDist)*Math.Sin(d))), new Point((int)((distance+deltaDist)*Math.Cos(d-step*delta)),(int)( (distance+deltaDist)*Math.Sin(d-step*delta))), new Point((int)(distance*Math.Cos(d-step*delta)),(int)(distance*Math.Sin(d-step*delta))), }; // Вычисление второй координаты, в зависимости от момента анимации int X = (int)(p[c + 1].X + (-p[c + 1].X + p[c + 2].X) * mom), Y = (int)(p[c + 1].Y + (-p[c + 1].Y + p[c + 2].Y) * mom); // Рисование линии по уже вычисленным ранее координатам с внесением в буфер графическиого объекта и с переносом центра координат в центр окна myBuffer.Graphics.DrawLine(pen, p[0].X + 300, p[0].Y + 270, X + 300, Y + 270); } step*=-1; } myBuffer.Render(this.pictureBox1.CreateGraphics());//отрисовка содержимого буфера } private void timer1_Tick(object sender, EventArgs e) { Graphics gr = pictureBox1.CreateGraphics(); //Создаём объект Graphics для pictureBox1 draw(cycle, mom, gr);// Вызываем функцию рисования if (mom < 1) mom += 0.2;// Приращение момента анимации else { mom = 0.01; cycle += 1; cycle %= 4; } } } }
Прикрепленный файл | Размер |
---|---|
Al-Andari_Circle_lines.zip | 54.7 кб |