Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KN43_2013_Kostjo_Christian_rozrah.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.3 Mб
Скачать

Додатки

Додаток А Тексти програми з OpenGL

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using Tao.OpenGl;

namespace openGL_1

{

//структура Vertex2D реалізована в файлі Vertex2D.cs

//Vertex2D - сутність 2-вимірного вектора з операцією множення на скаляо

public partial class Form1 : Form

{

private readonly List<Vertex2D> _circle; //список вершини для інтерполяції кола

private readonly List<Vertex2D[]> _triangles; //список трикутників = список по 3 вершини

private const int Details = 60; //деталізація кола, 60 вершин

private const int TrianglesCount = 6; //кількість трикутників

private const double Radius1 = 0.8; //радіус першого кола

private const double Radius2 = 0.40; //радіус другого кола

public Form1()

{

InitializeComponent();

simpleOpenGlControl1.InitializeContexts(); //ініціалізація графічного пристрою

_circle = new List<Vertex2D>(); //ініціалізація списку вершин для інтерполяції кола

const double koef = Math.PI * 2 / Details;

for (var i = 0; i < Details; i += 1)

{

var a = i * koef;

_circle.Add(new Vertex2D(Math.Cos(a), Math.Sin(a)));

}

//запобігаємо виходу за межі масиву:

//додаєм прешу вершину ще раз в кінець для ілюзії замкненої фігури в наступному циклі.

//тобто остання вершина кола = перша вершина кола

_circle.Add(_circle[0]);

_triangles = new List<Vertex2D[]>(); //ініціалізація списку вершин трикутників

const int step = Details / TrianglesCount;

for (var i = 0; i < Details / step; ++i)

{

_triangles.Add(new Vertex2D[3]);

var pos = i * step;

_triangles[i][0] = _circle[pos] * Radius2;

_triangles[i][1] = _circle[pos + step / 2] * Radius1;

_triangles[i][2] = _circle[pos + step] * Radius2;

}

//видаляємо останню вершину, обскільки вона більше не потріба

//це не є обов’язковою операцією, але потрібно для оптимізації

_circle.RemoveAt(_circle.Count-1);

}

private void Draw()

{

Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); //очищаємо поле

Gl.glLineWidth(3.0f); //товщина лінії = 3

Gl.glColor3f(0.53f, 0.81f, 0.92f); //колір лінії - відтінок синього

Gl.glBegin(Gl.GL_LINE_LOOP); //перше

foreach (var vertex in _circle) //коло

Gl.glVertex2d(vertex.X * Radius1, vertex.Y * Radius1); //радіусом Radius1

Gl.glEnd();

Gl.glBegin(Gl.GL_LINE_LOOP); //другк

foreach (var vertex in _circle) //коло

Gl.glVertex2d(vertex.X * Radius2, vertex.Y * Radius2); //радіусом Radius2

Gl.glEnd();

Gl.glColor3f(0.93f, 0.23f, 0.23f); //колір лінії - відтінок червоного

var angle = trackBar1.Value * 75.0 / trackBar1.Maximum; //кут повороту трикутників

foreach (var triangle in _triangles) //прохід через всі трикутники

{

var origin = triangle[0]; //точка відліку

Gl.glTranslated(origin.X, origin.Y, 0); //встановлюємо новий центр координат, зсовуємось в точку відліку

Gl.glRotated(angle, 0, 0, 1); //повертаємо на кут angle за часовою стрілкою

//малюємо трикутник

Gl.glBegin(Gl.GL_LINE_LOOP);

Gl.glVertex2d(0, 0);

Gl.glVertex2d(triangle[1].X - triangle[0].X, triangle[1].Y - triangle[0].Y);

Gl.glVertex2d(triangle[2].X - triangle[0].X, triangle[2].Y - triangle[0].Y);

Gl.glEnd();

Gl.glRotated(-angle, 0, 0, 1); //повертаємо на кут angle проти часової стрілкою

Gl.glTranslated(-origin.X, -origin.Y, 0); //повертаємось у попередній центр координат

}

}

private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)

{

Draw();

}

private void trackBar1_Scroll(object sender, EventArgs e)

{

simpleOpenGlControl1.Refresh(); //обновляємо поле при зміні положення повзунка

}

}

}

Додаток Б Тексти програми з WinAPI

unit Unit1;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]