Среда программирования:
Visual Studio 2013
using System; using System.Drawing; using System.Windows.Forms; namespace Speedy_Circles { public partial class Form1 : Form { //Счетчик таймера private int time = 0; //Параметр изменения угла для изменения скорости вращения private int param = 100; //Радиус окружности по которой идет вращение private int radius = 200; //Радиус кружков private int radius_circle = 50; //Счетчик для изменения радиуса кружков private int radius_circle_iteration = 0; //Координаты центра кружности вращения private int xc = 250, yc = 250; //Число пи private const double pi = 3.1416; //Инициализация bitmap private Bitmap Circle_map; //Инициализация графики private Graphics graph; //Массив углов для вращения кружков private double[] Circle_Angles = new double[10]; //Массив цветов кружков private Color[] clr = new Color[] { Color.Navy, Color.Blue, Color.Cyan, Color.Green, Color.Lime, Color.Yellow, Color.Red, Color.Crimson, Color.DeepPink, Color.Magenta, }; //Функция рисования кружков private void DrawCircle(int i) { SolidBrush Brush_circle = new SolidBrush(clr[i]); Pen mypen = new Pen(Color.White); //Отрисовка уржков на начальном этапе, в медленном темпе if(time < 30) { //Пересчитывание координат double x = xc - radius * Math.Cos(Circle_Angles[i]); double y = yc - radius * Math.Sin(Circle_Angles[i]); //Пересчитывание углов Circle_Angles[i] = Circle_Angles[i] + (pi / param); //Отрисовка кружков graph.FillEllipse(Brush_circle, (int)x, (int)y, radius_circle, radius_circle); } else //Отрисовка кружков в ускоряющемся темпе, изменение радиуса основной окружности и кружков if((time >= 30) && (time < 280)) { //Уменьшение радиусов и увеличение скорости вращения на каждой итерации таймера if (i == 0) { if (time % 2 == 0) { radius--; radius_circle_iteration++; if (radius_circle_iteration % 5 == 0) { radius_circle --; } } else if (param >= 10) { param--; } } //Пересчитывание координат double x = xc - radius * Math.Cos(Circle_Angles[i]); double y = yc - radius * Math.Sin(Circle_Angles[i]); //Пересчитывание углов Circle_Angles[i] = Circle_Angles[i] + (pi / param); //Отрисовка кружков graph.FillEllipse(Brush_circle, (int)x, (int)y, radius_circle, radius_circle); } else //Вращение в эпицентре, с наибольшим темпом и наименьшимим радиусами if((time >= 280) && (time < 400)) { if (param >= 10) { param--; } //Пересчитывание координат double x = xc - radius * Math.Cos(Circle_Angles[i]); double y = yc - radius * Math.Sin(Circle_Angles[i]); //Пересчитывание углов Circle_Angles[i] = Circle_Angles[i] + (pi / param); //Отрисовка кружков graph.FillEllipse(Brush_circle, (int)x, (int)y, radius_circle, radius_circle); } else //Уменьшение темпа вращения и возращение в исходные позиции кружков if((time >= 400) && (time <= 650)) { //Увеличение радиусов и уменьшение скорости вращения на каждой итерации таймера if (i == 0) { if (time % 2 == 0) { radius++; radius_circle_iteration++; if (radius_circle_iteration % 5 == 0) { radius_circle++; } } if (time > 450) { if ((time % 3 == 0) && (param <= 140)) { param++; } } } //Пересчитывание координат double x = xc - radius * Math.Cos(Circle_Angles[i]); double y = yc - radius * Math.Sin(Circle_Angles[i]); //Пересчитывание углов Circle_Angles[i] = Circle_Angles[i] + (pi / param); //Отрисовка кружков graph.FillEllipse(Brush_circle, (int)x, (int)y, radius_circle, radius_circle); if(time==650) { //На последней итерации возвращаем все данные на исходные позиции time = 0; param = 100; radius = 200; radius_circle = 50; } } } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Присваивание значений углов на старте отрисовки Circle_Angles[0] = 0; for (int i = 1; i < 10; i++) { Circle_Angles[i] = Circle_Angles[i - 1] + (pi / 5); } //Вызов функции таймера timer1.Start(); } private void Picture_Circles_Click(object sender, EventArgs e) { } private void timer1_Tick(object sender, EventArgs e) { //Создаем bitmap Circle_map = new Bitmap(Picture_Circles.Width, Picture_Circles.Height); //Создаем графику из bitmap graph = Graphics.FromImage(Circle_map); //Используем сглаживание при рисовании graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //закрашиваем черным цветом фон graph.Clear(Color.Black); //Цикл прорисовки кружков for (int i = 0; i < 10; i++) { DrawCircle(i); //Функция прорисовки кружков } //Выводим содержимое на picturebox Picture_Circles.BackgroundImage = Circle_map; time++;//Увеличиваем счетчик таймера } } }
Прикрепленный файл | Размер |
---|---|
Speedy_Circles.zip | 58.54 кб |