ПОБУДОВА ЗОБРАЖЕНЬ НА ЕКРАНІ КОМП’ЮТЕРА

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

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

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

Рік:
2012
Тип роботи:
Розрахунково - графічна робота
Предмет:
Програмування комп’ютерної графіки
Група:
ЗІ-32

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА Кафедра Захист інформації Розрахунково-графічна робота №1 з курсу: „ Програмування комп’ютерної графіки ” на тему: „ ПОБУДОВА ЗОБРАЖЕНЬ НА ЕКРАНІ КОМП’ЮТЕРА ” Львів – 2012 Мета роботи : набути практичних навиків в складанні програм для побудови зображень на екрані комп’ютера за допомогою засобів мови С. Варіант 1 Завдання : Побудувати графік функції, заданої таблично. Графік повинен відображати результати розрахунків, які записані у файлі на диску. Масштаб розмітки осей координат графіка повинен відповідати реальним результатам розрахунків. Параметри для побудови графіка визначені в таблиці 2. Варіант завдання визначає викладач. Необхідно передбачити “плаваючий” центр координат – основну частину екрану мають займати ті чверті, в яких знаходиться графік функції.. y=arctg(x) x =[-50;50] Блок-схема алгоритму програми / / / / Розрахунок функціональних залежностей для побудови графіка. xd = b-a; xmashd = rect.right - rect.left; yd = ymax-ymin; ymashd = rect.bottom - rect.top; ky = (ymashd - y_retreat_bottom - y_retreat_top)/yd; kx = (xmashd - x_retreat_left - x_retreat_right)/xd; x_axis = x_retreat_left - kx * a; y_axis = y_retreat_top + ky * ymax; Список ідентифікаторів констант, змінних, процедур і функцій, використовуваних в програмі та їх пояснення hPen – перо товщиною 3 рх; CPen – функція для створення пера; LineTo – проводить лінію з поточної вершини до точки, координати якої задані; MoveToEx – переміщує поточну вершину; FloodFill – зафарбовує замкнуту область; SelectObject – вибирає потрібний пензль або перо; DeleteObject - видаляє потрібний пензль або перо; GetClientRect – визначення параметрів екрану користувача; CString – оголошення змінної для виведення тексту; kx, ky – змінні коефіціентів перетворення; xd, yd, xmashd, ymashd - різниця мінімальних і максимальних координат; xmash, ymash – машинні координати; x, y - реальні координати; h – інтервал; ymax, ymin, – мінімальні і максимальні значення функції; a = -50; - Початкове значення проміжку; b = 50; - Кінцеве значення проміжку ; x_retreat_left, x_retreat_right, y_retreat_bottom, y_retreat_top - Відступи по краях; x_axis, y_axis – машинны координати осей; F – змінна функції; Y, X, O, d, ss, ssss, A – змінні для виведення розмітки осей. Текст програми: // ChildView.cpp : implementation of the CChildView class // #include "stdafx.h" #include "lr1.h" #include "ChildView.h" #include <cmath> #ifdef _DEBUG #define new DEBUG_NEW #endif // 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; } double F(double x) { return atan(x); // Задаємо функцію } void CChildView::OnPaint() { SEGdc dcc(this); // device context for painting RECT rect; GetClientRect(&rect); // Змінні для побудови графіку - ПОЧАТОК int xmash, ymash, x_axis, y_axis, x_retreat_left, x_retreat_right, y_retreat_bottom, y_retreat_top; double y, kx, ky, xmashd, xd, ymashd, yd, a, b, h, ymax, ymin; x_retreat_left = x_retreat_right = y_retreat_bottom = 70; // Відступи по краях y_retreat_top = 250; a = -50; // Початкове значення проміжку b = 50; // Кінцеве значення проміжку h = 0.01; // Крок // Змінні для побудови графіку - КІНЕЦЬ //Визначення мінімального і максимального значення - ПОЧАТОК 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; } //Визначення мінімального і максимального значення - КІНЕЦЬ //Визначення параметрів для побудови графіку xd = b-a; xmashd = rect.right - rect.left; yd = ymax-ymin; ymashd = rect.bottom - rect.top; ky = (ymashd - y_retreat_bottom - y_retreat_top)/yd; kx = (xmashd - x_retreat_left - x_retreat_right)/xd; x_axis = x_retreat_left - kx * a; y_axis = y_retreat_top + ky * ymax; int x_axis1 = x_axis, y_axis1 = y_axis; if(x_axis1 < x_retreat_left) x_axis1 = x_retreat_left; if(x_axis1 > rect.right - x_retreat_right) x_axis1 = rect.right - x_retreat_right; if(y_axis1 < y_retreat_top) y_axis1 = y_retreat_top; if(y_axis1 > rect.bottom - y_retreat_bottom) y_axis1 = rect.bottom - y_retreat_bottom; //Будуємо осі координат - ПОЧАТОК dcc.MoveTo(x_axis1, y_axis1); dcc.LineTo(x_axis1, y_retreat_top - 15); dcc.MoveTo(x_axis1 - 3, y_retreat_top - 5); dcc.LineTo(x_axis1, y_retreat_top - 15); dcc.MoveTo(x_axis1 + 3, y_retreat_top - 5); dcc.LineTo(x_axis1, y_retreat_top - 15); dcc.MoveTo(x_axis1, y_axis1); dcc.LineTo(x_axis1, rect.bottom-y_retreat_bottom + 5); const CString Y("Y"); dcc.TextOutW(x_axis1 - 15, y_retreat_top - 10, Y); dcc.MoveTo(x_axis1, y_axis1); dcc.LineTo(x_retreat_left - 5, y_axis1); dcc.MoveTo(x_axis1, y_axis1); dcc.LineTo(rect.right - x_retreat_right + 15, y_axis1); dcc.MoveTo(rect.right - x_retreat_right + 5, y_axis1 - 3); dcc.LineTo(rect.right - x_retreat_right + 15, y_axis1); dcc.MoveTo(rect.right - x_retreat_right + 5, y_axis1+3); dcc.LineTo(rect.right - x_retreat_right + 15, y_axis1); const CString X("X"); dcc.TextOutW(rect.right - x_retreat_right + 10, y_axis1 - 25, X); const CString O("O"); if (x_axis1 <= x_retreat_left || x_axis1 >= rect.right - x_retreat_right || y_axis1 <= y_retreat_top || y_axis1 >= rect.bottom - y_retreat_bottom); else dcc.TextOutW(x_axis1 - 15, y_axis1 + 5, O); //Розмітка по осі Х - ПОЧАТОК double d = b; char str[20]; sprintf_s(str, 20, "%5.2lf", d); CString ss(str); dcc.TextOutW(x_axis + d*kx - 10, y_axis1 + 5, ss); dcc.MoveTo(x_axis + b*kx, y_axis1 - 2); dcc.LineTo(x_axis + b*kx, y_axis1 + 2); double H = (b - a)/8; d = a; int w = b/5; for(int i = 0; i < 8; i++) { sprintf_s(str, 20, "%3.2lf", d); CString A(str); dcc.TextOutW(x_axis + d*kx, y_axis1 + 5, A); dcc.MoveTo(x_axis + d*kx, y_axis1 - 2); dcc.LineTo(x_axis + d*kx, y_axis1 + 2); d += H; } //Розмітка по осі Х - КІНЕЦЬ //Розмітка по осі У - ПОЧАТОК d = ymax; sprintf_s(str, 20, "%5.2lf", d); CString ssss(str); dcc.TextOutW(x_axis1 - 55, y_axis - ymax*ky, ssss); dcc.MoveTo(x_axis1 - 2, y_axis - ymax*ky); dcc.LineTo(x_axis1 + 2, y_axis - ymax*ky); H = (ymax - ymin)/5; d = ymin; for (int i = 0; i < 5; i++) { sprintf_s(str, 20, "%3.2lf", d); CString A(str); dcc.TextOutW(x_axis1 - 50, y_axis - d*ky - 5,A); dcc.MoveTo(x_axis1 - 2,y_axis - d*ky); dcc.LineTo(x_axis1 + 2, y_axis - d*ky); d += H; } //Розмітка по осі У - КІНЕЦЬ //Будуємо осі координат - КІНЕЦЬ //Власне сама побудова графіку - ПОЧАТОК HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); HGDIOBJ hOldPen = SelectObject(dcc, hPen); dcc.MoveTo(x_axis + a*kx, y_axis - ky*F(a)); dcc.LineTo(x_axis + a*kx, y_axis - ky*F(a)); for (double x = a; x < b; x = x + h) { xmash = x_axis + x*kx; y = F(x); ymash = y_axis - y*ky; dcc.LineTo(xmash, ymash); } SelectObject(dcc, hOldPen); DeleteObject(hPen); //Власне сама побудова графіку – КІНЕЦЬ } Результат роботи програми / Висновок Виконавши завдання даної роботи я набув практичних навиків в складанні програми для побудови зображень на екрані комп’ютера в середовищі Microsoft Visual Studio C++ 2008. МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА Кафедра Захист інформації Розрахунково-графічна робота №2 з курсу: „ Програмування комп’ютерної графіки ” на тему: „ ПОБУДОВА ЗОБРАЖЕНЬ НА ЕКРАНІ КОМП’ЮТЕРА ” Виконав: ст. гр. ЗІ-32 Андрушків О.Ю. Прийняв: Петришин А. В. Львів – 2012 Мета роботи : набути практичних навиків в складанні програм для побудови зображень на екрані комп’ютера за допомогою засобів мови С. Варіант 1 Завдання : Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення: Кочення правильного шестикутника зі стороною a=20 по поверхні арки. Параметри арки: b=40, r=60, R. Кольори заповнення арки та шестикутника різні.  Блок-схема алгоритму програми / / / / / / Розрахунок матриці перетворень для рухомого зображення struct Vec { double x; double y; }; // Center - центр повороту // Angle - в радіанах кут повороту Vec Rotate(const Vec& Center, double Angle, const Vec& Point) { double dx = Point.x - Center.x; double dy = Point.y - Center.y; Vec Res; Res.x = Center.x + cos(Angle) * dx + sin(Angle) * dy; Res.y = Center.y - sin(Angle) * dx + cos(Angle) * dy; return Res; } Список ідентифікаторів констант, змінних, процедур і функцій, використовуваних в програмі та їх пояснення h_brush – пензель; hPen – перо товщиною 2 рх; CPen – функція для створення пера; LineTo – проводить лінію з поточної вершини до точки, координати якої задані; MoveTo – переміщує поточну вершину; FloodFill – зафарбовує замкнуту область; SelectObject – вибирає потрібний пензль або перо; DeleteObject - видаляє потрібний пензль або перо; GetClientRect – визначення параметрів екрану користувача; Vec – структура для повороту координати; Rotate – функція повороту координати; Flood – функція зафарбовування шустикутника; unFlood – функція приховування кольору заливки шестикутника; Center - центр повороту; Angle - кут повороту в радіанах; x, y – машинні координати; sleeptime - час спання; rect_pos_x1 - Координата Х верхнього лівого кута прямокутника; rect_pos_y1 - Координата У верхнього лівого кута прямокутника; rect_pos_x2 - Координата Х нижнього правого кута прямокутника; rect_pos_y2 - Координата У нижнього правого кута прямокутника; rect_сpos_x - Координата Х центру прямокутника; rect_сpos_y - Координата У центру прямокутника; R_small = 60 - Радіус малого півкола; R = 100 - Радіус великого півкола point_x[40][6] - Координати вершин шеcтикутника point_y[40][6] – пронумеровано вершини шестикутника 0 - а, 1 - b, 2 - c, 3 - d, 4 - e, 5 – f; seg_angle = 60 * 3.1415926535897932384626433832795/180; - Величина кута; color_R[7] = {0, 0, 204, 204, 0, 255, 255}; - масив з палітрою R для заливки шеcтикутника; color_G[7] = {51, 204, 204, 0, 204, 0, 255}; - масив з палітрою G для заливки шеcтикутника; color_B[7] = {204, 51, 0, 204, 204, 51, 0}; - масив з палітрою B для заливки шеcтикутника; color_pos_x[40]; - координата для заливки Х; color_pos_y[40]; - координата для заливки У; Текст програми: // ChildView.cpp : implementation of the CChildView class // #include "stdafx.h" #include "lr1.h" #include "ChildView.h" #include <cmath> #include "seg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif /* Функція розрахунку координат для повороту фігури*/ struct Vec { double x; double y; }; // Center - центр повороту // Angle - в радіанах Vec Rotate(const Vec& Center, double Angle, const Vec& Point) { double dx = Point.x - Center.x; double dy = Point.y - Center.y; Vec Res; Res.x = Center.x + cos(Angle) * dx + sin(Angle) * dy; Res.y = Center.y - sin(Angle) * dx + cos(Angle) * dy; return Res; } // 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 CChildView::OnPaint() { SEGdc dcc(this); // device context for painting RECT rect; GetClientRect(&rect); int rect_pos_x1 = rect.right - 350; // Координата Х верхнього лівого кута прямокутника int rect_pos_y1 = rect.top + 20; // Координата У верхнього лівого кута прямокутника int rect_pos_x2 = rect.right - 50; // Координата Х нижнього правого кута прямокутника int rect_pos_y2 = rect.top + 220; // Координата Х нижнього правого кута прямокутника int rect_сpos_x = (rect_pos_x2 - rect_pos_x1)/2 + rect_pos_x1; // Координата Х центру прямокутника int rect_сpos_y = (rect_pos_y2 - rect_pos_y1)/2 + rect_pos_y1; // Координата У центру прямокутника int R_small = 60; //Радіус малого півкола int R = 100; //Радіус великого півкола int point_x[40][6]; // Координати точок шеcтикутника int point_y[40][6]; // 0 - а, 1 - b, 2 - c, 3 - d, 4 - e, 5 - f. int sleeptime = 300; // час спання double seg_angle = 60 * 3.1415926535897932384626433832795/180; //Величина кута. int color_R[7] = {0, 0, 204, 204, 0, 255, 255}; // масив з палітрою R для заливки шестикутника int color_G[7] = {51, 204, 204, 0, 204, 0, 255}; // масив з палітрою G для заливки шестикутника int color_B[7] = {204, 51, 0, 204, 204, 51, 0}; // масив з палітрою B для заливки шестикутника int color_pos_x[40]; // координата для заливки Х int color_pos_y[40]; // координата для заливки У dcc.Rectangle(rect_pos_x1, rect_pos_y1, rect_pos_x2, rect_pos_y2); // Будуємо підкову - ПОЧАТОК hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); hOldPen = SelectObject(dcc, hPen); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R, 0, 180); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R_small, 0, 180); dcc.LineTo (rect_сpos_x - R, rect_pos_y2 - 30); SelectObject(dcc, hOldPen); DeleteObject(hPen); dcc.Flood (rect_сpos_x, rect_сpos_y, RGB(254,0,0)); // Будуємо підкову - КІНЕЦЬ // 1 - ий шестикутник: визначаємо координати його врешин - ПОЧАТОК point_x[0][0] = rect_сpos_x + R; point_y[0][0] = rect_pos_y2 - 30; int sc_oldpos_x = point_x[0][0], sc_oldpos_y = point_y[0][0]; // змінні кородинат for (int i = 0; i < 5; i++) { Vec Center = { point_x[0][0] + 20, point_y[0][0] }; Vec OldPos = { point_x[0][i], point_y[0][i] }; Vec NewPos = Rotate(Center, seg_angle, OldPos); point_x[0][i+1] = NewPos.x; point_y[0][i+1] = NewPos.y; } // 1 - ий шестикутник: визначаємо координати його врешин - КІНЕЦЬ //Рзраховуємо і заносимо в масив координати вершин решти шестикутників - ПОЧАТОК //це будуть шестикутники гострі for (int i = 2; i < 12; i = i+2) { for (int j = 0; j < 6; j++) { Vec Center = { rect_сpos_x, rect_pos_y2 - 30 }; Vec OldPos = { point_x[i-2][j], point_y[i-2][j] }; Vec NewPos = Rotate(Center, seg_angle/2, OldPos); point_x[i][j] = NewPos.x; point_y[i][j] = NewPos.y; } } //Рзраховуємо і заносимо в масив координати вершин решти шестикутників - КІНЕЦЬ //Розраховуємо 1 - й тупий шестикутник - ПОЧАТОК //перенос центру і розрахунок шестикутника sc_oldpos_x = point_x[0][0] + 18, sc_oldpos_y = point_y[0][0]; for (int i = 1; i < 12; i++) { Vec Center = { rect_сpos_x, rect_pos_y2 - 30 }; Vec OldPos = { sc_oldpos_x, sc_oldpos_y }; Vec NewPos = Rotate(Center, seg_angle/4, OldPos); sc_oldpos_x = NewPos.x; sc_oldpos_y = NewPos.y; if (i == 1) { point_x[1][0] = NewPos.x + 4; point_y[1][0] = NewPos.y + 18; color_pos_x[0] = point_x[0][0] + 18; color_pos_y[0] = point_y[0][0]; } color_pos_x[i] = NewPos.x; color_pos_y[i] = NewPos.y; } sc_oldpos_x = point_x[0][0] + 18, sc_oldpos_y = point_y[0][0]; // тут буде перший тупий шестикутник for (int i = 0; i < 5; i++) { Vec Center = { point_x[1][0]-4, point_y[1][0]-18}; Vec OldPos = { point_x[1][i], point_y[1][i] }; Vec NewPos = Rotate(Center, seg_angle, OldPos); point_x[1][i+1] = NewPos.x; point_y[1][i+1] = NewPos.y; } //Розраховуємо 1 - й тупий шестикутник - КІНЕЦЬ //Рзраховуємо і заносимо в масив координати вершин решти шестикутників - ПОЧАТОК //це будуть шестикутники тупі for (int i = 3; i < 12; i = i+2) { for (int j = 0; j < 6; j++) { Vec Center = { rect_сpos_x, rect_pos_y2 - 30 }; Vec OldPos = { point_x[i-2][j], point_y[i-2][j] }; Vec NewPos = Rotate(Center, seg_angle/2, OldPos); point_x[i][j] = NewPos.x; point_y[i][j] = NewPos.y; } } //Рзраховуємо і заносимо в масив координати вершин решти шестикутників - КІНЕЦЬ //Власне сама анімація. Sleep(sleeptime); int j = 0; for (int i = 0; i < 12; i = i++) { if (j == 7) j = 0; dcc. Sixtagon(point_x[i][0], point_y[i][0], point_x[i][1], point_y[i][1], point_x[i][2], point_y[i][2], point_x[i][3], point_y[i][3], point_x[i][4], point_y[i][4], point_x[i][5], point_y[i][5],RGB(0,0,0)); dcc. Flood (color_pos_x[i], color_pos_y[i], RGB(color_R[j],color_G[j],color_B[j])); j++; Sleep(sleeptime); dcc.unFlood (color_pos_x[i], color_pos_y[i]); dcc. Sixtagon(point_x[i][0], point_y[i][0], point_x[i][1], point_y[i][1], point_x[i][2], point_y[i][2], point_x[i][3], point_y[i][3], point_x[i][4], point_y[i][4], point_x[i][5], point_y[i][5],RGB(255,255,255)); //В звязку з тим, при побудові зображень використовується тип даних integer, //виникають втрати даних, і зображення шестикутника спотворює арку. // Видалення старої підкови - ПОЧАТОК dcc.unFlood (rect_сpos_x, rect_сpos_y); hPen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255)); hOldPen = SelectObject(dcc, hPen); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R, 0, 180); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R_small, 0, 180); dcc.LineTo (rect_сpos_x - R, rect_pos_y2 - 30); SelectObject(dcc, hOldPen); DeleteObject(hPen); // Видалення старої підкови - КІНЕЦЬ // Поновлюємо підкову - ПОЧАТОК hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); hOldPen = SelectObject(dcc, hPen); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R, 0, 180); dcc.MoveTo (rect_сpos_x + R_small, rect_pos_y2 - 30); dcc.AngleArc (rect_сpos_x, rect_pos_y2 - 30, R_small, 0, 180); dcc.LineTo
Антиботан аватар за замовчуванням

16.01.2013 12:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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