Міністерство освіти та науки України
Національний університет “Львівська політехніка”
ПОБУДОВА РУХОМИХ ГРАФІЧНИХ ЗОБРАЖЕНЬ В СЕРЕДОВИЩІ MICROSOFT VISUAL STUDIO C++ 2008
Лабораторна робота №4
з курсу «Програмування комп’ютерної графіки»
Варіант №10
Завдання:
Незатухаючі коливання маятника. Нитка маятника видима. Кольори кульки і нитки різні.
Параметри: R=60, d=18, φ=
90
0
.
/
Блок-схема програми:
1
2
3
4
11
5
6
7
8
9
10
Список індетифікаторів, змінних та функцій:
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 Dx,int Dy){
n=n1;
matrix.resize(3);
for(int i=0;i<3;i++)
matrix[i].resize(3);
matrix[0][0]=1;
matrix[0][1]=2;
matrix[0][2]=3;
matrix[1][0]=4;
matrix[1][1]=5;
matrix[1][2]=6;
matrix[2][0]=Dx;
matrix[2][1]=Dy;
matrix[2][2]=7;
}*/
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(const TMatrix &matrix1){
for(int i=0; i<3;i++)
for(int j=0;j<3;j++)
matrix[i][j]=matrix1.matrix[i][j];
for(int i=0;i<3;i++)
x_matrix[i]=matrix1.x_matrix[i];
}*/
~TMatrix(){};
friend void duha(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;
}
/*TPmatrix operator *(TPmatrix Matrix1);*/
//friend ostream &operator<<(ostream ,TPmatrix);
};
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 : implementation of the CChildView class
//
#include "stdafx.h"
#include "ChildView.h"
#include <math.h>
#include "main.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
const int r=10;
// 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 duha(CPaintDC *dcc, TPmatrix B)
{
CPen pen;
CBrush br;
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));// колір дуги
br.CreateSolidBrush(RGB(255,0,0)); // колір кульки
dcc->SelectObject(&pen);
dcc->SelectObject(&br);
dcc->Ellipse(B.matrix[0][0]-r,B.matrix[0][1]-r,B.matrix[0][0]+r,B.matrix[0][1]+r);
dcc->MoveTo(200,200);
dcc->LineTo(B.matrix[0][0],B.matrix[0][1]); //нитка
pen.DeleteObject();
br.DeleteObject();
Sleep(10);
pen.CreatePen(PS_SOLID,1,RGB(255,255,255)); //затирання руху кульки
br.CreateSolidBrush(RGB(255,255,255));
dcc->SelectObject(&pen);
dcc->SelectObject(&br);
dcc->Ellipse(B.matrix[0][0]-r,B.matrix[0][1]-r,B.matrix[0][0]+r,B.matrix[0][1]+r);
pen.DeleteObject();
br.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
dcc->SelectObject(&pen);
dcc->Rectangle(-10,-10,1000,1000);
pen.DeleteObject();
}
void CChildView::OnPaint()
{
CPaintDC dc(this);
for(int k=1;k<=10000;k++)
{
TPmatrix P(1,1),P1(150,190),B(1,1);
TMatrix T1(-200,-200),T2(200,200),M1;
duha(&dc,P);
for( double i=140;i<=240;i++)
{
TMatrix R1(i);
M1=T1*R1*T2;
P=P1*M1;
duha(&dc,P);
}
T1.matrix[2][0]=-200;
T1.matrix[2][1]=-200;
T2.matrix[2][0]=200;
T2.matrix[2][1]=200;
for( double i=240;i>=140;i--)
{
TMatrix R1(i);
M1=T1*R1*T2;
P=P1*M1;
duha(&dc,P);
}
}
}
Результати роботи програми:
/ / /
Висновок: На даній лабораторній роботі я здобув навики в складанні програм для побудови рухомих графічних зображень на екрані комп'ютера за допомогою матричних перетворень.