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

Вход на сайт

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

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

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

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

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

Рейтинг@Mail.ru Яндекс.Метрика
Язык программирования: 
C#
Среда программирования: 
Microsoft Visual Studio 2013

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 demoscene2
{
    public partial class Form1 : Form
    {
        private Bitmap bitmap;                                   //создаем битмэп
        private Graphics graphix;                                //создаем графику
        SolidBrush background = new SolidBrush(Color.Tomato);    //создаем кисть для фона...
        SolidBrush fill1 = new SolidBrush(Color.Black);  //... для первой стороны куба
        SolidBrush fill2 = new SolidBrush(Color.Goldenrod);      //... для второй стороны куба
        SolidBrush fill3 = new SolidBrush(Color.Gold);           //... для третьей стороны куба
        float x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;    //эти переменные являются точками, 
                                                                 //по которым будут строится стороны куба       
        float parameter1, parameter2, parameter3;                //"parameter" - это значение, на которое будет 
                                                                 //изменяться положение стороны куба
                                                                 //1, 2, 3 - первая, второя и третья стороны куба
                                                                 //соответственно
        int step;                                                //"step" - переменная цикла
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();                                      
        }
 
        private void sides()        //функция рисования сторон куба
        {
            bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);     //инициализируем битмэп 
            graphix = Graphics.FromImage(bitmap);                           //инициализируем графику
            graphix.FillRectangle(background, 0, 0, pictureBox1.Width, pictureBox1.Height); //закрашиваем фон
            graphix.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;       //растеризация граней куба
 
            //задаем координаты первой стороны куба здесь:
            PointF x1 = new PointF(134, 273-parameter1);
            PointF x2 = new PointF(210, 200-parameter1);
            PointF x3 = new PointF(286, 273-parameter1);
            PointF x4 = new PointF(211, 348-parameter1);
 
            //задаем координаты второй стороны куба здесь:
            PointF y1 = new PointF(134-parameter2, 274-parameter2);
            PointF y2 = new PointF(210-parameter2, 200-parameter2);
            PointF y3 = new PointF(210-parameter2, 75-parameter2);
            PointF y4 = new PointF(134-parameter2, 149-parameter2);
 
            //задаем координаты третьей стороны куба здесь:
            PointF z1 = new PointF(210+parameter3, 75-parameter3);
            PointF z2 = new PointF(286+parameter3, 149-parameter3);
            PointF z3 = new PointF(286+parameter3, 273-parameter3);
            PointF z4 = new PointF(210+parameter3, 200-parameter3);
 
            PointF[] sidebottom = { x1, x2, x3, x4 };       //создаем массив точек для первой стороны...
            graphix.FillPolygon(fill1, sidebottom);         //закрашиваем сторону
 
            PointF[] sideleft = { y1, y2, y3, y4 };         //... для второй
            graphix.FillPolygon(fill2, sideleft);
 
            PointF[] sideright = { z1, z2, z3, z4 };        //... и для третьей
            graphix.FillPolygon(fill3, sideright);                            
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            sides();        //инициализируем функцию рисования сторон куба
 
            step++;
            if (step >= 0)  //первой двигается третья сторона
            {
                parameter3 += (float)-4;
 
                if (step >= 20)     //здесь она останавливается
                {
                    parameter3 -= (float)-4;        
 
                    if (step >= 70)     //тут снова продолжает движение, но в обратную сторону
                    {
                        parameter3 += (float)4;
 
                        if (step >= 89)     //тут она останавливается в последний раз
                        {
                            parameter3 -= (float)4;
 
                            if (step >= 139)    //на этом шаге сторона отрисовывается заново
                                                //чтобы по ней "не прошла" вторая сторона и первая 
                            {
                                PointF z1 = new PointF(210 + parameter3, 75 - parameter3);
                                PointF z2 = new PointF(286 + parameter3, 149 - parameter3);
                                PointF z3 = new PointF(286 + parameter3, 273 - parameter3);
                                PointF z4 = new PointF(210 + parameter3, 200 - parameter3);
 
                                PointF[] sideright = { z1, z2, z3, z4 };
                                graphix.FillPolygon(fill3, sideright);
                            }
                        }
                    }                    
                }
            }
 
            if (step >= 20)     //движение стороны стартует сразу после остановки третьей
            {
                parameter2 += (float)-4;
 
                if (step >= 39) //движение прекращается, и сторона отрисовывается снова
                {
                    parameter2 -= (float)-4;
 
                    PointF y1 = new PointF(134 - parameter2, 273 - parameter2);
                    PointF y2 = new PointF(210 - parameter2, 200 - parameter2);
                    PointF y3 = new PointF(210 - parameter2, 75 - parameter2);
                    PointF y4 = new PointF(134 - parameter2, 149 - parameter2);
 
                    PointF[] sideleft = { y1, y2, y3, y4 };
                    graphix.FillPolygon(fill2, sideleft);
 
                    if (step >= 89) //сторона продолжает свое движение, но в обратную сторону
                    {
                        parameter2 -= (float)-4;
 
                        if (step >= 108)    //сторона останавливается
                        {
                            parameter2 += (float)-4;
                        }
                    }
                }
            }
 
            if (step >= 39)           //сторона начинает свое движение сразу после остановки второй
            {
                parameter1 += (float)4;
 
                if (step >= 70)         //сторона останавливается и прорисовывается снова
                {
                    parameter1 -= (float)4;
                    PointF x1 = new PointF(134, 273 - parameter1);
                    PointF x2 = new PointF(210, 200 - parameter1);
                    PointF x3 = new PointF(286, 273 - parameter1);
                    PointF x4 = new PointF(211, 348 - parameter1);
 
                    PointF[] sidebottom = { x1, x2, x3, x4 };
                    graphix.FillPolygon(fill1, sidebottom);
 
                    if (step >= 108)            //сторона продолжает свое движение, но в обратную сторону
                    {
                        parameter1 -= (float)4;
 
                        if (step >= 139)            //она останавливается
                        {
                            parameter1 += (float)4;
                        }  
                    }                          
                }
 
                if(step == 139)         //это последний шаг анимации. здесь обнуляются все счетчики
                                        //и анимация начинается снова
                {
                    parameter1 = 0;
                    parameter2 = 0;
                    parameter3 = 0;
                    step = 0;
                }
            }            
 
            pictureBox1.BackgroundImage = bitmap;       //отображение битмэпа на pictureBox1
        }
    }
}

Прикрепленный файлРазмер
zakharov_demoscene2.zip55.52 кб