Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Звіт
лабораторної роботи № 2
з курсу «Програмування комп’ютерної графіки»
Мета: набути практичних навиків в складанні програми для побудови графіків в середовищі Microsoft Visual Studio C++ 2008.
Завдання:
Домашня підготовка до роботи.
Ознайомитися з методами побудови графіків функцій на екрані монітора комп’ютера.
Вивчити основні функції бібліотеки GDI для виведення тексту в графічному режимі.
Написати програму, яка будує в середині екрану систему координат ХY і на ній графік функції Y = F(X), якщо аргумент або параметр змінюється на проміжку [a;b] з кроком h. Варіанти завдань брати за вказівкою викладача з таблиці 1.
Робота в лабораторії.
Ввести в комп’ютер програму написану на мові С++ згідно з отриманим завданням.
Здійснити відлагодження введеної програми, виправивши виявлені компілятором помилки.
Виконати програму. Текст відлагодженої програми та отримані результати оформити в звіт по лабораторній роботі.
Таблиця 1.
№ п/п
Функція
Інтервал
Крок
8
x = (5 * (cos(t) - t * sin(t)) + log(t) + 20 * cos(t/4))
y = (5 * (sin(t) + t * cos(t)) - log(t) + 20 * sin(t/4))
t = [1;20]
h = 0.1
Зміст звіту:
Повний текст завдання.
Блок-схема алгоритму програми.
Список ідентифікаторів констант, змінних, процедур і функцій, використовуваних в програмі та їх пояснення.
Остаточно відлагоджений текст програми згідно з отриманим завданням.
Результат виконання програми.
2. Блок-схема алгоритму програми.
Рис. 1
//
3. Список ідентифікаторів констант, змінних, процедур і функцій, використовуваних в програмі та їх пояснення.
k_brush – пензель;
bpen – чорне перо товщино 1 рх;
hPen – перо товщиною 3 рх;
CPen – функція для створення пера;
LineTo – проводить лінію з поточної вершини до точки, координати якої задані;
MoveToEx – переміщує поточну вершину;
FloodFill – зафарбовує замкнуту область;
SelectObject – вибирає потрібний пензль або перо;
DeleteObject - видаляє потрібний пензль або перо;
GetClientRect – визначення параметрів екрану користувача;
CString – оголошення змінної для виведення тексту;
kx, ky – змінні коефіціентів перетворення;
xd, yd, xmashd, ymashd - різниця мінімальних і максимальних координат;
x, y – машинні координати;
xp, yp - реальні координати;
t – інтервал;
xmax, xmin, ymax, ymin, xmashmin, xmashmax, ymashmin, ymashmax – мінімальні і максимальні значення функції;
xc, yc – координати центру екрану;
xs, ys, xchar, ychar – змінні для виведення розмітки осей.
4. Остаточно відлагоджений текст програми згідно з отриманим завданням.
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "lr1.h"
#include "ChildView.h"
#include <cmath>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CChildView
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CChildView message handlers
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); // device context for painting
double kx, ky, xd, yd, x, y, xp, yp, t;
wchar_t str[180] = {0};
double xs, ys;
//Визначаємо мінімальне і максимальне значення
RECT rect;
GetClientRect(&rect);
double xmax = 0, xmin = 0, ymax = 0, ymin = 0, xmashd, ymashd, xmashmin, xmashmax, ymashmin, ymashmax, xc, yc;
t = 1;
while (t <= 20) {
x = 5 * (cos(t) - t * sin(t)) + log(t) + 20 * cos(t/4);
if (x > xmax) {
xmax = x;
}
else if (t == 1 || x < xmin ) {
xmin = x;
}
y = 5 * (sin(t) + t * cos(t)) - log(t) + 20 * sin(t/4);
if (y > ymax) {
ymax = y;
}
else if (t == 1 || y < ymin ) {
ymin = y;
}
t = t + 0.1;
}
xmashd = rect.right - rect.left - 50 - 50;
ymashd = rect.bottom - rect.top - 50 - 50;
xmashmin = rect.left + 10;
xmashmax = rect.right - 10;
ymashmin = rect.top + 10;
ymashmax = rect.bottom - 10;
xc = (rect.right - rect.left)/2;
yc = (rect.bottom - rect.top)/2;
xd = xmax - xmin;
yd = ymax - ymin;
kx = xmashd/xd;
ky = ymashd/yd;
MoveToEx(dc, xc, ymashmax, 0);
LineTo(dc, xc, ymashmin);
LineTo(dc, xc - 3, ymashmin + 10);
MoveToEx(dc, xc, ymashmin, 0);
LineTo(dc, xc + 3, xmashmin + 10);
//////////
MoveToEx(dc, xmashmin, yc, 0);
LineTo(dc, xmashmax, yc);
LineTo(dc, xmashmax - 10, yc + 3);
MoveToEx(dc, xmashmax, yc, 0);
LineTo(dc, xmashmax - 10, yc - 3);
t = 1;
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(254, 0, 0));
HGDIOBJ hOldPen = SelectObject(dc, hPen);
while (t <= 20) {
xp = (5 * (cos(t) - t * sin(t)) + log(t) + 20 * cos(t/4));
yp = (5 * (sin(t) + t * cos(t)) - log(t) + 20 * sin(t/4));
x = xc + (xp * kx);
y = yc - (yp * ky);
if (t == 1) {
MoveToEx(dc, x, y, 0);
}
LineTo(dc, x, y);
t = t + 0.1;
}
SelectObject(dc, hOldPen);
DeleteObject(hPen);
xs = -90;
ys = -90;
while (xs < 100) {
int xx = xc + (xs * kx);
if (xs == 90) {
CString xchar("X");
dc.TextOutW (xx,yc + 10,xchar);
} else {
swprintf_s (str,50,L"%1.1f",xs);
dc.TextOut (xx,yc+10,str);
MoveToEx(dc, xx, yc - 2,0);
LineTo(dc, xx, yc + 2);
}
xs = xs + 10;
}
while (ys <= 100) {
int yy = yc - (ys * ky);
if (ys == 0) {
} else if (ys == 100) {
CString ychar("Y");
dc.TextOutW (xc+10,yy,ychar);
} else {
swprintf_s (str,50,L"%5.1f",ys);
dc.TextOut (xc+10,yy,str);
MoveToEx(dc, xc - 2, yy, 0);
LineTo(dc, xc + 2, yy);
}
ys = ys + 10;
}
}
5. Результат виконання програми.
Рис. 2
/