Результат виконання програми

Палюшок В.О.

Перевірив:

Іванюк О.О.

 

Львів - 2015

Завдання

Побудувати графік функції заданої таблично.Параметри для побудови графіку визначені в таблиці 1,2.

Побудувати графік функції

,

Параметри для побудови графіка:

 

№ варіанта Тип лінії для побудови осей графіка Товщина лінії (пікселів) Колір
  −∙−∙−∙−∙−∙−∙(ШТРИХ-ПУНКТИР)   blue

 

1.2 Завдання

 

Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення. Параметри зображення задані в пікселах. Графік і вікно з рухомим зображенням повинні бути присутні на екрані одночасно.

 

2.1 Розрахунок функціональних залежностей для побудови графіка.

 

Оскільки реальні координати графіка функції, що виводиться на екран можуть бути або значно більшими, або значно меншими за машинні координати екрану монітору, необхідно визначити значення масштабних коефіцієнтів стискання або розтягу для функції, що виводиться на екран.

Позначимо максимальні та мінімальні значення реальних координат по осях X та Y - mахx, minx, maxy, miny.

Приймаємо машинний робочий діапазон для графіка функції 540 пікселів по осі X та 400 пікселів по осі Y. Тоді масштабні коефіцієнти для графіка по осях X та Y дорівнюють, відповідно:

 

При виведенні графіка функції на екран монітору значення реальних координат заданої функції домножуємо на масштабні коефіцієнти і додаємо координати машинного центру координат (X0,Y0):

 

 

2.2 Розрахунок матриці перетворень для рухомого зображення.

Результуюча матриця М, руху є добутком трьох матриць: переносу T1, T2 і повороту R, причому перша матриця відповідає перенесенню центру повороту в початок координат на відстань -dx та -dy, друга – повороту об’єкта на кут φ, третя – поверненню об’єкта з початку координат на площину зображення (координати dx та dy).

 

 

 

Перемноживши матрицю-рядок із старими координатами на результуючу матрицю руху, одержимо матрицю з новими координатами рухомої точки.

 

 

 


3. Список ідентифікаторів програми.

y- поточне значення функції

dXmash,dXreal,dYmash,dYreal, Kx,Ky масштабні коефіцієнти

a –початок відрізку табуляції

b- кінець відрізку табуляції

h– крок зміни реального значення аргументу;

Ymax, Ymin - максимальне та мінімальне реальні значення аргументу;

LineTo(int x,int y)

MoveTo(int x, int y)

const CString

dc.TextOutW(int x, int y, char a)

dc.TextOut(int x, int y, char a)

CPen pen;

ToRadian (ᵒ)

 

4. Блок-схеми основної програми побудови графіка та анімації.

Графік

 

Xo1=rect.right-VXR
Xo1<VXL
-
+
Xo1>rect.right-VXR
Xo1=VXL
-
+
обчислення kx,ky
-
+
-
+
Ymax=y
Ymax<y
Ymax=y
Ymax<y
y=F(x)
x=a,b x+=h  
Ymax=F(a) Ymin=F(a)
проміжок функції
початок
1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
Кінець
Xmashn=Xo+x*Kx; y=F(x); Ymashn=Yo-y*Ky; dc.LineTo(Xmashn,Ymashn);
x=a,b x+=h  
задання кольору і типу лінії
градуювання осі Y
градуювання осі Х
рисування осі Х
рисування осі Y
Yo1=rect.bottom-VYB
-
+
Yo1>rect.bottom-VYB
-
+
Yo1=VYT
Yo1<VYT


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

Початок

 

phi = ToRadian(180); int r=60; int t=20;  
2

 

Square square = Square();  
3

 

 


Vector2 pos = Vector2(400 + r + k + t/2, 250); bool first = true; bool rotate = true; double phi2 = ToRadian(45);  
4

 

 

(true)


- 5

 


Кінець
28 +

i=0:2; i++  
6

 


if(i==0)  
7 -

 


+

dc.SelectStockObject(WHITE_PEN); dc.SelectStockObject(WHITE_BRUSH);  
dc.SelectStockObject(BLACK_PEN)  
8 9

 

 

 

 


double teta = PI/20.0;  

 


 

j=0:6; j++  
11

 


dc.LineTo(square.vertex[j].X, square.vertex[j].Y);  
12

 

 

 


dc.LineTo(square.vertex[0].X, square.vertex[0].Y);  
13

 

 


