Вы находитесь на странице: 1из 8

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Національний аерокосмічний університет ім. М.Є. Жуковського


“Харківський авіаційний інститут”

Факультет програмної інженерії та бізнесу

Кафедра інженерії програмного забезпечення

ЛАБОРАТОРНА РОБОТА 3
з курсу «Компьютерная графика с OpenGL»

на тему: «ГРАФИК ФУНКЦИИ ОДНОЙ ПЕРЕМЕННОЙ»

Виконав: студент 3 курсу групи № 632п


напряму підготовки (спеціальності)
121 «Інженерія програмного забезпечення»
(шифр і назва напряму підготовки (спеціальності))
Тука Я.Л.
(прізвище й ініціали студента)
Прийняв: доц. Лучшев П.О.
(посада, науковий ступінь, прізвище й ініціали)
Національна шкала:
Кількість балів:
Оцінка ECTS:
2

Харків – 2019
10 вариант
ЦЕЛЬ РАБОТЫ: изучить основные понятия и принципы преобразования
координат для построения двухмерного графика.
ЗАДАНИЕ

Используя инструментальные средства, указанные преподавателем,


разработать программу для построения графика функции вида на
произвольном интервале от X min до X max и отображения точек пересечения
функции с осью абсцисс. Кроме этого, программа должна иметь такие
возможности :
⎯  позволять пользователю задавать интервал от X min до X max с
проверкой X min < X max ;
⎯  выполнять для заданного пользователем интервала от X min до X max
автоматическое масштабирование по оси Y (дополнительно допускается
наличие ручного режима установки Y min и Y max );
⎯  отображать оси координат (и/или координатную сетку) с выводом
значений границ видимой области X min , X max , Y min и Y max , при
этом система координат должна быть анизотропной;
⎯  отображать все точки, где , если они есть на заданном интервале от X
min до X max .
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Определение. Функция F(X) представляет собой правило, которое
позволяет каждому значению х∈Х поставить в соответствие
единственное значение Y = F(X)∈У, где х – независимая
переменная (аргумент), Y – зависимая переменная
(значение функции). Говорят, что функция F имеет Область
определения D(F)=X и Область значений R(F)⊆Y.
Непрерывные функции обладают следующими свойствами:
∙ сумма или произведение непрерывных функций
является непрерывной функцией;
∙ отношение двух непрерывных функций является
функцией непрерывной во всех точках, в которых
знаменатель отношения не обращается в нуль.
После того, как пользователь в режиме диалога определил интервал по оси X,
следует задать количество точек N, необходимых для построения графика
функции. Это количество может быть задано пользователем явно или получено
3

программно, например, соответствовать ширине (количеству пикселей)


рабочей области. На основании этой информации вычисляется шаг аргумента
функции: и рассчитываются координаты точек функции в пределах заданного
пользователем интервала. Таким образом, зная значения границ интервала по
оси X и вычислив значения границ по оси Y, можно установить систему
координат (с помощью команды glOrtho(...)) для вывода графика на экран.
Найти корни функции (точки, где ) можно на основе следующего свойства: если
на интервале от до есть пересечение с осью абсцисс, то в результате
произведения соответствующих ординат будет выполняться условие (рис. 3.3).
В этом случае координаты точки пересечения функции с осью X вычисляют
упрощенным методом половинного деления: , . Если учитывать дискретность
экрана и использовать для построения графика функции количество точек,
которое близко к значению ширины рабочей области (в пикселях) или
превосходит её, то упрощенный метод половинного деления позволяет
получить решение, визуально неотличимое от точного.
ЛИСТИНГ ПРОГРАММЫ С РЕАЛИЗАЦИЕЙ ПОСТАВЛЕННОЙ ЗАДАЧИ
MainForm.cs
using System;
using System.Windows.Forms;

namespace glWinForm4
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
this.renderControl1.min = (double)this.xminUpDown.Value;
this.renderControl1.max = (double)this.xmaxUpDown.Value;
this.renderControl1.nPoints = (int)this.pointsUpDown.Value;
}

private void XminUpDown_ValueChanged(object sender, System.EventArgs e)


{
this.renderControl1.min = (double)this.xminUpDown.Value;
}

private void XmaxUpDown_ValueChanged(object sender, System.EventArgs e)


{
this.renderControl1.max = (double)this.xmaxUpDown.Value;
}

private void PointsUpDown_ValueChanged(object sender, System.EventArgs


e)
{
this.renderControl1.nPoints = (int)this.pointsUpDown.Value;
}

private void MainForm_Load(object sender, EventArgs e)


