pix | [1,..] | [2,..] | [3,..] | [4,..] | [5,..] | [6,..] |
[..,1] | x1 | x2 | х3 | х4 | х вершины | … |
[..,2] | y1 | y2 | у3 | у4 | у вершины | … |
Где х1..х4 и у1..у4 – координаты вершин основания. Все компоненты, использованные при написании программы взяты из стандартных библиотек.
6.3 Интерфейс
Пользовательские интерфейсы – метод взаимодействия пользователя с программой для передачи ей инструкций и данных. Мой интерфейс состоит из четырех полей для ввода, трех кнопок, одного выкидного списка, одного ползунка и одной галочки (CheckBox). Размещен интерфейс слева так, что вводимые данные сверху, а кнопки снизу для удобства и чтобы пользователь мог сразу найти кнопку пуска.
6.4 Листинг
Строки, начинающиеся с // - комментарии, при компиляции опускаются и служат для напоминания программисту, что же он такое натворил вчера.
//Начало, подключение библиотек, объекты, глобальные переменные
unit Unit1;
interface
uses
SysUtils, Classes, Graphics, Forms, Dialogs, Windows,
Controls, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
Label2: TLabel;
Edit4: TEdit;
Timer1: TTimer;
Button2: TButton;
Speed: TTrackBar;
Label5: TLabel;
Test: TCheckBox;
ComboBox1: TComboBox;
Label6: TLabel;
ColorDialog1: TColorDialog;
ColorB: TButton;
Stats: TLabel;
Fill: TCheckBox;
RazmB: TButton;
Timer2: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SpeedChange(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ColorBClick(Sender: TObject);
procedure RazmBClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
error: boolean;
x,y : Longint;
pix : array[1..20,1..20] of Longint;
a,a_plus,tmp: Real;
old: TColor;
i,H1_x,H1_y,H2_x,H2_y,H3_x,H3_y,temp :integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// Кнопка пуска
// Идет долгая и упорная проверка введенных пользователем данных
try
if Test.State=cbChecked then begin
if (StrToFloat(Edit1.Text)*sqrt(2))>(ClientWidth-150) then begin
ShowMessage('При текущей ширине окна данная сторона основания слишком велика');
error:=true; end;
if (StrToFloat(Edit4.Text)>=90) or (StrToFloat(Edit4.Text)<=0) then begin
ShowMessage('Угол наклона должен быть больше 0 и меньше 90 градусов');
error:=true; end;
if (StrToFloat(Edit2.Text)<(StrToFloat(Edit1.Text)*sqrt(2)/4)) or (StrToFloat(Edit2.Text)>ClientHeight-(StrToFloat(Edit1.Text)*sqrt(2)/4)) then begin
ShowMessage('Крайняя левая Х либо залезает на интерфейс, либо слишком велика для текущей стороны основания');
error:=true; end;
if (StrToFloat(Edit3.Text)<150) or (StrToFloat(Edit2.Text)>ClientWidth-(StrToFloat(Edit1.Text)*sqrt(2))) then begin
ShowMessage('Крайняя левая У либо слишком мала, либо слишком велика для текущей стороны основания');
error:=true; end;
end;
finally
if error=false then begin
Edit1.Enabled:=False;
Edit2.Enabled:=False;
Edit3.Enabled:=False;
Edit4.Enabled:=False;
Test.Enabled:=False;
Timer1.Enabled:=True; end;
error:=false;
end;
end;
procedure TForm1.Timer(Sender: TObject);
var
i,j,min:integer;
pol: array[1..3] of TPoint; // координаты точек треугольника
begin
// Главный таймер, по нему строится пирамида
// Расчет начальных значений
pix[1,1]:= StrToInt(Edit2.Text);
pix[1,2]:= StrToInt(Edit3.Text);
pix[2,1]:= Round( pix[1,1] + (StrToFloat(Edit1.Text)*sqrt(2))/2 );
pix[2,2]:= Round( pix[1,2] - (StrToFloat(Edit1.Text)*sqrt(2))/2 );
pix[3,1]:= Round( pix[1,1] + StrToFloat(Edit1.Text)*sqrt(2) );
pix[3,2]:= pix[1,2];
pix[4,1]:= Round( pix[1,1] + (StrToFloat(Edit1.Text)*sqrt(2))/2 );
pix[4,2]:= Round( pix[1,2] + (StrToFloat(Edit1.Text)*sqrt(2))/2 );
pix[5,1]:= pix[2,1];
tmp:= sin(StrToFloat(Edit4.Text)*Pi/180)/cos(StrToFloat(Edit4.Text)*Pi/180)*StrToFloat(Edit1.Text)/2;
pix[5,2]:= Round( pix[1,2] - tmp );
// Поворот на a радиан
x:= Round( (StrToFloat(Edit1.Text)*sqrt(2))/2 - sin(PI/2-a)*(StrToFloat(Edit1.Text)*sqrt(2))/2 );
y:= Round( cos(PI/2-a)*(StrToFloat(Edit1.Text)*sqrt(2))/2 );
pix[1,1]:= pix[1,1] + x;
pix[1,2]:= pix[1,2] + y;
pix[2,1]:= pix[2,1] - y;
pix[2,2]:= pix[2,2] + x;
pix[3,1]:= pix[3,1] - x;
pix[3,2]:= pix[3,2] - y;
pix[4,1]:= pix[4,1] + y;
pix[4,2]:= pix[4,2] - x;
// Уменьшаем основание вдвое по оси у
pix[1,2]:= Round( pix[1,2] - y/2 );
pix[2,2]:= Round( pix[2,2] + ((StrToFloat(Edit1.Text)*sqrt(2)/2 - x)/2) );
pix[3,2]:= Round( pix[3,2] + y/2 );
pix[4,2]:= Round( pix[4,2] - ((StrToFloat(Edit1.Text)*sqrt(2)/2 - x)/2) );
with Canvas do begin
Brush.Color:= old;
FillRect(Rect(150,0,ClientWidth,ClientHeight));
// Основные линии
Pen.Width:= 2;
Pen.Color:= ColorDialog1.Color;
MoveTo(pix[1,1],pix[1,2]);
for i:=4 downto 1 do
LineTo(pix[i,1],pix[i,2]);
MoveTo(pix[1,1],pix[1,2]);
LineTo(pix[5,1],pix[5,2]);
LineTo(pix[3,1],pix[3,2]);
MoveTo(pix[2,1],pix[2,2]);
LineTo(pix[5,1],pix[5,2]);
LineTo(pix[4,1],pix[4,2]);
// Вспомогательные линии
Pen.Width:=1;
MoveTo(pix[1,1],pix[1,2]); LineTo(pix[3,1],pix[3,2]);
MoveTo(pix[2,1],pix[2,2]); LineTo(pix[4,1],pix[4,2]);
MoveTo(pix[5,1],pix[5,2]); LineTo(pix[5,1],pix[5,2]+Round(tmp));
end;
end;
a:=a+a_plus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// Кнопка остановки
Timer1.Enabled:=False;
Timer2.Enabled:=False;
Edit1.Enabled:=True;
Edit2.Enabled:=True;
Edit3.Enabled:=True;
Edit4.Enabled:=True;
Test.Enabled:=True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Создание формы, начальные значения переменных
old:=Canvas.Brush.Color;
a:=0;
a_plus:=0.05;
end;
procedure TForm1.SpeedChange(Sender: TObject);
begin
// Изменение скорости, ползунок
a_plus:=Speed.Position/30;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
// Выбор вида пирамидки из списка
if ComboBox1.ItemIndex=0 then Edit4.Text:='43,3138';
if ComboBox1.ItemIndex=1 then Edit4.Text:='41,9699';
if ComboBox1.ItemIndex=2 then Edit4.Text:='40,8933';
end;
procedure TForm1.ColorBClick(Sender: TObject);
begin
// По кнопке включается выбор цвета
ColorDialog1.Execute
end;
end.
Заключение.
Итак, нами была создана научная программа, которая, безусловно, может быть применима как пособие на уроках геометрии в курсе изучения объемных тел, а в частности – пирамид; исследована часть исторического материала по теме «Великие пирамиды».
Бесспорно, такое направление знаний многогранно и объемно. Происходит слияние алгебры и геометрии. Тригонометрия становится частным направлением пирамидометрии, поскольку осуществимы действия с углами без перевода их в градусную меру.
В рассмотренной нами литературе говорится о том, что такой качественный скачек в освоении математики позволит преобразить точные науки и усилить прикладные дисциплины.
Великие пирамиды древности несут в себе большой вклад в историю развития как интеллектуальные послания из глубин тысячелетий, так и сокровищницы системы красивейших математических законов.
Список литературы.
1. Ван дер Варден Б.Л. «Пробуждающая наука математика Древнего Египта, Вавилона и Греции» - 1990. - №5
2. Даан- Дальмедико А., Пейфер Ж. «пути и лабиринты. Очерки по истории математики» - Л., 1990
3. Петросян П. «Вселенский шифр пирамид»// «Наука и религия»- 1992.- №12
4. Прохоров Ю.В. «Математический энциклопедический словарь»-М.: Советская энциклопедия, 1988.
5. Уваров В.В. «Пирамидометрия :Древнейшее математическое наследие» Л.: Издательство Уральского университета, 2000.
6. Фленов М. Е. Ф69 Библия Delphi. — СПб.: БХВ-Петербург, 2004. — 880 с.: ил.