dc.MoveTo(400 + r, 250); dc.AngleArc(400, 250, r, 0, 180); dc.MoveTo(400 + r, 250); dc.LineTo(400 + r + k, 250); dc.AngleArc(400, 250, r+k, 0, 180); dc.LineTo(400 - r, 250);  
14

 

 
 
 
 

 

 


if(i==1)  
-

if(i == 0)  


26 16 +

dc.FloodFill(square.Center.X, square.Center.Y, RGB(255,255,255)); dc.FloodFill(400 - r - t/2, 240, RGB(255,255,255));  

 


+

dc.SelectObject(brush); dc.FloodFill(square.Center.X, square.Center.Y, RGB(0,0,0)); dc.SelectObject(brush2);dc.FloodFill(400 - r - t/2, 240, RGB(0,0,0)); Sleep(100);  


if(first && rotate)  
17

-


+

if(phi2 > ToRadian(233))  



rotate = false;  
19


if(first &&!rotate)  
20

if(pos.X > 400 - r)  



first = false; rotate = true; phi2 = ToRadian(130);  
22


if(!first &&!rotate)  
23


if(pos.X > 400 + r + k + t/2)  
24


first = false; rotate = true; phi2 = ToRadian(45);  
25


Текст програми.

 

 

// ChildView.cpp: реализация класса CChildView

//

 

#include "stdafx.h"

#include "ChildView.h"

#include "Math.h"

#include <conio.h>

#include <vector>

#include<iostream>

 

#include <fstream>

using namespace std;

#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;

}

 

double ToRadian(double);

 

int d = 28;

 

class Vector2

{

public:

double X;

double Y;

 

Vector2(double x, double y)

{

X = x;

Y = y;

}

 

Vector2(int a)

{

X = a;

Y = a;

}

 

Vector2()

{

X = 0;

Y = 0;

}

friend Vector2& operator+(const double&, const Vector2&);

friend Vector2& operator+(const Vector2&, const Vector2&);

};

 

Vector2& operator+(const double& value, const Vector2& vec)

{

return Vector2(vec.X + value, vec.Y + value);

}

Vector2& operator+(const Vector2& vec1, const Vector2& vec2)

{

return Vector2(vec1.X + vec2.X, vec1.Y + vec2.Y);

}

 

class Matrix

{

public:

static Vector2 CreateRotation(Vector2 position, double angle, bool rotateLeft)

{

position.X /= sqrt(2.0);

position.Y /= sqrt(2.0);

 

double matrix[4];

matrix[0] = cos(angle);

matrix[1] = rotateLeft? -sin(angle): sin(angle);

matrix[2] = rotateLeft? sin(angle): -sin(angle);

matrix[3] = cos(angle);

 

return Vector2(position.X * matrix[0] + position.Y * matrix[1], position.X * matrix[2] + position.Y * matrix[3]);

}

};

 

int a = 20, A = 120;

 

class Square

{

public:

Vector2 Center;

Vector2 vertex[6];

 

Square()

{

Center = Vector2(0);

}

 

Square(Vector2 center)

{

Center = center;

}

 

Vector2* CreateRotation(double angle) //обертання шестикутника

{

vertex[0] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(60), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(60), false).Y);

vertex[1] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(120), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(120), false).Y);

vertex[2] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(180), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(180), false).Y);

vertex[3] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(240), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(240), false).Y);

vertex[4] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(300), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(300), false).Y);

vertex[5] = Vector2(Center.X + Matrix::CreateRotation(a / 2, angle + ToRadian(360), false).X, Center.Y + Matrix::CreateRotation(a / 2, angle + ToRadian(360), false).Y);

 

return vertex;

}

};

 

const double PI = 3.1415;

const double kx = 50, ky = 0.005;

const int Cx = 350, Cy = 350;

 

double phi = 0;

int r = 60, k = 40;

 

double ToRadian(double x)

{

return (x*PI) / 180;

}

 

double f(double x)

{

return -1.0 / sin(x);

return sin(x);

}

 

 

double F(double x){ return 9 * pow(x, 3) - 1; } //функція

 

void CChildView::OnPaint()

