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

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

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

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

Примітиви OpenGL, основні прийоми побудови двовимірних об'єктів

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

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

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

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

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

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

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

  • OpenGL
  • Комп'ютерна графіка
  • Графічні примітиви
  • Двовимірні об'єкти
  • Тонування
  • Багатокутники
  • Програмування C#

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

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

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

OpenGLПримітивиТочкиЛініїБагатокутникиТрикутникиЗгладжуванняТонуванняC#Tao.OpenGL

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА Кафедра ЗІ З В І Т До лабораторної роботи №2 з курсу: «Програмування комп’ютерної графіки» на тему: «Примітиви OPENGL, основні прийоми побудови двовимірних об'єктів» Мета роботи : Знайомство з примітивами OPENGL, призначеними для виведення крапок, ліній і багатокутників. Визначення кольору об'єктів. Різні способи замальовування об'єктів. Завдання: Використовуючи програму-шаблон, створену при виконанні попередньої лабораторної роботи виконайте наступні завдання. Завдання 1. Побудувати крапки розташовані у вершинах правильного n-кутника. Встановити режим згладжування для крапок. Експериментально визначити максимальний розмір крапки, при якому можливе згладжування. Завдання 2. Використовуючи примітив для виведення ліній намалювати правильний n-кутник. Змінити типа і ширину ліній. Завдання 3. Використовуючи примітив для виведення ламаної лінії намалювати фігуру, змальовану на рис.1. Завдання 4. Використовуючи примітив для виводу замкнутою ламаною намалювати фігуру, змальовану на рис.2 Завдання 5. Побудувати фігуру, змальовану на рис.2, розбивши її на трикутники (кожен трикутник забарвлений випадковим кольором). Виконаєте три варіанти побудов з використанням примітивів: А) трикутник; Б) стрічка трикутників; В) віяло трикутників. Чим відрізняються результати при зміні способу тонування? Завдання 6. Використовуючи примітив для виведення багатокутників побудувати правильний n-кутник. Завдання 7. Побудувати неопуклий багатокутник, змальований на рис.3, представивши його у вигляді сукупності окремих багатокутників, призначивши кожному багатокутнику свій колір. Подивитися результат роботи програми для різних способів тонування. Завдання 8. Змінити програму попереднього завдання так, щоб А) лицьові грані змальовувалися тільки вершинами; Б) лицьові грані змальовувалися зафарбованими, а зворотні – лініями; В) лицьові і зворотні грані змальовувалися лініями (каркасне зображення). Текст програми: 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.OpenGl; using Tao.FreeGlut; using Tao.Platform.Windows; namespace TaoGl_lab2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); AnT.InitializeContexts(); } private void button1_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(255, 0, 0); Gl.glFlush(); AnT.Invalidate(); Gl.glLineWidth(2); Gl.glEnable(Gl.GL_LINE_SMOOTH); Gl.glBegin(Gl.GL_LINE_STRIP); Gl.glVertex2d(8, 3); Gl.glVertex2d(13, 6); Gl.glVertex2d(8, 7); Gl.glVertex2d(20, 7); Gl.glVertex2d(12, 8); Gl.glVertex2d(16, 12); Gl.glVertex2d(8, 12); Gl.glEnd(); Gl.glDisable(Gl.GL_LINE_SMOOTH); } 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(); if ((float)AnT.Width <= (float)AnT.Height) { Glu.gluOrtho2D(0.0, 25.0 * (float)AnT.Height / (float)AnT.Width, 0.0, 25.0); } else { Glu.gluOrtho2D(0.0, 20.0 * (float)AnT.Width / (float)AnT.Height, 0.0, 20.0); } Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); } private void button2_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glFlush(); AnT.Invalidate(); Gl.glLineWidth(2); Gl.glEnable(Gl.GL_LINE_SMOOTH); Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glVertex2d(10, 8); Gl.glVertex2d(17, 13); Gl.glVertex2d(19, 8); Gl.glVertex2d(22, 10); Gl.glVertex2d(22, 16); Gl.glVertex2d(20, 19); Gl.glVertex2d(10, 19); Gl.glVertex2d(8, 17); Gl.glVertex2d(11, 15); Gl.glEnd(); Gl.glDisable(Gl.GL_LINE_SMOOTH); } private void button3_Click(object sender, EventArgs e) { Application.Exit(); } private void button4_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_POINT_SMOOTH); Gl.glPointSize(8); Gl.glBegin(Gl.GL_POINTS); Gl.glVertex2d(5, 5); Gl.glVertex2d(10, 5); Gl.glVertex2d(10, 10); Gl.glVertex2d(5, 10); Gl.glEnd(); Gl.glDisable(Gl.GL_POINT_SMOOTH); } private void button5_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_LINE_SMOOTH); Gl.glLineWidth(7); Gl.glLineStipple(1, 0xAAAA); Gl.glEnable(Gl.GL_LINE_STIPPLE); Gl.glBegin(Gl.GL_LINES); Gl.glVertex2d(5, 5); Gl.glVertex2d(10, 5); Gl.glVertex2d(5, 10); Gl.glVertex2d(10, 10); Gl.glVertex2d(5, 5); Gl.glVertex2d(5, 10); Gl.glVertex2d(10, 5); Gl.glVertex2d(10, 10); Gl.glEnd(); Gl.glDisable(Gl.GL_LINE_SMOOTH); Gl.glDisable(Gl.GL_LINE_STIPPLE); } private void button6_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLES); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glVertex2d(22, 10); Gl.glVertex2d(19, 8); Gl.glVertex2d(22, 16); Gl.glColor3f(1.0f, 1.0f, 0.0f); Gl.glVertex2d(19, 8); Gl.glVertex2d(22, 16); Gl.glVertex2d(17, 13); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2d(22, 16); Gl.glVertex2d(17, 13); Gl.glVertex2d(20, 19); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2d(20, 19); Gl.glVertex2d(17, 13); Gl.glVertex2d(10, 19); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2d(17, 13); Gl.glVertex2d(10, 19); Gl.glVertex2d(11, 15); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(10, 19); Gl.glVertex2d(11, 15); Gl.glVertex2d(8, 17); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2d(10, 8); Gl.glVertex2d(11, 15); Gl.glVertex2d(17, 13); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLES); } private void button7_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLE_STRIP); Gl.glBegin(Gl.GL_TRIANGLE_STRIP); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex2d(8, 17); Gl.glColor3f(1.0f, 1.0f, 0.0f); Gl.glVertex2d(10, 19); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2d(11, 15); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2d(20, 19); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2d(10, 8); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(17, 13); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2d(20, 19); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(22, 16); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(17, 13); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2d(22, 10); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2d(19, 8); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLE_STRIP); } private void button8_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT ); Gl.glLoadIdentity(); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glFlush(); AnT.Invalidate(); Gl.glShadeModel(Gl.GL_SMOOTH); Gl.glEnable(Gl.GL_TRIANGLE_FAN); Gl.glBegin(Gl.GL_TRIANGLE_FAN); Gl.glVertex2d(10, 8); Gl.glColor3f(1.0f, 1.0f, 0.0f); Gl.glVertex2d(8, 17); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2d(10, 19); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2d(20, 19); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2d(22, 16); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(22, 10); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2d(19, 8); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLE_FAN); } private void button9_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); AnT.Invalidate(); } private void button10_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_POLYGON); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(1.0f, 1.0f, 0.0f); Gl.glVertex2d(5, 5); Gl.glVertex2d(10, 5); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex2d(10, 10); Gl.glVertex2d(5, 10); Gl.glEnd(); Gl.glDisable(Gl.GL_POLYGON); } private void button11_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLES); Gl.glEnable(Gl.GL_POLYGON); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex2d(10, 5); Gl.glVertex2d(12, 10); Gl.glVertex2d(15, 5); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex2f(9, 16); Gl.glVertex2f(14, 13); Gl.glVertex2f(10, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(0.0f, 0.0f, 1.0f); //blue Gl.glVertex2f(9, 16); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2f(17, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 13); Gl.glVertex2f(17, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2f(17, 13); Gl.glVertex2f(23, 13); Gl.glVertex2f(23, 15); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2f(15, 5); Gl.glVertex2f(13.8f, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 5.5f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glVertex2f(17, 13); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLES); Gl.glDisable(Gl.GL_POLYGON); } private void button12_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLES); Gl.glEnable(Gl.GL_POLYGON); Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_POINT); Gl.glPointSize(3); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex2d(10, 5); Gl.glVertex2d(12, 10); Gl.glVertex2d(15, 5); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex2f(9, 16); Gl.glVertex2f(14, 13); Gl.glVertex2f(10, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(0.0f, 0.0f, 1.0f); //blue Gl.glVertex2f(9, 16); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2f(17, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 13); Gl.glVertex2f(17, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2f(17, 13); Gl.glVertex2f(23, 13); Gl.glVertex2f(23, 15); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2f(15, 5); Gl.glVertex2f(13.8f, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 5.5f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glVertex2f(17, 13); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLES); Gl.glDisable(Gl.GL_POLYGON); } private void button13_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLES); Gl.glEnable(Gl.GL_POLYGON); Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_FILL); Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_LINE); Gl.glLineWidth(3); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex2d(10, 5); Gl.glVertex2d(12, 10); Gl.glVertex2d(15, 5); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex2f(9, 16); Gl.glVertex2f(14, 13); Gl.glVertex2f(10, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(0.0f, 0.0f, 1.0f); //blue Gl.glVertex2f(9, 16); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2f(17, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 13); Gl.glVertex2f(17, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2f(17, 13); Gl.glVertex2f(23, 13); Gl.glVertex2f(23, 15); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2f(15, 5); Gl.glVertex2f(13.8f, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 5.5f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glVertex2f(17, 13); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLES); Gl.glDisable(Gl.GL_POLYGON); } private void button14_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glFlush(); AnT.Invalidate(); Gl.glEnable(Gl.GL_TRIANGLES); Gl.glEnable(Gl.GL_POLYGON); Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE); Gl.glLineWidth(3); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex2d(10, 5); Gl.glVertex2d(12, 10); Gl.glVertex2d(15, 5); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow Gl.glVertex2f(9, 16); Gl.glVertex2f(14, 13); Gl.glVertex2f(10, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_TRIANGLES); Gl.glColor3f(0.0f, 0.0f, 1.0f); //blue Gl.glVertex2f(9, 16); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex2f(17, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 13); Gl.glVertex2f(17, 13); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex2f(17, 13); Gl.glVertex2f(23, 13); Gl.glVertex2f(23, 15); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex2f(15, 5); Gl.glVertex2f(13.8f, 7); Gl.glVertex2f(23, 7); Gl.glVertex2f(23, 5.5f); Gl.glEnd(); Gl.glBegin(Gl.GL_POLYGON); Gl.glColor3f(0.0f, 0.0f, 0.0f); Gl.glVertex2f(13, 15.8f); Gl.glVertex2f(14, 13); Gl.glVertex2f(17, 13); Gl.glVertex2f(17, 15.2f); Gl.glEnd(); Gl.glDisable(Gl.GL_TRIANGLES); Gl.glDisable(Gl.GL_POLYGON); } } } Результат виконання програми: 1. / 2. Висновок: В даній лабораторній роботі я навчився використовувати елементи бібліотеки OpenGl для побудови зображення.
Допоможи студентському архіву

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

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

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

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

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

Admin

26.02.2023 12:38

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