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

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

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

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

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

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

Рейтинг@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 кб