|
{
//структура 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;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, Buttons;
Type
TForm1 = class(TForm)
Image1: TImage;
TrackBar1: TTrackBar;
Label1: TLabel;
Label2: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label3: TLabel;
TrackBar2: TTrackBar;
Label4: TLabel;
CheckBox2: TCheckBox;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Label5: TLabel;
Label6: TLabel;
ComboBox3: TComboBox;
procedure BitBtn2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Label4Click(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox3Change(Sender: TObject);
procedure Label5Click(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForm1;
k,f,x,y,rx,ry,kd,fd:integer;
colGr1,colGr2,colAx:TColor;
Дата добавления: 2015-10-30; просмотров: 70 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Procedure DrawAxesD; | | | Implementation |