Среда программирования:
Visual studio 2012
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 BlackWhiteCross_demo { public partial class Form1 : Form { Bitmap myBitmap; // объявил буфер для рисования Graphics gr; // объявил объект типа графика cross[] bCrs; // объявил два массива крестов cross[] wCrs; // описание класса cross сразу после объявления всех глобальных переменных Color clW; // переменные для хранения цвета Color clB; int angleB; // переменные для хранения угла поворота черных и белых крестов int angleW; int animC; // переменная для контроля анимации bool firstB, firstW; // класс, который содержит описание рисуемых крестов class cross { SolidBrush sb; //заливка Graphics gr; //графика int x, y; //центры крестов //конструктор класса, который задает центр, заливку и графику public cross(int xx, int yy, SolidBrush sbb, Graphics grr) { sb = sbb; x = xx; y = yy; gr = grr; } //метод для рисования креста, получает угол необходимого поворота public void Draw(int angle) { //задаем полигон-крест, вокруг данного центра Point[] crs = new Point[]{ new Point(x-15, y-15), new Point(x-15, y-45), new Point(x+15, y-45), new Point(x+15, y-15), new Point(x+45, y-15), new Point(x+45, y+15), new Point(x+15, y+15), new Point(x+15, y+45), new Point(x-15, y+45), new Point(x-15, y+15), new Point(x-45, y+15), new Point(x-45, y-15), new Point(x-15, y-15) }; //операцию поворота можно разбить на три группы //1 //перенесли центр координат в центр рисуемого креста и повернули на угол gr.TranslateTransform(x, y); gr.RotateTransform(angle); //2 //перенесли "обратно" центр координат //и прорисовали полигон-крест gr.TranslateTransform(-x, -y); gr.FillPolygon(sb, crs); //3 //теперь снова переносим центр координат в центр креста, для того, //чтобы вернуть исходный угол (т.е. повернуть обратно на противоположный данному) //и в конце опять "обратно" возвращаем центр координат gr.TranslateTransform(x, y); gr.RotateTransform(-angle); gr.TranslateTransform(-x, -y); } }; // ниже приведены две функции рисования крестов //первая для черных крестов, вторая для белых //подробно опишу только первую, //т.к. функции отличаются лишь центрами рисуемых объектов //данная функция принимает один параметр - величину угла поворота public void draw_black(int angle) { SolidBrush black = new SolidBrush(clB); // инициализируем заливку для закраски bCrs = new cross[45]; //создаем пустой массив для хранения рисуемых крестов //далее заполняем созданный массив // для этого используем счетчик переменных //(начинается с двух, так как первые два элемента созданы вручную до цикла) //также используем две переменные для хранения центра очередного креста //и две переменные для хранения смещения следующего креста //для прорисовки каждой линии крестов используется отдельный цикл //(кроме первой линии из двух элементов) bCrs[0] = new cross(-15, 15, black, gr); bCrs[1] = new cross(75, -15, black, gr); int cntB = 2; int x, y; int offX, offY; x = 15; y = 105; offX = 90; offY = -30; for (int j = 0; j < 5; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } x = 45; y = 195; for (int j = 0; j < 6; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } x = -15; y = 315; for (int j = 0; j < 7; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } x = 15; y = 405; for (int j = 0; j < 6; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } x = 45; y = 495; for (int j = 0; j < 6; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } x = 165; y = 555; for (int j = 0; j < 6; j++) { bCrs[cntB] = new cross(x, y, black, gr); x += offX; y += offY; cntB++; } //после того, как заполнили массив вызываем фунцию прорисовки //для каждого элемента данного массив, //в функцию передаем полученную величину углу поворота for (int i = 0; i < cntB; i++) { bCrs[i].Draw(angle); } } //аналогична выше рассмотренной public void draw_white(int angle) { wCrs = new cross[45]; SolidBrush white = new SolidBrush(clW); wCrs[0] = new cross(45, 45, white, gr); wCrs[1] = new cross(135, 15, white, gr); wCrs[2] = new cross(225, -15, white, gr); int x, y; int offX, offY; int cnt = 3; offX = 90; offY = -30; x = -15; y = 165; for (int j = 0; j < 6; j++) { wCrs[cnt] = new cross(x, y, white, gr); cnt++; x += offX; y += offY; } x = 15; y = 255; for (int j = 0; j < 6; j++) { wCrs[cnt] = new cross(x, y, white, gr); cnt++; x += offX; y += offY; } x = 45; y = 345; for (int j = 0; j < 6; j++) { wCrs[cnt] = new cross(x, y, white, gr); cnt++; x += offX; y += offY; } x = -15; y = 465; for (int j = 0; j < 7; j++) { wCrs[cnt] = new cross(x, y, white, gr); cnt++; x += offX; y += offY; } x = 15; y = 555; for (int j = 0; j < 6; j++) { wCrs[cnt] = new cross(x, y, white, gr); cnt++; x += offX; y += offY; } x = 405; y = 525; wCrs[cnt] = new cross(x, y, white, gr); cnt++; x = 495; y = 495; wCrs[cnt] = new cross(x, y, white, gr); cnt++; for (int i = 0; i < cnt; i++){ wCrs[i].Draw(angle); } } public Form1() { InitializeComponent(); } //функция обработки нажатия на кнопку - //осуществляет инициализацию необходимых элементов private void button1_Click(object sender, EventArgs e) { //инициализируем буфер для рисования Bitmap и графику, для рисования в данном буфере myBitmap = new Bitmap(500, 500); gr = Graphics.FromImage(myBitmap); //включаем сглаживание, для более красивой картинки gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //задаем объявленные цвета clW = Color.White; clB = Color.FromArgb(250, 51, 51, 51); //задаем цвет фона и закрашиваем SolidBrush fon = new SolidBrush(clW); gr.FillRectangle(fon, 0, 0, 500, 500); //рисуем черные и белые кресты, но без поворота draw_white(0); draw_black(0); //отображаем картинку из буфера на pictureBox1 pictureBox1.Image = myBitmap; //инициализируем углы вращения angleB = -5; //против часовой черные angleW = 5; //по часовой белые animC = 0; //счетчик анимации на нуле - ещё ничего не рисовали timer1.Enabled = true; //включаем таймер } //обработка тика таймера private void timer1_Tick(object sender, EventArgs e) { //задаем цвета нашего фона (в зависимости от этапа он будет либо черным, либо белым) SolidBrush wFon = new SolidBrush(clW); SolidBrush bFon = new SolidBrush(clB); // если в первом этапе анимации, то if (animC < 18) { //закрашиваем белый фон gr.FillRectangle(wFon, 0, 0, 500, 500); //рисуем черный крест, уже поворачивая их на угол angleB draw_black(angleB); //"увеличиваем" угол поворота angleB -= 5; //переходим в следующему шагу анимации animC++; //прорисовываем изображение с буфера на pictureBox pictureBox1.Image = myBitmap; } //после первого этапа анимации делаем небольшую паузу и.. else if (animC >= 18 && animC < 20) { animC++; } //переходим ко второму этапу (аналогичен первому) else if (animC >= 20 && animC < 38) { //рисуем черный фон gr.FillRectangle(bFon, 0, 0, 500, 500); //рисуем белые кресты, поворачивая их draw_white(angleW); //увеличиваем угол angleW += 5; //следующий шаг анимации animC++; //отображение изображения pictureBox1.Image = myBitmap; } //пауза после второго этапа опять делаем небольшую паузу и... else if (animC >= 38 && animC < 39) { animC++; } //"обнуляем" все переменные, которые нужны для анимации else { animC = 0; //начинаем анимацию с нулевого шага //ставим начальные углы поворота angleB = -5; angleW = 5; } } } }
Прикрепленный файл | Размер |
---|---|
Skopinskiy_BlackWhiteCross_demo.rar | 55.13 кб |