Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра КСА
Лабораторна робота №4
З курсу «Програмування комп’ютерної графіки»
На тему: “ ПОБУДОВА РУХОМИХ ЗОБРАЖЕНЬ В СЕРЕДОВИЩІ MICROSOFT VISUAL STUDIO C++ 2008”
Варіант № 23
Завдання:
Написати програму мовою C++, що дозволяє сформувати на екрані комп’ютера рухоме зображення, використовуючи матричні операції.
/
Блок-схема алгоритму програми:
Список ідентифікаторів констант, змінних, процедур і функцій:
MoveTo( ) – переносить курсор у задану точку;
LineTo( ) – будує лінію до заданої точки;
SelectStockObject(BLACK_PEN)– функція для вибору чорного пензля.
SelectStockObject(WHITE_PEN)– функція для вибору білого пензля.
Ellipse ( ) – малює еліпс
Остаточно відлагоджений текст програми згідно з отриманим завданням.
#include "stdafx.h"
#include "MFC 4 LABA.h"
#include "math.h"
#include "MFC 4 LABADoc.h"
#include "MFC 4 LABAView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
void CMFC4LABAView::OnDraw(CDC* dc)
{
CMFC4LABADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
RECT rect;
GetClientRect(&rect);
double xc, yc, r, rd, angle, x, y, h=0.4;
double dxc, dyc;
xc = rect.right / 2;
yc = rect.bottom / 2;
rd = 10;
double C = 550+rd;
x = xc;
y = yc + 100;
dc->MoveTo( C-rd +18 , C+39-300+1 );
dc->LineTo( C-rd + 18 , C + 9-300+1 );
dc->LineTo( C-rd + 18 , C + 59-300+1 );
dc->MoveTo( C-rd +18 , C+40-300+1 );
dc->LineTo( C-rd + 138 , C + 40-300+1 );
dc->LineTo( C-rd + 138 , C + 9-300+1 );
dc->LineTo( C-rd + 138 , C + 59-300+1 );
while(1){
///// Хід Праворуч
for (angle = 0; angle <= 3.1415*4+3.1415; angle += h/10)
{
double step= angle*6.3;
double angle2 = 3.1415/2;
dxc = rd * sin(angle2)+570+step;
dyc = -rd * cos(angle2)+250+rd+32;
double dxc2 = rd * sin(angle)+dxc;
double dyc2 = -rd * cos(angle)+dyc;
double dxc1 = rd * sin(angle+3.1415/2)+dxc;
double dyc1 = -rd * cos(angle+3.1415/2)+dyc;
double dxc3 = rd * sin(angle+3.1415)+dxc;
double dyc3 = -rd * cos(angle+3.1415)+dyc;
double dxc4 = rd * sin(angle+3.1415+3.1415/2)+dxc;
double dyc4 = -rd * cos(angle+3.1415+3.1415/2)+dyc;
dc->SelectStockObject(BLACK_PEN);
dc->Ellipse(dxc - rd, dyc - rd, dxc + rd, dyc + rd);
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc2 , dyc2 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc1 , dyc1 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc3 , dyc3 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc4 , dyc4 );
Sleep(10);
dc->SelectStockObject(WHITE_PEN);
dc->Ellipse(dxc - rd, dyc - rd, dxc + rd, dyc + rd);
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc2 , dyc2 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc1 , dyc1 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc3 , dyc3 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc4 , dyc4 );
}
//// Хід ліворуч
for (angle = 3.1415*4-2; angle >= -4.95; angle-= h/10)
{
double step= angle*6.3;
double angle2 = 3.1415/2;
dxc = rd * sin(angle2)+600+step;
dyc = -rd * cos(angle2)+250+rd+32;
double dxc2 = rd * sin(angle)+dxc;
double dyc2 = -rd * cos(angle)+dyc;
double dxc1 = rd * sin(angle+3.1415/2)+dxc;
double dyc1 = -rd * cos(angle+3.1415/2)+dyc;
double dxc3 = rd * sin(angle+3.1415)+dxc;
double dyc3 = -rd * cos(angle+3.1415)+dyc;
double dxc4 = rd * sin(angle+3.1415+3.1415/2)+dxc;
double dyc4 = -rd * cos(angle+3.1415+3.1415/2)+dyc;
dc->SelectStockObject(BLACK_PEN);
dc->Ellipse(dxc - rd, dyc - rd, dxc + rd, dyc + rd);
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc2 , dyc2 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc1 , dyc1 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc3 , dyc3 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc4 , dyc4 );
Sleep(10);
dc->SelectStockObject(WHITE_PEN);
dc->Ellipse(dxc - rd, dyc - rd, dxc + rd, dyc + rd);
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc2 , dyc2 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc1 , dyc1 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc3 , dyc3 );
dc->MoveTo(dxc, dyc);
dc->LineTo(dxc4 , dyc4 );
}};
Результати виконання програми.
/
Висновок:
Я набув практичних навиків в складанні програм для побудови рухомих зображень на екрані комп’ютера за допомогою матричних перетворень.