МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ПОБУДОВА ГРАФІКІВ ФУНКЦІЙ В СЕРЕДОВИЩІ MICROSOFT VISUAL STUDIO C++ 2008
Звіт
до лабораторної роботи № 3 з курсу «Програмування комп’ютерної графіки»
Варіант №10
Львів-2016
Завдання:
Написати програму, яка будує в середині екрану систему координат XY і на ній будує графік функції y=f(x), якщо аргумент або параметр змінюється на проміжку [a,b] з кроком h.
№
Функція
Інтервал
Крок
Блок-схема програми:
Функції:
1) Kx, ky - коефіцієнти перетворення.
2) CPoint MoveTo(int x, int y)- переміщує поточну вершину. x,y визначають координати нової поточної вершини. Повертає x- та y-координати попередньої поточної вершини як CPoint об'єкт.
3) BOOL LineTo(int x, int y)-малює лінію з поточної вершини до вершини з координатами x, y. Поточна вершина переміщується у вершину з коордиатами x, y. При успішному виконанні функції повертає TRUE, інакше FALSE.
4) BOOL TextOut(int x, int y, const Cstring& str)- виводить стрічку на екран. х,y задають координати початкової вершини виведення тексту. Str об'єкт типу Cstring, який містить текст для виведення. При успішному виконанні функція повертає TRUE, інакше FALSE.
Остаточна версія програми:
#include "stdafx.h"
#include "pkh20.h"
#include "ChildView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this);
double kx, ky, kx1, ky1, x0, y0, x01, y01, x, y, lx, ly, str, sx, sy, xc, yc, xc1, yc1, tx, ty, xx, yy, t, z;
double xmax = 0, xmin = 0, ymax = 0, ymin = 0, txp = 0, txm = 0, typ = 0, tym = 0;
double x1 = -100, x2 = 100, h = 0.5;
RECT rect;
GetClientRect(&rect);
//визначення xmax,xmin,ymax,ymin
for (x = x1; x <= x2; x = x + h)
{
y = 30 * cos(2 * x)*pow(sin(2 * x),1/2);
if (ymin>-y)
{
ymin = -y;
}
else if (ymax<-y)
{
ymax = -y;
}
if (xmin>x)
{
xmin = x;
}
else if (xmax<x)
{
xmax = x;
}
}
//знаходження значення функціїв точці x=0
x = 0;
y = 30 * cos(2 * x)*pow(sin(2 * x), 1 / 2);
//знаходження коефіцієнтів і центра реальних координат
kx = (rect.right - 50) / (xmax - xmin);
ky = (rect.bottom - 50) / (ymax - ymin);
x0 = xmin*kx - 25;
y0 = ymin*ky - 25;
xc = x*kx - x0;
yc = -y*ky - y0;
//побудова осей
dc.MoveTo(xc, rect.top + 10);
dc.LineTo(xc, rect.bottom - 10);
dc.MoveTo(rect.left + 10, yc);
dc.LineTo(rect.right - 10, yc);
dc.MoveTo(xc - 5, rect.top + 15);
dc.LineTo(xc, rect.top + 10);
dc.LineTo(xc + 5, rect.top + 15);
dc.MoveTo(rect.right - 15, yc - 5);
dc.LineTo(rect.right - 10, yc);
dc.LineTo(rect.right - 15, yc + 5);
//позначення осей
const CString Y("Y"), X("X"), O("0"), P ("1"), Q ("2"), W ("3") , E ("4"), R ("-1"), L ("-2"), K ("-3"), H ("-4") ;
dc.TextOutW(xc - 20, rect.top + 5, Y);
dc.TextOutW(rect.right - 20, yc + 5, X);
dc.TextOutW(xc + 5, yc + 5, O);
dc.TextOutW(xc + 5, yc + 50, P);
dc.TextOutW(xc + 5, yc + 110, Q);
dc.TextOutW(xc + 5, yc + 170, W);
dc.TextOutW(xc + 5, yc + 230, E);
dc.TextOutW(xc + 130, yc + 5, P);
dc.TextOutW(xc - 135, yc + 5, R);
dc.TextOutW(xc + 265, yc + 5, Q);
dc.TextOutW(xc - 270, yc + 5, L);
dc.TextOutW(xc + 395, yc + 5, W);
dc.TextOutW(xc - 400, yc + 5, K);
dc.TextOutW(xc + 535, yc + 5, E);
dc.TextOutW(xc - 540, yc + 5, H);
lx = (rect.right - 10) - (rect.left + 10);
ly = (rect.bottom - 10) - (rect.top + 10);
sx = floor(lx / 10);
sy = floor(ly / 10);
tx = rect.right - fabs(x0);
ty = rect.bottom - fabs(y0);
xx = (xmax - xmin) / 10;
yy = (ymax - ymin) / 10;
//вісь x
for (t = sx; t <= -x0 - 30; t = t + sx)
{
txm = txm - xx;
dc.MoveTo(xc - t, yc - 5);
dc.LineTo(xc - t, yc + 5);
}
for (t = sx; t <= tx - 30; t = t + sx)
{
txp = txp + xx;
dc.MoveTo(xc + t, yc - 5);
dc.LineTo(xc + t, yc + 5);
}
//вісь y
for (t = sy; t <= -y0 - 15; t = t + sy)
{
typ = typ + yy;
dc.MoveTo(xc - 5, yc - t);
dc.LineTo(xc + 5, yc - t);
}
for (t = sy; t <= ty - 15; t = t + sy)
{
tym = tym - yy;
dc.MoveTo(xc - 5, yc + t);
dc.LineTo(xc + 5, yc + t);
}
//побудова графіка 1
for (x = x1; x <= x2; x = x + h)
{
y = 30 * cos(2 * x)*pow(fabs(sin(2 * x)), 1 / 2);
if (x == x1)
{
dc.MoveTo(x*kx - x0, -y*ky - y0);
}
dc.LineTo(x*kx - x0, -y*ky - y0);
}
//побудова графіка 2
for (x = x1; x <= x2; x = x + h)
{
z= 30 * sin(5 * x)*pow(fabs(sin(2 * x)), 1 / 2);
if (x == x1)
{
dc.MoveTo(x*kx - x0, -z*ky - y0);
}
dc.LineTo(x*kx - x0, -z*ky - y0);
}
}
Результати виконання програми.
Висновок:
Під час виконання цієї лабораторної роботі, я навчилася складати програми для побудови графіків в середовищі Microsoft Visual Studio C++ 2008.