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

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

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

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

Звіт до лабораторної роботи №4 з курсу «Програмування комп’ютерної графіки»: Тривимірні побудови. Буфер глибини. Видові параметри. Паралельна і перспективна проекції

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

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

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

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

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

У звіті до лабораторної роботи досліджено методи тривимірного моделювання та побудови об'ємних зображень за допомогою бібліотеки OpenGL. Розглянуто налаштування буфера глибини, видових параметрів, а також паралельної і перспективної проєкцій.

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

  • Тривимірне моделювання
  • Буфер глибини
  • Видові параметри
  • Паралельна проєкція
  • Перспективна проєкція
  • OpenGL
  • Графічні примітиви

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

  1. Мета роботи
  2. Завдання
  3. Варіант 3
  4. Текст програми
  5. Результат виконання програми / висновок
Для кого:Студенти технічних спеціальностей, що вивчають комп'ютерну графіку та програмування.
Викладачі:Опірський І. Р.

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

OpenGLбуфер глибинипроєкціякубвершиниграніповорот осейвізуалізаціятривимірні побудовианімація

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА Кафедра ЗІ З В І Т До лабораторної роботи №4 з курсу: «Програмування комп’ютерної графіки» на тему: «Тривимірні побудови. Буфер глибини. Видові параметри. Паралельна і перспективна проекції» Варіант №3 Львів – 2016 Мета роботи: з'ясувати особливості тривимірного моделювання, побудови об'ємних зображень як проекцій на екранній плоскості; дати поняття про параметри вигляду. Завдання: Завдання 1. Побудуйте зображення трьох плоских фігур в просторі (відповідно до варіанту). Оцініть отриманий результат: чи правильно замальовані фігури, якщо немає - поясніть чому. Завдання 2. Встановіть режим перевірки буфера глибини в програмі до завдання 1. Порівняєте отриманий результат з попереднім. Завдання 3. Встановіть видові параметри відповідно до варіанту і паралельну проекцію; побудуйте зображення куба з координатами вершин, рівними по модулю 1 (куб замальовується за допомогою 6 квадратів). Оцінити результат. Завдання 4. Встановіть перспективну проекцію і побудуйте каркасне зображення куба Завдання 5. Поверніть осі координат відповідно до варіанту і побудуйте зображення куба. Оцінити результат. Чому частки куба відсічені? Змініть видові параметри так, щоб куб замальовувався без відсікань. Змініть код програми так, щоб кожна грань куба замальовувалася своїм кольором. Завдання 6. Напишіть програму, в якій зображення куба змінюється при натисненні клавіш (відповідно до варіанту). Варіант 3  Фігури (задані вершинами)  Параметри вигляду  Поворот осей  До завдання 6    Трикутник: (1, 1, 0) (1, 0, 1) (0, 1, 1) Чотирикутник: (0.8, 0.7, 1) (-0.8, 0.7, 1) (-0.8, -0.7, -0.8) (0.8, -0.7, -0.8) Трикутник: (0, 0.5, -0.5) (-0.5, 0, -0.5) (0.5, 0, 0.5)  -0.85, 0.85 -0.7, 0.7 6, 12  Навколо OX: -25 Навколо OY: 60  Куб повертається при натисненні на деяку клавішу на заданий кут   Текст програми: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Tao.FreeGlut; using Tao.OpenGl; namespace Lab_4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); AnT.InitializeContexts(); } private void AnT_Load(object sender, EventArgs e) { //ініціалізація Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); // очистка вікна Gl.glClearColor(255, 255, 255, 1); // установка порта виводу у відповідності з розмірами елемента Gl.glViewport(0, 0, AnT.Width, AnT.Height); // Проекція Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(100.0f, (float)AnT.Width / (float)AnT.Height, 0.8f, 1000.0f); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); // настройка параметрів візуалізації // } private void button1_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); AnT.Invalidate(); Gl.glTranslatef(-0.5f, 0.0f, -3.5f); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(-1.0f, 0.0f, -1.0f); Gl.glColor3f(0.0f, 0, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glEnd(); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(-0.7f, -0.7f, 0); Gl.glVertex3f(-0.7f, 0.7f, 0); Gl.glVertex3f(0.7f, 0, 0); Gl.glEnd(); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(0, 0, -0.9f); Gl.glVertex3f(-1, -0.8f, 0.5f); Gl.glVertex3f(1, 1, 1); Gl.glEnd(); Gl.glFlush(); } private void button2_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Gl.glLoadIdentity(); AnT.Invalidate(); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glTranslatef(-0.5f, 0.0f, -3.5f); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(-1.0f, 0.0f, -1.0f); Gl.glColor3f(0.0f, 0, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glEnd(); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(-0.7f, -0.7f, 0); Gl.glVertex3f(-0.7f, 0.7f, 0); Gl.glVertex3f(0.7f, 0, 0); Gl.glEnd(); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(0, 0, -0.9f); Gl.glVertex3f(-1, -0.8f, 0.5f); Gl.glVertex3f(1, 1, 1); Gl.glEnd(); Gl.glFlush(); Gl.glDisable(Gl.GL_DEPTH_TEST); } private void button3_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); AnT.Invalidate(); Gl.glOrtho(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8); Gl.glTranslatef(-4.5f, 0.0f, 6.5f); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(-1.0f, 0.0f, -1.0f); Gl.glColor3f(0.0f, 0, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glEnd(); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(-0.7f, -0.7f, 0); Gl.glVertex3f(-0.7f, 0.7f, 0); Gl.glVertex3f(0.7f, 0, 0); Gl.glEnd(); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex3f(0, 0, -0.9f); Gl.glVertex3f(-1, -0.8f, 0.5f); Gl.glVertex3f(1, 1, 1); Gl.glEnd(); Gl.glTranslatef(4.5f, 0.0f, -4.5f); Gl.glBegin(Gl.GL_QUADS); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glColor3f(1.0f, 0.0f, 0.0f); //red Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); //green Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); Gl.glFlush(); } private void button4_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(1.0f, 0, 0); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Gl.glLoadIdentity(); Gl.glFrustum(-0.8f, 0.8f, -0.8f, 0.9f, 3, 6); Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y Gl.glBegin(Gl.GL_QUADS); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glColor3f(1.0f, 0.0f, 0.0f); //red Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); //green Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); Gl.glFlush(); AnT.Invalidate(); } private void button5_Click(object sender, EventArgs e) { //cube Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); AnT.Invalidate(); Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE); Gl.glLineWidth(3); Gl.glBegin(Gl.GL_QUADS); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glColor3f(1.0f, 0.0f, 0.0f); //red Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); //green Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); Gl.glFlush(); } private void button6_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); AnT.Invalidate(); } private void button7_Click(object sender, EventArgs e) { Application.Exit(); } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.P) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(1.0f, 0, 0); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Gl.glLoadIdentity(); Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8); Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y Gl.glScalef(0.5f,0.5f,0.5f); Gl.glBegin(Gl.GL_QUADS); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glColor3f(1.0f, 0.0f, 0.0f); //red Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); //green Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); Gl.glFlush(); AnT.Invalidate(); } else if (e.KeyCode == Keys.M) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(1.0f, 0, 0); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Gl.glLoadIdentity(); Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8); Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y Gl.glBegin(Gl.GL_QUADS); Gl.glColor3f(0.0f, 0.0f, 0.0f); //black Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glColor3f(1.0f, 0.0f, 0.0f); //red Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); //green Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); Gl.glFlush(); AnT.Invalidate(); } else if (e.KeyCode == Keys.K) { button4.PerformClick(); } } } } Результат виконання програми / Висновок: В ході виконання даної лабораторної роботи я навчився використовувати елементи бібліотеки OpenGl для побудови об’ємних зображення.
Допоможи студентському архіву

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

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

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

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

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

Admin

26.02.2023 12:38

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