{

CPaintDC dc(this);

int Xmashn, Ymashn, Xo, Yo, VXL, VXR, VYB, VYT;

double y, Kx, Ky, dXmash, dXreal, dYmash, dYreal, a, b, h, Ymax, Ymin;

 

VXL = VXR = VYB = VYT = 70;

a = -5;

b = 3;

h = 0.3;

 

Ymax = F(a);

Ymin = F(a);

for (double x = a; x<b; x = x + h)

{

y = F(x);

if (Ymax<y)

Ymax = y; else;

if (Ymin>y)

Ymin = y; else;

}

RECT rect;

GetClientRect(&rect);

dXreal = b - a; dXmash = rect.right+50 - rect.left;

dYreal = Ymax - Ymin; dYmash = rect.bottom-150 - rect.top;

Ky = (dYmash - VXL - VXR) / dYreal; Kx = (dXmash - VYB - VYT) / dXreal;

Xo = VXL - Kx*a;

Yo = VYT + Ky*Ymax*(1/3);

int Xo1 = Xo, Yo1 = Yo;

 

if (Xo1<VXL)Xo1 = VXL; if (Xo1>rect.right - VXR)Xo1 = rect.right - VXR;

if (Yo1<VYT)Yo1 = VYT; if (Yo1>rect.bottom - VYB)Yo1 = rect.bottom - VYB;

 

//-----Рамка----//

//з більшою товщиною

CPen contur_pen; contur_pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0));

dc.SelectObject(&contur_pen);

dc.MoveTo(Xo1-400, Yo1+55);

dc.LineTo(Xo1 - 100, Yo1 + 55);

dc.LineTo(Xo1 - 100, Yo1 + 210);

dc.LineTo(Xo1 - 400, Yo1 + 210);

dc.LineTo(Xo1 - 400, Yo1 + 55);

 

//Знову переходимо до стандартного пера:

CPen black; black.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));

dc.SelectObject(&black);

 

//----осі координат start----//

dc.MoveTo(Xo1, Yo1);

dc.LineTo(Xo1, VYT - 50);

dc.MoveTo(Xo1, VYT-50);

dc.LineTo(Xo1-5, VYT - 20);

dc.MoveTo(Xo1, VYT-50);

dc.LineTo(Xo1+5, VYT - 20);

const CString Y("Y");

dc.TextOutW(Xo1 - 15, VYT - 50, Y);

 

dc.MoveTo(Xo1, Yo1);

dc.LineTo(Xo1, rect.bottom - VYB);

dc.MoveTo(Xo1, Yo1);

dc.LineTo(VXL, Yo1);

dc.MoveTo(Xo1, Yo1);

dc.LineTo(rect.right - VXR + 25, Yo1);

dc.MoveTo(rect.right - VXR, Yo1 - 5);

dc.LineTo(rect.right - VXR + 25, Yo1);

dc.MoveTo(rect.right - VXR, Yo1 + 5);

dc.LineTo(rect.right - VXR + 25, Yo1);

const CString X("X");

dc.TextOutW(rect.right - VXR + 25, Yo1 - 20, X);

 

const CString O("O");

if (Xo1 <= VXL || Xo1 >= rect.right - VXR|| Yo1 <= VYT || Yo1 >= rect.bottom - VYB);

else dc.TextOutW(Xo1 - 15, Yo1 + 5, O);

 

 

//----------a i b start--------//

double d = b;

char str[20];

sprintf_s(str, 20, "%5.4lf", d);

CString ss(str);

dc.TextOutW(Xo + d*Kx - 50, Yo1 + 5, ss);//3.000

dc.MoveTo(Xo + b*Kx, Yo1 - 2);

dc.LineTo(Xo + b*Kx, Yo1 + 2);

 

double H = (b - a) / 8;

d = a;

int w = b / 5;

for (int i = 0; i<8; i++)

{

sprintf_s(str, 20, "%3.4lf", d);

CString A(str);

dc.TextOut(Xo + d*Kx + 2, Yo1 + 5, A);

dc.MoveTo(Xo + d*Kx, Yo1 - 2);

dc.LineTo(Xo + d*Kx, Yo1 + 2);

d += H;

}

 

//----------a i b end--------//

 

//----------Ymax i Ymin start--------//

 

 

H = (Ymax - Ymin) / 5;

d = Ymin;

for (int i = 0; i<6; i++)

{

 

dc.MoveTo(Xo1 - 2, Yo - d*Ky);

dc.LineTo(Xo1 + 2, Yo - d*Ky);

d += H;

}

 

//----------Ymax i Ymin end--------//

 

//----------Осі координат end--------//

 

CRect rc;

