Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Лабораторна робота №2
з курсу
«Програмування компютерної графіки»
ПОБУДОВА ГРАФІКІВ ФУНКЦІЙ
В СЕРЕДОВИЩІ MICROSOFT VISUAL STUDIO C++ 2008
Підготував ст. гр. СІ-21
Белов Ю. Г.
Прийняв
Іванюк О.О
Львів-2012
ЗАВДАННЯ
Варіант №2
Блок-схема
Список ідентифікаторів констант, змінних, процедур і функцій, використаних в програмі, та їх пояснення
rect структура, в якій записані розміри екрана.
GetClientRect(&rect) команда для запису розмірів екрана в структуру rect.
str[192] массив символів.
kx,ky коефініент перетворення по осях x та y відповідно.
x0,y0 мінімальне значення графіка в машинних координатах по осях x та y відповідно.
x змінна, з інтервалом зміни від x1 до x2 з кроком h.
y значення функції.
lx,ly довжина осі по x та y відповідно.
sx,sy ціле значення від розбиття осі на 10 частин по x та y відповідно.
tx,ty змінна, значення якої відповідає довжині додатної осі по x та відємної по y відповідно.
xc,yc центр графіка в точці x=0 по осях x та y відповідно.
xx,yy змінна, яка відповідає за розбиття графіка на 10 частин по осях x та y відповідно.
t тимчасова змінна.
xmax,xmin,ymax,ymin мінімальне та максимальне значення функції по осях x та y відповідно.
txp,txm,typ,tym змінні, які визначають положення тексту розмітки осей у додатному та відмному напрямках x та y відповідно.
rect.bottom,rect.right нижня та права сторона вікна, відповідає за розміри клієнтського вікна.
rect.top,rect.left верхня та ліва сторона вікна, рівна 0.
Остаточно відлагоджений текст програми відповідно до отриманого завдання
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "Lab_02.h"
#include "ChildView.h"
#include "math.h"
#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);
wchar_t str[192];
double kx,ky,x0,y0,x,y,lx,ly,sx,sy,xc,yc,tx,ty,xx,yy,t;
double xmax=0,xmin=0,ymax=0,ymin=0,txp=0,txm=0,typ=0,tym=0;
double x1=0,x2=16,h=0.1;
RECT rect;
GetClientRect(&rect);
//vuzna4ennya xmax,xmin,ymax,ymin
for(x=x1;x<=x2;x=x+h)
{
y=pow(exp(x),1./8.)*sin(x/3);
if(ymin>-y)
{
ymin=-y;
}
else if(ymax<-y)
{
ymax=-y;
}
if(xmin>x)
{
xmin=x;
}
else if(xmax<x)
{
xmax=x;
}
}
//znahodzhennya znachennja funkcii v tochci x=0
x=0;
y=pow(exp(x),1./8.)*sin(x/3);
//znahodzhennya koeficientiv i centra realjnuh koordunat
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;
//pobudova osej
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);
//poznachaemo osi
const CString Y("Y"),X("X"),O("0");
dc.TextOutW(xc-20,rect.top+5,Y);
dc.TextOutW(rect.right-20,yc+5,X);
dc.TextOutW(xc+5,yc+5,O);
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;
//visj 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);
swprintf_s (str,50,L"%.1f",txm);
dc.TextOut(xc-t-10,yc+5,str);
}
for(t=sx;t<=tx-30;t=t+sx)
{
txp=txp+xx;
dc.MoveTo(xc+t,yc-5);
dc.LineTo(xc+t,yc+5);
swprintf_s (str,50,L"%.1f",txp);
dc.TextOut(xc+t-10,yc+5,str);
}
//visj 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);
swprintf_s (str,50,L"%.1f",typ);
dc.TextOut(xc+10,yc-t-10,str);
}
for(t=sy;t<=ty-15;t=t+sy)
{
tym=tym-yy;
dc.MoveTo(xc-5,yc+t);
dc.LineTo(xc+5,yc+t);
swprintf_s (str,50,L"%.1f",tym);
dc.TextOut(xc+10,yc+t-10,str);
}
//pobudova grafika
for(x=x1;x<=x2;x=x+h)
{
y=pow(exp(x),1./8.)*sin(x/3);
if(x==x1)
{
dc.MoveTo(x*kx-x0,-y*ky-y0);
}
dc.LineTo(x*kx-x0,-y*ky-y0);
}
}
Результати виконання програми