Практическая часть «Записки программиста»
repeat a:=a/2; until a+1=1;
Для написания программы была использована среда программирования Borland Delphi 7 как наиболее простая и одновременно достаточно гибкая для поставленных задач. А именно: · Придумать алгоритм, который строит пирамиду в пространстве (как особый вид, так и подобия реально существующих пирамид); · Связать алгоритм с языком программирования и получить результат; · Добавить пользовательский интерфейс (этой теме можно посвящать отдельный реферат, ибо тема проблемная). · Собрать все вместе и разнообразить построение пирамидки анимацией. Будет справедливо кратко сказать о каждой из задач по отдельности, привести расчеты и некоторые нюансы исполнения.
Алгоритм Над этим алгоритмом думали долго, рисовали, пробовали и в конце концов пришли к довольно простому и в то же время эффективному решению. Чтобы построить пирамиду в пространстве нужно построить основание, высоту и соединить точки. Так как в пространстве сохраняется только параллельность, из квадрата в основании должен получиться параллелограмм, а самый простой способ это сделать – сжать квадрат в 2 раза по вертикали вот таким образом: Далее добавляется вершина – конец нормали, проведенной из центра квадрата в основании и добавляются некоторые дополнительные линии. И это было бы не сложно, если бы пирамидка не должна была крутиться вокруг вертикали. Что же делать теперь? Как осуществить перенос в пространстве? Мы попытались решить эту задачу - весь алгоритм построения пирамидки можно разделить на 3 этапа: просчет основания, пересчет основания в пространстве и доп. вычисления, рисование. Просчет основания. Это самая сложная часть, так как здесь нужно сделать поворот квадрата на некоторый угол в координатах. Для начала пусть квадрат повернут таким образом:
Тогда справедливы следующие равенства: И при повороте каждая координата каждого угла меняется на или . Теперь можно посчитать координаты углов квадрата при любом угле поворота. Пересчет основания в пространстве. Довольно простая операция, когда из каждой у-координаты вершины вычитается у-координата центра, делится на 2, а потом обратно прибавляется к у центра. Таким образом квадрат сжимается к оси, проходящей через центр квадрата и параллельной ох. Также тут просчитываются координаты вершины пирамиды и середины квадрата Рисование. Когда все точки просчитаны, можно безбоязненно водить виртуальным карандашом по окошку программы. Здесь задается цвет карандаша и толщина линии.
Язык программирования Теперь, когда алгоритм готов, можно приступить к собственно написанию кода. Код полностью я приведу позже с комментариями, а пока что общая структура. Программа состоит из нескольких функций, привязанных к событиям (например нажатие кнопки – событие, а построение – функция). Для просчета и хранения координат я использовал двумерный массив pix[] примерно такого содержания:
Где х1..х4 и у1..у4 – координаты вершин основания. Все компоненты, использованные при написании программы взяты из стандартных библиотек.
Интерфейс Пользовательские интерфейсы – метод взаимодействия пользователя с программой для передачи ей инструкций и данных. Мой интерфейс состоит из четырех полей для ввода, трех кнопок, одного выкидного списка, одного ползунка и одной галочки (CheckBox). Размещен интерфейс слева так, что вводимые данные сверху, а кнопки снизу для удобства и чтобы пользователь мог сразу найти кнопку пуска.
Листинг Строки, начинающиеся с // - комментарии, при компиляции опускаются и служат для напоминания программисту, что же он такое натворил вчера. //Начало, подключение библиотек, объекты, глобальные переменные 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 с.: ил.
Популярное: Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (267)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |