diff --git a/ComputerGraphicsLab2/Form1.cs b/ComputerGraphicsLab2/Form1.cs index b17d13e..4b6d7c8 100644 --- a/ComputerGraphicsLab2/Form1.cs +++ b/ComputerGraphicsLab2/Form1.cs @@ -17,7 +17,7 @@ namespace ComputerGraphicsLab2 private void Form1_Load(object sender, EventArgs e) { - // Форма загружена + } private void glControl1_Load(object sender, EventArgs e) @@ -50,31 +50,58 @@ namespace ComputerGraphicsLab2 // Очистка экрана GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - drawTriangle(); + // Рисуем прямоугольник для примера + DrawRectangle(); + + // Пример использования функции рисования правильного многоугольника + // Пример 1: пятиугольник с одним цветом + DrawRegularPolygon( + new Vector2(0.0f, 0.0f), // центр + 0.5f, // радиус + new Vector3(0.0f, 0.5f, 1.0f), // синий цвет + 5, // пятиугольник + BeginMode.Polygon // режим рисования - контур + ); + + // Пример 2: треугольник с разными цветами вершин + Vector3[] triangleColors = new Vector3[3]; + triangleColors[0] = new Vector3(1.0f, 0.0f, 0.0f); // красный + triangleColors[1] = new Vector3(0.0f, 1.0f, 0.0f); // зеленый + triangleColors[2] = new Vector3(0.0f, 0.0f, 1.0f); // синий + + DrawRegularPolygon( + new Vector2(-1.0f, -1.0f), // центр + 0.3f, // радиус + triangleColors, // массив цветов + 3, // треугольник + BeginMode.Polygon // режим рисования - заполненный + ); // Отображение результата glControl1.SwapBuffers(); } - private void drawTriangle() + private void DrawRectangle() { var z = 4.0f; - var pointsCoint = 3; - var colors = new Vector3[pointsCoint]; - var points = new Vector3[pointsCoint]; + var pointsCount = 4; + var colors = new Vector3[pointsCount]; + var points = new Vector3[pointsCount]; colors[0] = new Vector3(1.0f, 0.0f, 0.0f); colors[1] = new Vector3(0.0f, 1.0f, 0.0f); colors[2] = new Vector3(0.0f, 0.0f, 1.0f); + colors[3] = new Vector3(1.0f, 1.0f, 0.0f); points[0] = new Vector3(-1.0f, -1.0f, z); points[1] = new Vector3(1.0f, -1.0f, z); - points[2] = new Vector3(0.0f, 1.0f, z); + points[2] = new Vector3(1.0f, 1.0f, z); + points[3] = new Vector3(-1.0f, 1.0f, z); - drawPolygon(points, colors, pointsCoint, BeginMode.Polygon); + DrawPolygon(points, colors, pointsCount, BeginMode.LineLoop); } - private void drawPolygon(Vector3[] points, Vector3[] colors, int n, BeginMode mode) + private void DrawPolygon(Vector3[] points, Vector3[] colors, int n, BeginMode mode) { GL.Begin(mode); for (int i = 0; i < n; i++) @@ -84,5 +111,64 @@ namespace ComputerGraphicsLab2 } GL.End(); } + + /// + /// Рисует правильный многоугольник + /// + /// Центр многоугольника + /// Радиус описанной окружности + /// Цвет или массив цветов вершин + /// Количество граней + /// Режим рисования (BeginMode) + public void DrawRegularPolygon(Vector2 center, float radius, object colors, int sides, BeginMode mode) + { + if (sides < 3) + throw new ArgumentException("Количество граней должно быть не менее 3", nameof(sides)); + + // Создаем массивы для точек и цветов + var points = new Vector3[sides]; + var colorArray = new Vector3[sides]; + + // Угол между гранями + float angleStep = 2 * (float)Math.PI / sides; + + // Рассчитываем координаты вершин + for (int i = 0; i < sides; i++) + { + float angle = i * angleStep; + float x = center.X + radius * (float)Math.Cos(angle); + float y = center.Y + radius * (float)Math.Sin(angle); + points[i] = new Vector3(x, y, 0.0f); + } + + // Обрабатываем параметр цвета + if (colors is Vector3 singleColor) + { + // Если передан один цвет, применяем его ко всем вершинам + for (int i = 0; i < sides; i++) + { + colorArray[i] = singleColor; + } + } + else if (colors is Vector3[] colorsList) + { + // Если передан массив цветов + if (colorsList.Length < sides) + throw new ArgumentException("Количество цветов меньше, чем количество граней", nameof(colors)); + + // Копируем цвета в массив + for (int i = 0; i < sides; i++) + { + colorArray[i] = colorsList[i]; + } + } + else + { + throw new ArgumentException("Неверный тип параметра цвета. Ожидается Vector3 или Vector3[]", nameof(colors)); + } + + // Рисуем многоугольник + DrawPolygon(points, colorArray, sides, mode); + } } } \ No newline at end of file