Цель работы
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();
}
}
}
Результаты работы программы
Комментариев нет:
Отправить комментарий