GetClientRect(rc);

int width = 4; // товщина лінії функції

LOGBRUSH logBrush;

logBrush.lbStyle = BS_SOLID;

logBrush.lbColor = RGB(0, 213, 255); // голубий колір лінії

CPen pen1(PS_DASHDOT | PS_GEOMETRIC | PS_ENDCAP_ROUND, width, &logBrush); // штрих-пунктир лінія //перо геометричне //кінець заокруглений

CPen *pPrevPen = dc.SelectObject(&pen1);

 

 

dc.MoveTo(Xo + a*Kx, Yo - Ky*F(a));

dc.LineTo(Xo + a*Kx, Yo - Ky*F(a));

for (double x = a; x<b; x = x + h)

{

Xmashn = Xo + x*Kx;

y = F(x);

Ymashn = Yo - y*Ky;

dc.LineTo(Xmashn, Ymashn);

}

CPen pen(PS_SOLID, 1, RGB(0, 0, 0));

dc.SelectObject(&pen);

 

//------------------Aнімація-----------//

phi = ToRadian(180);

int r = 60;

int t = 20;

Square square = Square();

 

Vector2 pos = Vector2(400 + r + k + t / 2, 250);

bool first = true;

bool rotate = true;

double phi2 = ToRadian(45);

 

CBrush brush;

brush.CreateSolidBrush(RGB(0, 0, 0)); // колір шестикутника

CBrush brush2;

brush2.CreateSolidBrush(RGB(160, 160, 160)); //колір арки

while (true)

{

 

for (int i = 0; i<2; i++)

{

//---------kolo_1---------

if (i == 0)

{

dc.SelectStockObject(BLACK_BRUSH);

dc.SelectStockObject(BLACK_PEN);

}

else

{

dc.SelectStockObject(WHITE_BRUSH);

dc.SelectStockObject(WHITE_PEN);

}

 

double teta = PI / 20.0;

 

 

if (rotate)

pos = Vector2(400, 250) + Matrix::CreateRotation(Vector2(first? r + k + t / 2: r - t / 2), phi2, first? false: true);

 

square.Center = pos;

square.CreateRotation(phi);

 

dc.MoveTo(square.vertex[0].X, square.vertex[0].Y);

for (int j = 0; j<6; j++)

dc.LineTo(square.vertex[j].X, square.vertex[j].Y);

dc.LineTo(square.vertex[0].X, square.vertex[0].Y);

 

dc.MoveTo(400 + r, 250);

dc.AngleArc(400, 250, r, 0, 180);

dc.MoveTo(400 + r, 250);

dc.LineTo(400 + r + k, 250);

dc.AngleArc(400, 250, r + k, 0, 180);

dc.LineTo(400 - r, 250);

 

 

if (i == 1)

{

dc.FloodFill(square.Center.X, square.Center.Y, RGB(255, 255, 255));

dc.FloodFill(400 - r - t / 2, 240, RGB(255, 255, 255));

 

phi += 2 * teta;

if (rotate)

phi2 += teta / 2;

if (first && rotate)

if (phi2 > ToRadian(233))

{

rotate = false;

}

 

if (first &&!rotate)

{

pos.X += 3;

if (pos.X > 400 - r)

{

first = false;

rotate = true;

phi2 = ToRadian(130);

}

}

 

if (!first && rotate)

if (phi2 > ToRadian(330))

{

rotate = false;

}

if (!first &&!rotate)

{

pos.X += 3;

if (pos.X > 400 + r + k + t / 2)

{

first = true;

rotate = true;

phi2 = ToRadian(45);

}

}

 

}

if (i == 0)

{

dc.SelectObject(brush);

dc.FloodFill(square.Center.X, square.Center.Y, RGB(0, 0, 0));

dc.SelectObject(brush2);

dc.FloodFill(400 - r - t / 2, 240, RGB(0, 0, 0));

Sleep(180);

}

}

}

 

}

 

Результат виконання програми

 

Висновок.

В даній розрахунковій роботі розроблено алгоритми та написана програма мовою C++, що виводить на екран монітору графік функції .

Також в цій розрахунковій роботі розроблено алгоритми та написана програма мовою C++, що виводить на екран монітору рухоме зображення.

В програмі використовуються матричні перетворення. Результуюча матриця руху формується з добутку трьох матриць переносу та однієї матриці повороту.


Дата добавления: 2016-01-04; просмотров: 16; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!