using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    // класс Круг 
   public class Circle
    {
       public  double x, y, R, t, angle, dist, blueR;
       public  bool isGrow = false;
       public  Circle() { t = 0.45; }
    }

    public partial class Form1 : Form
    {
        Bitmap myBitmap;
        Graphics gr;
        SolidBrush fon, cirBlackPaint, cirBluePaint;
        List<Circle> arr = new List<Circle>();
        //ширина, высота экрана, счетчики
        int xO, yO, tmp1 = 81, tmp2 = 40 + 81;

        //функция поворота точки на угол альфа
        Circle changePos(Circle c)
        {
            double x = c.dist * Math.Sin(c.angle * Math.PI / 180);
            double y = -c.dist * Math.Cos(c.angle * Math.PI / 180);
            c.x = (int)x; c.y = (int)y;
            return c;
        }

        //изменить расстояние от центра и радиус круга
        void changeChar(Circle c)
        {
            c.dist += c.t; c.t += 0.0018; c.R += 0.08;
            if (c.isGrow) c.blueR += 0.24;
            else c.blueR -= 0.11;
            if (c.blueR < -3.0) c.isGrow = true;
        }

        //добавить 12 кругов 
        void addCircles(int addAng)
        {
            int dist = 70, r = 10;
            for (int i = 1; i <= 12; i++)
            {
                Circle cir = new Circle(); cir.dist = dist; cir.angle = i * 30 + addAng; cir.R = r; cir.blueR = r + 6; arr.Add(cir);
            }
        }

        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e){

            myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            gr = Graphics.FromImage(myBitmap);
            gr.SmoothingMode = SmoothingMode.AntiAlias;

            cirBlackPaint = new SolidBrush(Color.Black);
            cirBluePaint = new SolidBrush(Color.FromArgb(102, 204, 255));
            fon = new SolidBrush(Color.FromArgb(102, 204, 255));

            xO = pictureBox1.Width / 2; yO = pictureBox1.Height / 2;
            timer1.Enabled = true;

        }//end ff clic

        private void timer1_Tick(object sender, EventArgs e)
        {
            gr.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);

            //отдалить каждый круг и увеличить радиус
            for (int i = 0; i < arr.Count; i++) { changePos(arr[i]); changeChar(arr[i]); }

            //нарисовать круги
            for (int i = 0; i < arr.Count; i++)
            {
                gr.FillEllipse(cirBlackPaint, (int)arr[i].x + xO, (int)arr[i].y + yO, (int)arr[i].R, (int)arr[i].R);
                gr.FillEllipse(cirBluePaint, (int)arr[i].x + xO, (int)arr[i].y + yO, (int)arr[i].R, (int)arr[i].R);
            }

            //удалить круг, если расстояние от центра координат до центра круга больше 340
            for (int i = 0; i < arr.Count; i++)
                if (arr[i].dist >= 340) arr.Remove(arr[i]);

            //добавить круги в массивы
            if (tmp1 % 81 == 0) addCircles(15);
            if (tmp2 % 81 == 0) addCircles(0);
            tmp1++; tmp2++; if (tmp2 > 1000000000) { tmp1 = 0; tmp2 = 0; }
	    

            pictureBox1.Image = myBitmap;
        }//end ff timer
    }
}
