Язык программирования:
C#
Среда программирования:
Visual Studio 2012 C#
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 partial class Form1 : Form { Bitmap myBitmap; Graphics g; Pen whP = new Pen(Color.White); SolidBrush fon = new SolidBrush(Color.White);//цвет фона SolidBrush bl = new SolidBrush(Color.Black); //цвет черных квадратов SolidBrush wh = new SolidBrush(Color.White); //цвет белых квадратов Rect[] arrR = new Rect[20]; //временные позиции точек(при повороте) Rect[] arrRconst = new Rect[20]; //константные позиции точек int tmp = 0; bool stop = false; // задержка перед следующим поворотом public Form1() { InitializeComponent(); } //событие при нажатии кнопки private void button1_Click(object sender, EventArgs e) { double a = 300; // начальные положения точек квадратов for (int i = 0; i < 16; i++) { if (i % 2 == 0) { a /= 2; arrRconst[i] = new Rect(0, -a, -a, a, -a, a, a, -a, a); arrR[i] = new Rect(0, -a, -a, a, -a, a, a, -a, a); } else { arrRconst[i] = new Rect(1, 0, -a, a, 0, 0, a, -a, 0); //конст массив arrR[i] = new Rect(1, 0, -a, a, 0, 0, a, -a, 0); // временный } } timer1.Enabled = true; }//end ff clic private void draw() // функция рисования { myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);//создаем битмап g = Graphics.FromImage(myBitmap);//и графику g.SmoothingMode = SmoothingMode.AntiAlias; // сглаживание краев g.FillRectangle(fon, 0, 0, 400, 400);//заливаем фон //смещаем начало координат в центр g.TranslateTransform((float)pictureBox1.Width / 2, (float)pictureBox1.Height / 2); Point[] points= { //координаты первого квадрата new Point((int)arrR[0].x1, (int)arrR[0].y1), new Point((int)arrR[0].x2, (int)arrR[0].y2), new Point((int)arrR[0].x3, (int)arrR[0].y3), new Point((int)arrR[0].x4, (int)arrR[0].y4), }; //нарисовать первый квадрат по точкам if (arrR[0].color == 0) g.FillPolygon(bl, points); else g.FillPolygon(wh, points); double a = 2; //на сколько изменить позицию точки, они движутся по прямым for (int i = 1; i < 16; i++) { if (arrR[1].x1 < arrR[0].x2) //фигура делает поворот { if (i % 2 != 0) { arrR[i].x1 += a; arrR[i].y2 += a; arrR[i].x3 -= a; arrR[i].y4 -= a; } else { a /= 2; arrR[i].x1 += a; arrR[i].y1 -= a; arrR[i].x2 += a; arrR[i].y2 += a; arrR[i].x3 -= a; arrR[i].y3 += a; arrR[i].x4 -= a; arrR[i].y4 -= a; } } else //фигура повернулась на 45 градусов { stop = true; if (arrR[0].color == 0) g.DrawPolygon(whP, points); } Point[] points1 = { //отобразить текущий квадрат new Point((int)arrR[i].x1, (int)arrR[i].y1), new Point((int)arrR[i].x2, (int)arrR[i].y2), new Point((int)arrR[i].x3, (int)arrR[i].y3), new Point((int)arrR[i].x4, (int)arrR[i].y4), }; if(arrR[i].color == 0) g.FillPolygon(bl, points1); else g.FillPolygon(wh, points1); } if (stop == true) // если фигура сделала поворот { if (tmp < 30) tmp++; // задержка else { tmp = 0; stop = false; //присвоить временному массиву значения(позиции точек) конст массива //это нужно тк класс Rect(объявлен ниже) хранит точки типа double => появляется погрешность в вычислениях for (int i = 0; i < 16; i++) { arrR[i].x1 = arrRconst[i].x1; arrR[i].x2 = arrRconst[i].x2; arrR[i].x3 = arrRconst[i].x3; arrR[i].x4 = arrRconst[i].x4; arrR[i].y1 = arrRconst[i].y1; arrR[i].y2 = arrRconst[i].y2; arrR[i].y3 = arrRconst[i].y3; arrR[i].y4 = arrRconst[i].y4; arrR[i].color = 1 - arrR[i].color; //сменить цвет квадрата на противоположный } } } pictureBox1.BackgroundImage = myBitmap;//отображаем Bitmap на pictureBox }//end ff draw private void timer1_Tick(object sender, EventArgs e) { draw(); //вызов функции рисования }//end ff timer }//end class Form //класс для хранения точек квадрата и "цвета" квадрата(если color = 0 => цвет черный, 1 - белый) public class Rect { public double x1, y1, x2, y2, x3, y3, x4, y4; public int color; public Rect(int color, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { this.x1 = x1; this.y1 = y1; this.x2= x2; this.y2 = y2; this.x3= x3; this.y3 = y3; this.x4 = x4; this.y4 = y4; this.color = color; } }//end class Rect }//end WindowsFormsApplication1
Прикрепленный файл | Размер |
---|---|
WindowsFormsApplication.rar | 86.05 кб |