{
4

private void PointInGrap_Tick(object sender, EventArgs e)


{

}
}
}
RenderControl.cs
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace glWinForm4
{
[ToolboxItem(true), ToolboxBitmap(typeof(RenderControl),
"RenderControl.bmp")]
public partial class RenderControl : OpenGL
{
private double xmax = 1;
private double xmin = 1;
private double ymin = -30;
private double ymax = 30;
private int points = 100;
private float WinWid = 60.0F;
private float WinHei = 60.0F;
private float devX;
private float devY;
double ScreenW, ScreenH;

private double[,] 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 double max


{
get
{
return this.xmax;
}
set
{
this.xmax = value;
this.Invalidate();
}
}

public double min


{
get
{
5

return this.xmin;
}
set
{
this.xmin = value;
this.Invalidate();
}
}

public int nPoints


{
get
{
return this.points;
}
set
{
this.points = value;
this.Invalidate();
}
}

public RenderControl() : base(false)


{
InitializeComponent();
}

public override void OnStartingOpenGL()


{
glClearColor(BackColor);
}

public override void OnFinishingOpenGL()


{
}

private void RenderControl_MouseMove(object sender, MouseEventArgs e)


{
Mcoord_X = e.X; Mcoord_Y = e.Y;
lineX = devX * e.X;
lineY = (float)(ScreenH - devY * e.Y);

public override void OnRender()


{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);
glLoadIdentity();
glClearColor(Color.White);
glClear(GL_COLOR_BUFFER_BIT);

functionCalculation();
glViewport(0, 0, Width, Height);
gluOrtho2D(xmin, xmax, ymin, ymax);
glColor(Color.Black);
glBegin(GL_LINES);
6

glVertex2d(0, ymin);
glVertex2d(0, ymax);
glVertex2d(xmin, 0);
glVertex2d(xmax, 0);
glEnd();
DrawDiagram();
return;

glColor(Color.Gray);
glLineWidth(0.1F);

glBegin(GL_LINES);

for (double ax = -15; ax < 15; ax += 1.0)


{
for (double bx = -15; bx < 15; bx += 1.0)
{
glVertex2d(ax + 1.0, WinHei);
glVertex2d(ax + 1.0, -WinHei);
glVertex2d(WinWid, -bx + 1.0);
glVertex2d(-WinWid, -bx + 1.0);
}
}

glEnd();

devX = (float)ScreenW / (float)Width;


devY = (float)ScreenH / (float)Height;

glMatrixMode(GL_MODELVIEW);

functionCalculation();
DrawDiagram();
Draw();

private void functionCalculation() {

double y,x ;
GrapValuesArray = new double[nPoints, 2];
elements_count = 0;
double h = (xmax - xmin) / points;
double min;
double max;
min = max = (double)Math.Cos(xmin) /
((double)Math.Sqrt((double)Math.Sin(3 * xmin) + 1.01));
for (int i = 0; i< nPoints; i++)
{
x = xmin + i * h;
y = f(x);
GrapValuesArray[i, 0] = x;
GrapValuesArray[i, 1] = y;
if (min < y)
min = y;
if (max > y)
max = y;
}
7

ymin = min;
ymax = max;

glColor(Color.Red);
glPointSize(5);
glBegin(GL_POINTS);
for (int i = 1; i< nPoints-1; i ++) {
if( GrapValuesArray[i,1] * GrapValuesArray[i+1, 1]<=0){
double x0 =( GrapValuesArray[i, 0] + GrapValuesArray[i + 1,
0])/2;
double y0 =f(x0);
glVertex2d(x0, y0);
}
}
glEnd();

not_calculate = false;

private static double f(double x)


{
return (double)Math.Cos(x) / ((double)Math.Sqrt((double)Math.Sin(3 *
x) + 1.01));
}

private void DrawDiagram() {

functionCalculation();
glBegin(GL_LINE_STRIP);;
for(int i = 0; i< nPoints; i++)
{
glVertex2d(GrapValuesArray[i, 0], GrapValuesArray[i, 1]);
}
glEnd();
}

private void Draw()


{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glTranslated(15, 15, 0);

glColor(Color.Black);
glLineWidth(1.5F);
glBegin(GL_LINES);
glVertex2d(0, -15);
glVertex2d(0, 15);
glVertex2d(xmin, 0);
glVertex2d(xmax, 0);
glVertex2d(0, 15);
glVertex2d(0.1, 14.5);
glVertex2d(0, 15);
glVertex2d(-0.1, 14.5);
glVertex2d(15, 0);
glVertex2d(14.5, 0.1);
glVertex2d(15, 0);
8

glVertex2d(14.5, -0.1);
glEnd();
DrawDiagram();
glPopMatrix();
glColor3f(255, 0, 0);
glBegin(GL_LINES);
glVertex2d(lineX, 15);
glVertex2d(lineX, lineY);
glVertex2d(15, lineY);
glVertex2d(lineX, lineY);
glEnd();
glFlush();
Invalidate();
}
private void PointInGrap_Tick(object sender, EventArgs e)
{
if (pointPosition == elements_count - 1) pointPosition = 0;
Draw();
pointPosition++;

}
}
}
КОПИЯ ЭКРАНА РАБОТАЮЩЕЙ ПРОГРАММЫ

 ТАБЛИЦА
СИСТЕМЫ ОЦЕНКИ С УКАЗАНИЕМ ВЫПОЛНЕННЫХ ЗАДАЧ 
№ Сложность Требования Баллы
1 Базовый Оси координат и график функции f 1 (x) выводятся 1
уровень на заданном пользователем интервале от X min
до X max и от Y min  до Y max
2 Автоматическое вычисление Y min и Y max на 2
заданном интервале от X min  до X max функции f 1
(x)
3 Расчет и вывод на экран точек f 1 (x) = 0 2
ВЫВОД: В данной лабораторной работе изучил основные понятия и принципы
преобразования координат для построения двухмерного графика.

Оценить