Лабораторная работа по Си шарп OpenGL

Цель работы

Cоздать из массива целых чисел 3D модель (3D Surface plot или 3D histogram) и вывести результат моделирования на экран с использованием OpenGL.

         Лабораторное задание

1. Изучить принципы работы графической библиотеки Open Gl Tao Framework.
2. С помощью данных библиотек в соответствии с заданием разработать программу на языке C#.
3. Данные визуализации являются массивом – размером X разрядов, который генерируется программно с помощью генератора случайных чисел (П) или читается из двоичного файла (Ф) – данные записываются программно в файл, а затем читаются из него функциями BinaryReader и BinaryWriter.
Данные о 3D моделях, которые необходимо создать, разрядности элементов  массива, его размере и способе получения берутся из задания, каждое из которых будет соответствовать одному из вариантов.


Вариант №5:
3D модель - 3D histogram ;
Массив состоит из 64-разрядных элементов;
Размер массива = 256 элементов;
Массив генерируется случайно с помощью генератора случайных чисел.

         Листинг


Файл Form1.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Tao.FreeGlut;
using Tao.OpenGl;
using Tao.Platform;

namespace Лабораторная_по_OpenGl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Viewer.InitializeContexts();
        }

        public static long NextInt64(Random rnd)
        {
            long x = rnd.Next(0, 31);
            return x;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Glut.glutInit();
            // инициализация режима экрана
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

            // установка цвета очистки экрана (RGBA)
            Gl.glClearColor(255, 255, 255, 1);

            // установка порта вывода
            Gl.glViewport(0, 0, Viewer.Width, Viewer.Height);

            // активация проекционной матрицы
            Gl.glMatrixMode( Gl.GL_PROJECTION);
            // очистка матрицы
            Gl.glLoadIdentity();

            // установка перспективы
            Glu.gluPerspective(45, (float)Viewer.Width / (float)Viewer.Height, 0.1, 200);

            Gl.glMatrixMode( Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();

            // начальная настройка параметров openGL (тест глубины)
            Gl.glEnable( Gl.GL_DEPTH_TEST);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            float pred = 0, el=0;
            float x = 0;
            float[] mass = new float[256];
            float[,] coords = new float[5, 4];
            Random rnd = new Random();
            // очистка буфера цвета и буфера глубины
            for (int i = 0; i < 256; i++)
            {
                mass[i]=NextInt64(rnd);
                if ( mass[i] < 0 || mass[i]>30)
                {
                    i--;
                }
            }
            for (int i = 0; i < 256; i++)
            {            // i - номер прохода
                for (int j = 255; j > i; j--)
                {     // внутренний цикл прохода
                    if (mass[j - 1] > mass[j])
                    {
                        x = mass[j - 1]; mass[j - 1] = mass[j]; mass[j] = x;
                    }
                }
            }
            pred = mass[255]+1;
            for (int j = 0; j < 5; j++)
            {
                for (int i = 3; i > -1; i--)
                {
                    for (int k = 0; k < 256; k++)
                    {
                        if (mass[k]<pred)
                        {
                            el = mass[k];
                        }
                    }
                    pred = el;
                    coords[j, i] = el;
                }
            }
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glClearColor(255, 255, 255, 1);
            // очищение текущей матрицы
            Gl.glLoadIdentity();
            Glu.gluLookAt(65.0d, 30.0d, 20.0d, 14.0d , coords[4, 0], 0.0d, 0.0d, 1.0d, 0.0d);
            Gl.glPushMatrix();
            for (int j = 0; j < 5; j++)
            {
                for (int i = 0; i < 4; i++)
                {
                    Gl.glBegin(Gl.GL_QUADS);
                    Gl.glColor3f(0.0f,0.0f, 1.0f);     // Синий
                    Gl.glVertex3f(1.0f, coords[j, i], -1.0f);  // Право верх квадрата (Верх)
                    Gl.glVertex3f(-1.0f, coords[j, i], -1.0f);          // Лево верх
                    Gl.glVertex3f(-1.0f, coords[j, i], 1.0f);          // Лево низ
                    Gl.glVertex3f(1.0f, coords[j, i], 1.0f);          // Право низ
                    Gl.glColor3f(1.0f, 0.5f, 0.0f);              // Оранжевый
                    Gl.glVertex3f(1.0f, 0.0f, 1.0f);          // Верх право квадрата (Низ)
                    Gl.glVertex3f(-1.0f, 0.0f, 1.0f);          // Верх лево
                    Gl.glVertex3f(-1.0f, 0.0f, -1.0f);          // Низ лево
                    Gl.glVertex3f(1.0f, 0.0f, -1.0f);          // Низ право
                    Gl.glColor3f(1.0f, 0.0f, 0.0f);              // Красный
                    Gl.glVertex3f(1.0f, coords[j,i], 1.0f);    // Верх право квадрата (Перед)
                    Gl.glVertex3f(-1.0f, coords[j, i], 1.0f);          // Верх лево
                    Gl.glVertex3f(-1.0f, 0.0f, 1.0f);          // Низ лево
                    Gl.glVertex3f(1.0f, 0.0f, 1.0f);          // Низ право
                    Gl.glColor3f(1.0f, 1.0f, 0.0f);              // Желтый
                    Gl.glVertex3f(1.0f, coords[j, i], -1.0f);   // Верх право квадрата (Зад)
                    Gl.glVertex3f(-1.0f, coords[j, i], -1.0f);    // Верх лево
                    Gl.glVertex3f(-1.0f, 0.0f, -1.0f);          // Низ лево
                    Gl.glVertex3f(1.0f, 0.0f, -1.0f);          // Низ право
                    Gl.glColor3f(0.0f, 0.0f, 1.0f);              // Синий
                    Gl.glVertex3f(-1.0f, coords[j, i], 1.0f);   // Верх право квадрата (Лево)
                    Gl.glVertex3f(-1.0f, coords[j, i], -1.0f);       // Верх лево
                    Gl.glVertex3f(-1.0f, 0.0f, -1.0f);          // Низ лево
                    Gl.glVertex3f(-1.0f, 0.0f, 1.0f);          // Низ право
                    Gl.glColor3f(1.0f, 0.0f, 1.0f);              // Фиолетовый
                    Gl.glVertex3f(1.0f, coords[j, i], -1.0f);  // Верх право квадрата (Право)
                    Gl.glVertex3f(1.0f, coords[j, i], 1.0f);        // Верх лево
                    Gl.glVertex3f(1.0f, 0.0f, 1.0f);         // Низ лево
                    Gl.glVertex3f(1.0f, 0.0f, -1.0f);        // Низ право
                    Gl.glEnd();
                    Gl.glTranslatef(0.0f, 0.0f, -4.0f);
                }
                Gl.glTranslatef(3.0f, 0.0f, 16.0f);
            }
            // возвращаем состояние матрицы
            Gl.glPopMatrix();
            // завершаем рисование
            Gl.glFlush();
            // обновляем элемент AnT
            Viewer.Invalidate();
        }
    }
}
Результаты работы программы

Комментариев нет:

Отправить комментарий