МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторної роботи №3
з курсу «Програмування комп’ютерної графіки»
на тему: «Побудова графіків функцій засобами мови С#»
Мета роботи.
Набути практичних навиків в складанні програм для побудови графіків функцій за допомогою засобів мови С#.
ЗАВДАННЯ
Ознайомитися з методами побудови графіків функцій на екрані монітора комп’ютера.
Вивчити основні процедури мови С# для виведення тексту в графічному режимі.
Написати програму, яка будує в середині екрану систему координат XY і на ній графік функції Y=F(X), використовуючи графічні оператори мови С#, якщо аргумент або параметр змінюється на проміжку [a;b] з кроком h.
N%
Функція
Інтервал
Крок
4
x=[0;180]
h=0.5
Текст програми
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 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;
float lineX, lineY;
float Mcoord_X = 0, Mcoord_Y = 0;
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
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, AnT.Width, AnT.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
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();
}
private void PointInGrap_Tick(object sender, EventArgs e)
{
if (pointPosition == elements_count - 1)
pointPosition = 0; // переходимкначальномуэлементу
Draw();
pointPosition++;
}
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)
{
Gl.glRasterPos2f(x, y);
foreach (char char_for_draw in text)
{
GLUT_BITMAP_9_BY_15.
Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_9_BY_15, char_for_draw);
}
}
private void functionCalculation()
{
float x = 0, y = 0;
GrapValuesArray = new float[400, 2];
elements_count = 0;
for (x = 0; x < 180; x += 0.5f)
{
y = 20 * ((float)Math.Sin(x / 5) + (float)Math.Cos(2 * x));
GrapValuesArray[elements_count, 0] = x;
GrapValuesArray[elements_count, 1] = 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)
{
Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
}
Gl.glEnd();
Gl.glPointSize(5);
Gl.glColor3f(255, 0, 0);
Gl.glBegin(Gl.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);
Gl.glBegin(Gl.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();
}
}
}с
Результати виконання програми
/
Висновок
На цій лабораторній роботі я набув практичних навиків в складанні програм для побудови графіків функцій за допомогою засобів мови С#.