МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Звіт
про виконання лабораторної роботи №2
з курсу
“ Програмування комп’ютерної графіки”
Львів-2011
Мета роботи:
Набути практичних навиків в складанні програми для побудови графіків в середовищі Microsoft Visual Studio C++ 2008.
Завдання:
Написати програму, яка будує в середині екрану систему координат ХY і на ній графік функції Y=F(X), якщо аргумент або параметр змінюється на проміжку [a,b], з кроком h.
Задана функція:
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Список ідентифікаторів констант, змінних, процедур і функцій, використаних в програмі, та їх пояснення
dXmash, dYmash – змінні які відповідають за розширення екрану;
dXreal, dYreal – змінні які відповідають за різницю між максимальним і мінімальним значеннями координат відповідних осей;
Xmash, Ymash – поточні машинні координати;
Kx, Ky – коефіцієнти розширення;
Y0mash, X0mash – відносний початок машинних координатж;
Xmax, Xmin, Ymax, Ymin – максимальні та мінімальні значення функцій відповідних координат;
Y, X – значення функційж;
t – параметр функцій, який змінюється на інтервалі [1,17];
i – змінна, за допомогою якої здійснюється проставляння засічок на осях;
h – крок зміни параметра t;
У програмі використано оператори умовності if та for. А також команди для створення користувацького пера типу:
CPen red_pen;
red_pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));
dc.SelectObject(&red_pen);
Остаточна версія програми:
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
double i, t, dXreal, dYreal, Kx, Ky, Xmash, Ymash, dXmash=900, dYmash=600, X0mash=640, Y0mash=500, Xmax=-10000, Xmin=10000, Ymax=-10000, Ymin=10000, h=0.01, X, Y;
//Знаходження коефіцієнтів перетворення:
for (t=1; t<=17; t=t+h)
{
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
if (Xmax<X)
Xmax=X;
if (Xmin>X)
Xmin=X;
if (Ymax<Y)
Ymax=Y;
if (Ymin>Y)
Ymin=Y;
}
dXreal=Xmax-Xmin;
dYreal=Ymax-Ymin;
Kx=dXmash/dXreal;
Ky=dYmash/dYreal;
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
//Малюємо вісь x:
dc.MoveTo (X0mash-620, Y0mash);
dc.LineTo (X0mash+620, Y0mash);
//Малюємо стрілку на осі х:
dc.MoveTo (X0mash+620, Y0mash);
dc.LineTo (X0mash+615, Y0mash-5);
dc.MoveTo (X0mash+620, Y0mash);
dc.LineTo (X0mash+615, Y0mash+5);
//Малюємо вісь у:
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash, Y0mash+300);
//Малюємо стрілку на осі у:
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash-5, Y0mash-495);
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash+5, Y0mash-495);
//Будуємо графік:
t=1;
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
dc.MoveTo (Xmash, Ymash);
//Cтворюємо користувацьке перо червоного кольору, для того, щоб виділити графік:
CPen red_pen;
red_pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));
dc.SelectObject(&red_pen);
for (t=1; t<=17; t=t+h)
{
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
dc.LineTo (Xmash, Ymash);
}
//Знову переходимо до стандартного пера:
CPen black;
black.CreatePen (PS_SOLID, 1, RGB (0, 0, 0));
dc.SelectObject(&black);
//Робимо засічки на осі х:
for (i=-160; i<=160; i=i+20)
{
dc.MoveTo (X0mash+i*Kx, Y0mash-3);
dc.LineTo (X0mash+i*Kx, Y0mash+3);
}
//Робимо засічки на осі у:
for (i=-140; i<=160; i=i+20)
{
dc.MoveTo (X0mash-3, Y0mash+i*Ky);
dc.LineTo (X0mash+3, Y0mash+i*Ky);
}
//Підписуємо вісь х:
const CString X0("0");
dc.TextOutW(X0mash-10,Y0mash+10, X0);
const CString X1("-160");
dc.TextOutW(X0mash-165*Kx,Y0mash+10, X1);
const CString X2("-140");
dc.TextOutW(X0mash-145*Kx,Y0mash+10, X2);
const CString X3("-120");
dc.TextOutW(X0mash-125*Kx,Y0mash+10, X3);
const CString X4("-100");
dc.TextOutW(X0mash-105*Kx,Y0mash+10, X4);
const CString X5("-80");
dc.TextOutW(X0mash-85*Kx,Y0mash+10, X5);
const CString X6("-60");
dc.TextOutW(X0mash-65*Kx,Y0mash+10, X6);
const CString X7("-40");
dc.TextOutW(X0mash-45*Kx,Y0mash+10, X7);
const CString X8("-20");
dc.TextOutW(X0mash-25*Kx,Y0mash+10, X8);
const CString X9("20");
dc.TextOutW(X0mash+15*Kx,Y0mash+10, X9);
const CString X10("40");
dc.TextOutW(X0mash+35*Kx,Y0mash+10, X10);
const CString X11("60");
dc.TextOutW(X0mash+55*Kx,Y0mash+10, X11);
const CString X12("80");
dc.TextOutW(X0mash+75*Kx,Y0mash+10, X12);
const CString X13("100");
dc.TextOutW(X0mash+95*Kx,Y0mash+10, X13);
const CString X14("120");
dc.TextOutW(X0mash+115*Kx,Y0mash+10, X14);
const CString X15("140");
dc.TextOutW(X0mash+135*Kx,Y0mash+10, X15);
const CString X16("160");
dc.TextOutW(X0mash+155*Kx,Y0mash+10, X16);
const CString Xx("X");
dc.TextOutW(X0mash+610,Y0mash+10, Xx);
//Підписуємо вісь y:
const CString Yy("Y");
dc.TextOutW(X0mash+10,Y0mash-495, Yy);
const CString Y1("140");
dc.TextOutW(X0mash+10,Y0mash-145*Ky, Y1);
const CString Y2("120");
dc.TextOutW(X0mash+10,Y0mash-125*Ky, Y2);
const CString Y3("100");
dc.TextOutW(X0mash+10,Y0mash-105*Ky, Y3);
const CString Y4("80");
dc.TextOutW(X0mash+10,Y0mash-85*Ky, Y4);
const CString Y5("60");
dc.TextOutW(X0mash+10,Y0mash-65*Ky, Y5);
const CString Y6("40");
dc.TextOutW(X0mash+10,Y0mash-45*Ky, Y6);
const CString Y7("20");
dc.TextOutW(X0mash+10,Y0mash-25*Ky, Y7);
const CString Y8("-20");
dc.TextOutW(X0mash+10,Y0mash+15*Ky, Y8);
const CString Y9("-40");
dc.TextOutW(X0mash+10,Y0mash+35*Ky, Y9);
}
Результат роботи програми: /
Висновок: виконуючи дану лабораторну роботу я набув практичних навиків в складанні програми для побудови графіків в середовищі Microsoft Visual Studio C++ 2008.