DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

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

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Звіт до розрахунково-графічної роботи з курсу «Програмування комп’ютерної графіки»

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
ЗІ
Кафедра:
Кафедра програмного забезпечення

Інформація про роботу

Рік:
2015
Тип роботи:
Розрахунково - графічна робота
Предмет:
Програмування комп’ютерної графіки
Група:
КН-31
Коротко про документ

Про що ця робота

У звіті наведено результати розрахунково-графічної роботи з програмування комп'ютерної графіки. Розроблено алгоритми та код на C++ для побудови графіків функцій із плаваючим центром та анімації об'єктів за допомогою матричних перетворень.

У роботі розглядаються

  • Програмування комп'ютерної графіки
  • Матричні перетворення
  • Анімація об'єктів
  • Масштабування графіків
  • Мова програмування C++
  • Програмна реалізація алгоритмів

Зміст і розділи

  1. Завдання
  2. Розрахунок функціональних залежностей для побудови графіка
  3. Розрахунок матриці перетворень для рухомого зображення
  4. Список ідентифікаторів програми
  5. Блок-схеми основної програми
  6. Текст програми
  7. Результат виконання програми
Для кого:Студенти та викладачі технічних спеціальностей вищих навчальних закладів
Викладачі:Не вказано

Ключові поняття

