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 Form1_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// Форма загружена
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void glControl1_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);
|
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();
|
glControl1.SwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTriangle()
|
private void DrawRectangle()
|
||||||
{
|
{
|
||||||
var z = 4.0f;
|
var z = 4.0f;
|
||||||
var pointsCoint = 3;
|
var pointsCount = 4;
|
||||||
var colors = new Vector3[pointsCoint];
|
var colors = new Vector3[pointsCount];
|
||||||
var points = new Vector3[pointsCoint];
|
var points = new Vector3[pointsCount];
|
||||||
|
|
||||||
colors[0] = new Vector3(1.0f, 0.0f, 0.0f);
|
colors[0] = new Vector3(1.0f, 0.0f, 0.0f);
|
||||||
colors[1] = new Vector3(0.0f, 1.0f, 0.0f);
|
colors[1] = new Vector3(0.0f, 1.0f, 0.0f);
|
||||||
colors[2] = new Vector3(0.0f, 0.0f, 1.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[0] = new Vector3(-1.0f, -1.0f, z);
|
||||||
points[1] = 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);
|
GL.Begin(mode);
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
|
|
@ -84,5 +111,64 @@ namespace ComputerGraphicsLab2
|
||||||
}
|
}
|
||||||
GL.End();
|
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