МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
«ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра ЗІ
З В І Т
До лабораторної роботи №5
з курсу:«Програмування комп’ютерної графіки»
на тему: «Параметрична побудова графіків в залежності від осьової приналежності, шрифтів та типу лінії на екрані комп’ютера»
Варіант №9
Мета роботи: набути практичних навиків в складанні програм для побудови зображень в залежності від заданого типу осі,шрифту,кольору і типу лінії на екрані комп’ютера за допомогою засобів мови С# та бібліотеки OpenGL.
Завдання:
Побудувати графік функції (таблиця 1), заданої таблично. Графік повинен відображати результати розрахунків, які записані у файлі на диску. Масштаб розмітки осей координат графіка повинен відповідати реальним результатам розрахунків. Параметри для побудови графіка визначені в таблиці 2. Варіант завдання визначає викладач.
Необхідно передбачити “плаваючий” центр координат – основну частину екрану мають займати ті чверті, в яких знаходиться графік функції.
9
y=arctg(x)
[-50; 50]
№ варіанту
Тип лінії для побудови кривої графіка
Товщина лінії (пікселів)
Колір лінії
Шрифт розмітки осей графіка
9
4
Cyan
Small
Текст програми:
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;
using Tao.FreeGlut;
using Tao.OpenGl;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
double ScreenW, ScreenH;
private float devX;
private float devY;
private float[,] GrapValuesArray;
private int elements_count = 0;
private bool not_calculate = true;
private int pointPosition = 0;
public Form1()
{
InitializeComponent();
OnGl.InitializeContexts();
}
private void OnGl_Load(object sender, EventArgs e)
{
}
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.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
Gl.glClearColor(255, 255, 255, 1);
Gl.glViewport(0, 0, OnGl.Width, OnGl.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
if ((float)OnGl.Width <= (float)OnGl.Height)
{
ScreenW = OnGl.Width;
ScreenH = OnGl.Width * (float)OnGl.Height / (float)OnGl.Width;
Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
}
else
{
ScreenW = OnGl.Height * (float)OnGl.Width / (float)OnGl.Height;
ScreenH = OnGl.Height;
Glu.gluOrtho2D(0.0, OnGl.Width * (float)OnGl.Width / (float)OnGl.Height, 0.0, OnGl.Height);
}
devX = (float)ScreenW / (float)OnGl.Width;
devY = (float)ScreenH / (float)OnGl.Height;
Gl.glMatrixMode(Gl.GL_MODELVIEW);
PointInGrap.Start();
}
private void PrintText2D(float x, float y, string text)
{
Gl.glRasterPos2f(x, y);
foreach (char char_for_draw in text)
{
Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_HELVETICA_12, char_for_draw);
}
}
private void functionCalculation()
{
float x = 0, y = 0;
GrapValuesArray = new float[30000, 2];
elements_count = 0;
for (x = -500; x <= 500; x += 1.0f)
{
y = (float)Math.Abs(Math.Pow(x, 3));
GrapValuesArray[elements_count, 0] = x;
GrapValuesArray[elements_count, 1] = y;
elements_count++;
}
not_calculate = false;
}
private void DrawDiagram()
{
if (not_calculate)
{
functionCalculation();
}
Gl.glColor3f(0.0f, 1.0f, 1.0f);
Gl.glEnable(Gl.GL_LINE_STIPPLE);
Gl.glLineWidth(4);
Gl.glLineStipple(5, 0x1C47);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glEnable(Gl.GL_LINE_STIPPLE);
Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]);
for (int ax = 1; ax < elements_count; ax += 2)
{
Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
}
Gl.glEnd();
Gl.glDisable(Gl.GL_LINE_STIPPLE);
}
private void Draw()
{
int Width = OnGl.Width;
int Height = OnGl.Height;
float w = (float)(Width / 2);
float h = (float)(Height / 2);
float hg = (float)(Height - 15);
float wx = (float)(w - 10);
float wd = (float)(Width - 15);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(0, 0, 0);
Gl.glPushMatrix();
Gl.glTranslated(w, 0, 0);
Gl.glLineWidth(2);
Gl.glBegin(Gl.GL_LINES);
Gl.glVertex2d(0, Height);
Gl.glVertex2d(5, hg);
Gl.glVertex2d(0, Height);
Gl.glVertex2d(-5, hg);
Gl.glVertex2d(w, 0);
Gl.glVertex2d(wx, 5);
Gl.glVertex2d(w, 0);
Gl.glVertex2d(wx, -5);
Gl.glVertex2d(0, OnGl.Height);
Gl.glVertex2d(0, -OnGl.Height);
Gl.glVertex2d(-OnGl.Width, 0);
Gl.glVertex2d(OnGl.Width, 0);
Gl.glEnd();
PrintText2D(wx, 10f, "x");
PrintText2D(10f, hg, "z");
Gl.glScalef(1.0f, 0.5f, 0.0f);
DrawDiagram();
Gl.glPopMatrix();
Gl.glFlush();
OnGl.Invalidate();
}
}
}
Результат виконання програми
/
Висновок:
Під час виконання цієї лабораторної роботи, я набув практичних навиків в складанні програм для побудови зображень в залежності від заданого типу осі, шрифту, кольору і типу лінії на екрані комп’ютера за допомогою засобів мови С# та бібліотеки OpenGL.