матриця перетвореньплаваючий центр координатмасштабний коефіцієнтанімаціяграфічне вікноC++функціятабуляціяповорот об'єктаперенесення

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” Звіт до розрахунково-графічної роботи з курсу “Програмування комп’ютерної графіки” 1.1 Завдання Варіант 11-11-15 Побудувати графік функції ,  заданої таблично. Графік має відображати результати розрахунків, які записані у файлі на диску, а масштаб розмітки осей координат графіка – реальним результатам розрахунків. Параметри для побудови графіка: № варіанта Тип лінії для побудови осей графіка Товщина лінії (пікселів) Колір ліній  11 ____________ 6 Orandge  Необхідно передбачити “плаваючий” центр координат, – основну частину екрану мають займати ті чверті, в яких знаходиться графік функції. Структура зображення Пояснення   Взаємно протилежний рух двох кульок діаметром d з різними швидкостями по сторонах замальованої рівнобічної трапеції. При зустрічі кульки відштовхуються. Кольори кульок і поверхні різні. Параметри: v1 ≠ v2, a = 120, b = 180, h = 130, d = 20   1.2 Розрахунок функціональних залежностей для побудови графіка. Оскільки реальні координати графіка функції, що виводиться на екран можуть бути або значно більшими, або значно меншими за машинні координати екрану монітору, необхідно визначити значення масштабних коефіцієнтів стискання або розтягу для функції, що виводиться на екран. Позначимо максимальні та мінімальні значення реальних координат по осях X та Y - mахx, minx, maxy, miny. Приймаємо машинний робочий діапазон для графіка функції 540 пікселів по осі X та 400 пікселів по осі Y. Тоді масштабні коефіцієнти для графіка по осях X та Y дорівнюють, відповідно:   При виведенні графіка функції на екран монітору значення реальних координат заданої функції домножуємо на масштабні коефіцієнти і додаємо координати машинного центру координат (X0,Y0):   2.1. Завдання. Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення. Параметри зображення задані в пікселах. Графік і вікно з рухомим зображенням повинні бути присутні на екрані одночасно. 2.2 Розрахунок матриці перетворень для рухомого зображення. Результуюча матриця М, руху є добутком трьох матриць: переносу T1, T2 і повороту R, причому перша матриця відповідає перенесенню центру повороту в початок координат на відстань -dx та -dy, друга – повороту об’єкта на кут φ, третя – поверненню об’єкта з початку координат на площину зображення (координати dx та dy).  Перемноживши матрицю-рядок із старими координатами на результуючу матрицю руху, одержимо матрицю з новими координатами рухомої точки.   3. Список ідентифікаторів програми. y- поточне значення функції dXmash,dXreal,dYmash,dYreal, Kx,Ky масштабні коефіцієнти a –початок відрізку табуляції b- кінець відрізку табуляції h– крок зміни реального значення аргументу; Ymax, Ymin - максимальне та мінімальне реальні значення аргументу; 4. Блок-схеми основної програми побудови графіка та анімації. Графік 1 2 3 4 - + - 5 7 8 9 10 - + 11 12 13 + 14 15 + 16 17 18 + 19 + 20 21 22 23 24 - 25 + - 26 - 27 Анімація 1 - 2 + 3 + - 4 + 5 - 6 + 7 - 8 + 9 - 10 + 11 - 12 + 13 5. Текст програми. Файл: 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 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; } }; 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 "main.h" #include <conio.h> #include <vector> #include<iostream> #include <math.h> #include <fstream> using namespace std; #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 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; CBrush m_brush; pen.CreatePen(PS_SOLID,1,RGB(100,0,0));// колір дуги br.CreateSolidBrush(RGB(100,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(610,200); dcc->LineTo(730,200); dcc->LineTo(760,330); dcc->LineTo(580,330); dcc->LineTo(610,200); m_brush.CreateSolidBrush(RGB(153,217,234));//його колір dcc->SelectObject(&m_brush); dcc->FloodFill(645,245,RGB(100,0,0)); m_brush.DeleteObject(); pen.DeleteObject(); br.DeleteObject(); Sleep(30); 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); pen.DeleteObject(); } double F(double x){ return tanh(x); } //функція 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=-0.001; b=0; h=0.00001; 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-rect.left; dYreal=Ymax-Ymin;dYmash=rect.bottom-rect.top; Ky=(dYmash-VXL-VXR)/dYreal;Kx=(dXmash-VYB-VYT)/dXreal; Xo=VXL-Kx*a; Yo=VYT+Ky*Ymax; 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; // Osi kokrdinat pochatok dc.MoveTo(Xo1,Yo1); dc.LineTo(Xo1,VYT-25); dc.MoveTo(Xo1-5,VYT); dc.LineTo(Xo1,VYT-25); dc.MoveTo(Xo1+5,VYT); dc.LineTo(Xo1,VYT-25); const CString Y("Y"); dc.TextOutW(Xo1-15,VYT-25, 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-15+25,Yo1-25, 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//////// double d=b; char str[20]; sprintf_s (str,20,"%5.4lf",d); CString ss(str); dc.TextOutW(Xo+d*Kx-10,Yo1+5,ss); 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 kinets///////// ////////Ymax i Ymin/////////// d=Ymax; sprintf_s (str,20,"%5.2lf",d); CString ssss(str); dc.TextOutW(Xo1-65,Yo-Ymax*Ky,ssss); dc.MoveTo(Xo1-2,Yo-Ymin*Ky); dc.LineTo(Xo1+2,Yo-Ymin*Ky); H=(Ymax-Ymin)/5; d=Ymin; for(int i=0;i<5;i++) { sprintf_s(str,20,"%3.2lf",d); CString A(str); dc.TextOut(Xo1-65,Yo-d*Ky-5,A); dc.MoveTo(Xo1-2,Yo-d*Ky); dc.LineTo(Xo1+2,Yo-d*Ky); d+=H; } ////////Ymax i Ymin kinetc/////////// ////////Osi koordinat kinetc///////// CRect rc; GetClientRect(rc); int width = 6; // задає товщину ліній функції LOGBRUSH logBrush; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = RGB(255, 0, 0); CPen pen1(PS_SOLID|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); // Animation///////////////////// for(;;) { TPmatrix P(1,1),B(1,1),P1(600,190),P2(760,340),P3(570,340),P4(760,340),P5(740,190); TMatrix T1(-600,-190),T2(600,190),M,T3(-760,-340),T4(760,340); duha(&dc,P); for(double k=0,i=0,j=0;j<=150;k+=3.9,i-=1,j+=5) { TMatrix T1(-600,-190); TMatrix T2(620+k,190);//рух вправо TMatrix R(0); M=T1*R*T2; P=P1*M; duha(&dc,P); TMatrix T3(-570-i,-340-j),T4(570+i,340+j); //рух вниз TPmatrix P2(600+i,190+j); M=T3*T4; B=P2*M; duha(&dc,B); } for(double k=0,i=0,j=0;j<=150;k+=6,i+=1,j+=5) { TMatrix T1(-570,-340); TMatrix T2(570+k,340);//рух вправо TMatrix R(0); M=T1*R*T2; P=P3*M; duha(&dc,P); TMatrix T3(-770-i,-340-j),T4(770+i,340+j); //рух вниз TPmatrix P2(740+i,190+j); M=T3*T4; B=P2*M; duha(&dc,B); } for(double k=0,i=0,j=0;j>=-150;k+=6,i-=1,j-=5) { TMatrix T1(-760,-340); TMatrix T2(760-k,340);//рух вліво TMatrix R(0); M=T1*R*T2; P=P4*M; duha(&dc,P); TMatrix T3(-740-i,-190-j),T4(740+i,190+j); //рух вгору TPmatrix P2(770+i,340+j); M=T3*T4; B=P2*M; duha(&dc,B); } for(double k=0,i=0,j=0;j>=-150;k+=3.9,i+=1,j-=5) { TMatrix T1(-760,-190); TMatrix T2(760-k,190);//рух вліво TMatrix R(0); M=T1*R*T2; P=P5*M; duha(&dc,P); TMatrix T3(-600-i,-190-j),T4(600+i,190+j); //рух вгору TPmatrix P2(570+i,340+j); M=T3*T4; B=P2*M; duha(&dc,B); } } } 6. Результат виконання програми  Висновок. В даній розрахунковій роботі розроблено алгоритми та написана програма мовою C++, що виводить на екран монітору графік функції . Програма визначається універсальністю для побудови графіка функції в будь-якій чверті системи координат за рахунок використання «плаваючого» початку координат. Також в цій розрахунковій роботі розроблено алгоритми та написана програма мовою C++, що виводить на екран монітору рухоме зображення. В програмі використовуються матричні перетворення. Результуюча матриця руху формується з добутку трьох матриць переносу та однієї матриці повороту.
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!