МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра Захист інформації
З В І Т
До лабораторної роботи №3
з курсу:
„ Програмування комп’ютерної графіки ”
на тему:
„ Побудова графіків функцій засобами мови С# ”
Львів – 2012
Мета роботи : набути практичних навиків в складанні програм для побудови графіків функцій за допомогою засобів мови С#.
Завдання:
Ознайомитися з методами побудови графіків функцій на екрані монітора комп’ютера.
Вивчити основні процедури мови С# для виведення тексту в графічному режимі.
Написати програму, яка будує в середині екрану систему координат XY і на ній графік функції Y=F(X), використовуючи графічні оператори мови С#, якщо аргумент або параметр змінюється на проміжку [a;b] з кроком h.
N%
Функція
Інтервал
Крок
18
x=[1;20]
h=0.01
Текст програми:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;
namespace Лабораторна3
{
public partial class Form1 : Form
{
double ScreenW, ScreenH; // розміри вікна
private float devX;
private float devY;
private float[,] GrapValuesArray; // масив, котрий буде зберігати значенняx,y точок графіка
private int elements_count = 0; // кількість елементів в масиві
// прапорець, що означає, що масив із значеннями координат графіка поки що не заповнений
private bool not_calculate = true;
/* номер комірки масиву, з якого будуть узяті координати для червоної крапки
для візуалізації текучого кадра*/
private int pointPosition = 0;
float lineX, lineY; // допоміжні змінні для побудови ліній від курсора миші до координатних осей
float Mcoord_X = 0, Mcoord_Y = 0; // теперішні координати курсора миші
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
// функція обробник події таймера
private void Pointingrap_Tick(object sender, EventArgs e)
{
if (pointPosition == elements_count - 1)
pointPosition = 0; // переходимо до початкового елемента
Draw();
pointPosition++;
}
private void Form1_Load(object sender, EventArgs e)
{// ініціалізація бібліотеки glut
Glut.glutInit();
// ініціалізація режиму екрану
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
// установка кольору очищення екрану (RGBA)
Gl.glClearColor(255, 255, 255, 1);
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
// активація проекційної матриці
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
// визначення параметрів настройки проекції, залежно від розмірів сторінелементаOnGl.
if ((float)AnT.Width <= (float)AnT.Height)
{
ScreenW = 30.0;
ScreenH = 30.0 * (float)AnT.Height / (float)AnT.Width;
Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
}
else
{
ScreenW = 30.0 * (float)AnT.Width / (float)AnT.Height;
ScreenH = 30.0;
Glu.gluOrtho2D(10.0, 80.0 * (float)AnT.Width / (float)AnT.Height, -25.0, 55.0);
}
devX = (float)ScreenW / (float)AnT.Width;
devY = (float)ScreenH / (float)AnT.Height;
// установка об'єктно-видової матриці
Gl.glMatrixMode(Gl.GL_MODELVIEW);
// старт лічильника, що відповідає за старт функції візуалізації сцени
Pointingrap.Start();
}
// обробка руху миші над елементомOnGl
private void AnT_MouseMove(object sender, MouseEventArgs e)
{
Mcoord_X = e.X; // зберігаємо координат миші
Mcoord_Y = e.Y;
// обчислюємо параметри для майбутнього домальовування ліній від покажчика миші до координатних осей.
lineX = devX * e.X;
lineY = (float)(ScreenH - devY * e.Y);
}
private void PrintText2D(float x, float y, string text)
{// встановлюємо позицію виведення растрових символів
// у переданих координатах x і у.
Gl.glRasterPos2f(x, y);
foreach (char char_for_draw in text) // перебираємо значення з масиву text,який містить значення рядка для візуалізації
{
Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_9_BY_15, char_for_draw);
}
}
private void functionCalculation()
{
float x = 0, y = 0;
GrapValuesArray = new float[200, 2]; // ініціалізація масиву, який зберігатиме значення 200 точок
elements_count = 0; // лічильник елементів масиву
for (x = 1; x < 20; x += 0.1f)
{
y = 16 * (float)Math.Pow(x, 3) + (float)Math.Pow(((float)Math.Pow(x,2)-1),0.25);
GrapValuesArray[elements_count, 0] = x; // запис координати x
GrapValuesArray[elements_count, 1] = y; // запис координати y
elements_count++; // підрахунок елементів
}
not_calculate = false; // змінюємо прапор, що сигналізує про те, що координати графіка не розраховані
}
private void DrawDiagram()
{// перевірка прапора, що сигналізує про те, що координати графіка обчислені
if (not_calculate)
{
functionCalculation();
}
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]); // малюємо початкову точку
// проходимо по масиву з координатами обчислених точок
for (int ax = 1; ax < elements_count; ax += 2)
{// передаємо в OPENGL інформацію про вершину, що бере участь в побудові ліній
Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
}
Gl.glEnd(); // завершуємо режим малювання
Gl.glPointSize(5); // встановлюємо розмір крапок, рівний 5 пікселям
Gl.glColor3f(255, 0, 0); // встановлюємо поточним кольором - червоний колір
Gl.glBegin(Gl.GL_POINTS); // активуємо режим виведення точок (GL_POINTS)
// виводимо червону крапку, використовуючи ту ячеку масиву, до якої ми дійшли
Gl.glVertex2d(GrapValuesArray[pointPosition, 0], GrapValuesArray[pointPosition, 1]);
Gl.glEnd();
Gl.glPointSize(1); // встановлюємо розмір крапок рівний одиниці
}
private void Draw()
{ // очищення буфера кольору і буфера глибини
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity(); // очищення поточної матриці
Gl.glColor3f(0, 0, 0);
Gl.glPushMatrix(); // поміщаємо стан матриці в стек матриць
Gl.glTranslated(15, 15, 0); // виконуємо переміщення в прострорі по осях X і Y
Gl.glBegin(Gl.GL_POINTS); // активуємо режим малювання (Вказані далі точки виводитимуться як точки GL_POINTS)
// за допомогою проходу двох циклів, створюємо сітку з крапок
for (int ax = -15; ax < 80; ax++)
{
for (int bx = -45; bx < 60; bx++)
{
Gl.glVertex2d(ax, bx); // вивід точки
}
}
Gl.glEnd();
Gl.glBegin(Gl.GL_LINES);
//малюємо координатні осі і стрілки на їх кінцях
Gl.glVertex2d(0, -15);
Gl.glVertex2d(0, 15);
Gl.glVertex2d(-15, 0);
Gl.glVertex2d(15, 0);
// вертикальна стрілка
Gl.glVertex2d(0, 15);
Gl.glVertex2d(0.1, 14.5);
Gl.glVertex2d(0, 15);
Gl.glVertex2d(-0.1, 14.5);
Gl.glVertex2d(15, 0);
// горизонтальна стрілка
Gl.glVertex2d(14.5, 0.1);
Gl.glVertex2d(15, 0);
Gl.glVertex2d(14.5, -0.1);
Gl.glEnd();
PrintText2D(15.5f, 0, "x");
PrintText2D(0.5f, 14.5f, "y");
DrawDiagram();
Gl.glPopMatrix();
// виводимо текст із значенням координат біля курсора
PrintText2D(devX * Mcoord_X + 0.2f, (float)ScreenH - devY * Mcoord_Y + 0.4f, "[ x: " + (devX * Mcoord_X - 15).ToString() + " ; y: " + ((float)ScreenH - devY * Mcoord_Y - 15).ToString() + "]");
Gl.glColor3f(255, 0, 0); // встановлюємо червоний колір
Gl.glBegin(Gl.GL_LINES);
Gl.glVertex2d(lineX, 15);
Gl.glVertex2d(lineX, lineY);
Gl.glVertex2d(15, lineY);
Gl.glVertex2d(lineX, lineY);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
}
}
Результат виконання програми
/
Висновок
На цій лабораторній роботі я набув практичних навиків в складанні програм для побудови графіків функцій за допомогою засобів мови С#.