Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Не работает, выводит это: Process terminated with status 4258096 (0 minute(s), 2 second(s)) при этом открывается консоль с тем же числом
А как можно добавить сюда глубину рекурсии, то есть сложность линии?

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
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.rar55.13 кб