Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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;

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 | Нарушение авторских прав


Читайте в этой же книге: СПИСОК СКОРОЧЕНЬ | Private void trackBar1_Scroll(object sender, EventArgs e) | Form1.Image1.Canvas.MoveTo(x,0); | Form1.Image1.Canvas.LineTo(x,y); |
<== предыдущая страница | следующая страница ==>
Procedure DrawAxesD;| Implementation

mybiblioteka.su - 2015-2024 год. (0.018 сек.)