Міністерство освіти та науки України
Національний університет “Львівська політехніка”
ПОБУДОВА РУХОМИХ ГРАФІЧНИХ ЗОБРАЖЕНЬ В СЕРЕДОВИЩІ MICROSOFT VISUAL STUDIO C++ 2008
Лабораторна робота №4
з курсу «Програмування комп’ютерної графіки»
Варіант №16
Завдання:
Затухаючі відскоки кульки від поверхні.
Параметри: H=100, d=20.
/
Блок-схема програми:
-
+
Список індетифікаторів, змінних та функцій:
CBrush br;
br.CreateSolidBrush(RGB(0,0,0));
dc.SelectObject(&br); - Створення та використання користувацького пера;
dc.SelectStockObject(Color); - перо , Color – колір пера;
dc.Rectangle() – малює прямокутник.
Остаточна версія програми:
Файл main.h
#include<vector>
#include"iostream"
#include<math.h>
using namespace std;
const int n1=3,m1=1;
class TMatrix
{
public:
vector<vector<double>> matrix;
int n;
public:
TMatrix(){
n=n1;
matrix.resize(n1);
for(int i=0;i<n1;i++)
matrix[i].resize(n1);
}
TMatrix(int Dx,int Dy){
n=n1;
matrix.resize(3);
for(int i=0;i<3;i++)
matrix[i].resize(3);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(i==j)matrix[i][j]=1;
else matrix[i][j]=0;
matrix[2][0]=Dx;
matrix[2][1]=Dy;
}
TMatrix(int e){
n=n1;
matrix.resize(3);
for(int i=0;i<3;i++)
matrix[i].resize(3);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
matrix[i][j]=0;
matrix[0][0]=cos(e*3.14/180);
matrix[0][1]=sin(e*3.14/180);
matrix[1][0]=-sin(e*3.14/180);
matrix[1][1]=cos(e*3.14/180);
matrix[2][2]=1;
}
TMatrix(double e){
n=n1;
matrix.resize(3);
for(int i=0;i<3;i++)
matrix[i].resize(3);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
matrix[i][j]=0;
matrix[0][0]=sin(e*3.14/180);
matrix[0][1]=cos(e*3.14/180);
matrix[1][0]=-cos(e*3.14/180);
matrix[1][1]=sin(e*3.14/180);
matrix[2][2]=1;
}
~TMatrix(){};
friend void rec(CPaintDC *dcc, TMatrix B);
friend void drec(CPaintDC *dcc, TMatrix B);
friend ostream &operator<<(ostream &out,TMatrix &L){
for(int i=0;i<3;i++)
{out<<endl;
for(int j=0;j<3;j++)
out<<L.matrix[i][j]<<" ";
}
out<<endl;
return out;
}
TMatrix operator *(TMatrix Matrix1);
TMatrix &TMatrix:: operator=(TMatrix Matrix1)
{
int n=Matrix1.n;
for(int i=0;i<n;i++)
for(int j=0;j<n1;j++)
matrix[i][j]=Matrix1.matrix[i][j];
return *this;
}
};
class TPmatrix: public TMatrix
{
public:
vector<vector<double>> matrix;
int n;
TPmatrix(){
n=m1;
matrix.resize(m1);
for(int i=0;i<m1;i++)
matrix[i].resize(n1);
}
TPmatrix(int x,int y){
n=m1;
matrix.resize(m1);
for(int i=0;i<m1;i++)
matrix[i].resize(n1);
matrix[0][0]=x;
matrix[0][1]=y;
matrix[0][2]=1;
}
~TPmatrix(){};
TPmatrix operator *(TMatrix Matrix1){
TPmatrix Matrix2;
for(int i=0;i<m1;i++)
for(int j=0;j<n1;j++)
for(int k=0;k<n1;k++)
Matrix2.matrix[i][j]+=matrix[i][k]*Matrix1.matrix[k][j];
return Matrix2;
}
TPmatrix &operator=(TPmatrix Matrix1)
{
int n=Matrix1.n;
for(int i=0;i<n;i++)
for(int j=0;j<n1;j++)
matrix[i][j]=Matrix1.matrix[i][j];
return *this;
}
friend ostream &operator<<(ostream &out,TPmatrix &L){
for(int i=0;i<m1;i++)
{out<<endl;
for(int j=0;j<n1;j++)
out<<L.matrix[i][j]<<" ";
}
out<<endl;
return out;
}
};
TMatrix TMatrix:: operator *(TMatrix Matrix1)
{
int n=Matrix1.n;
TMatrix Matrix2;
for(int i=0;i<n;i++)
for(int j=0;j<n1;j++)
for(int k=0;k<n1;k++)
Matrix2.matrix[i][j]+=matrix[i][k]*Matrix1.matrix[k][j];
return Matrix2;
}
Файл ChildView.cpp
// ChildView.cpp : реализация класса CChildView
//
#include "stdafx.h"
#include "ChildView.h"
#include "main.h"
#include <conio.h>
using namespace std;
const int L=100,d=20;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CChildView
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// обработчики сообщений CChildView
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;
}
class m_dc: public CPaintDC
{
public:
m_dc(CWnd* pWnd);
int x_c,y_c;
void Circle(int x,int y,int r,COLORREF cl);
void dCircle(int x,int y,int r,COLORREF cl);
int getX(int l,int r);
int getY(int l,int r);
};
void circle(CPaintDC *dcc,TPmatrix B)
{
CPen pen(PS_SOLID,1,RGB(0,0,0));
CBrush br(RGB(0,0,0));
dcc->SelectObject(&br);
dcc->SelectObject(&pen);
dcc->MoveTo(100,100);
dcc->LineTo(200,100);
dcc->MoveTo(100,200);
dcc->LineTo(200,200);
dcc->Ellipse(B.matrix[0][0]-10,B.matrix[0][1]-10,B.matrix[0][0]+10,B.matrix[0][1]+10);
pen.DeleteObject();
br.DeleteObject();
Sleep(10);
br.CreateSolidBrush(RGB(255,255,255));
dcc->SelectObject(&br);
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
dcc->SelectObject(&pen);
dcc->Ellipse(B.matrix[0][0]-10,B.matrix[0][1]-10,B.matrix[0][0]+10,B.matrix[0][1]+10);
pen.DeleteObject();
br.DeleteObject();
}
void CChildView::OnPaint()
{
CPaintDC dc(this);
CBrush br;
TPmatrix P(150,110),P1(150,110);
TMatrix T2(0,-1),T(0,1);
dc.MoveTo(100,100);
dc.LineTo(200,100);
dc.MoveTo(100,200);
dc.LineTo(200,200);
circle(&dc,P);
int k=0;
do
{
for(int i=90-k*20;i>=10;i--)
{
P=P*T;
circle(&dc,P);
}k++;
for(int i=10;i<=90-k*20;i++)
{
P=P*T2;
circle(&dc,P);
}
}
while(k<=5);
CPen pen(PS_SOLID,1,RGB(0,0,0));
br.CreateSolidBrush(RGB(0,0,0));
dc.SelectObject(&br);
dc.SelectObject(&pen);
dc.Ellipse(140,180,160,200);
pen.DeleteObject();
br.DeleteObject();
}
Результати роботи програми:
//
Висновок: На даній лабораторній роботі я здобув навики в складанні програм для побудови рухомих графічних зображень на екрані комп'ютера за допомогою матричних перетворень.