add DrawRectangle and DrawRegularPolygon with examples
This commit is contained in:
parent
14dccc7081
commit
aea419365d
1 changed files with 95 additions and 9 deletions
|
|
@ -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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Рисует правильный многоугольник
|
||||
/// </summary>
|
||||
/// <param name="center">Центр многоугольника</param>
|
||||
/// <param name="radius">Радиус описанной окружности</param>
|
||||
/// <param name="colors">Цвет или массив цветов вершин</param>
|
||||
/// <param name="sides">Количество граней</param>
|
||||
/// <param name="mode">Режим рисования (BeginMode)</param>
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue