Мегаобучалка Главная | О нас | Обратная связь


Практическая часть «Записки программиста»



2020-02-03 267 Обсуждений (0)
Практическая часть «Записки программиста» 0.00 из 5.00 0 оценок




repeat

a:=a/2;

until a+1=1;

 

 

Для написания программы была использована среда программирования Borland Delphi 7 как наиболее простая и одновременно достаточно гибкая для поставленных задач. А именно:

· Придумать алгоритм, который строит пирамиду в пространстве (как особый вид, так и подобия реально существующих пирамид);

· Связать алгоритм с языком программирования и получить результат;

· Добавить пользовательский интерфейс (этой теме можно посвящать отдельный реферат, ибо тема проблемная).

· Собрать все вместе и разнообразить построение пирамидки анимацией.

Будет справедливо кратко сказать о каждой из задач по отдельности, привести расчеты и некоторые нюансы исполнения.

 

Алгоритм

Над этим алгоритмом думали долго, рисовали, пробовали и в конце концов пришли к довольно простому и в то же время эффективному решению. Чтобы построить пирамиду в пространстве нужно построить основание, высоту и соединить точки. Так как в пространстве сохраняется только параллельность, из квадрата в основании должен получиться параллелограмм, а самый простой способ это сделать – сжать квадрат в 2 раза по вертикали вот таким образом:

Далее добавляется вершина – конец нормали, проведенной из центра квадрата в основании и добавляются некоторые дополнительные линии. И это было бы не сложно, если бы пирамидка не должна была крутиться вокруг вертикали. Что же делать теперь? Как осуществить перенос в пространстве? Мы попытались решить эту задачу - весь алгоритм построения пирамидки можно разделить на 3 этапа: просчет основания, пересчет основания в пространстве и доп. вычисления, рисование.

Просчет основания.

Это самая сложная часть, так как здесь нужно сделать поворот квадрата на некоторый угол в координатах. Для начала пусть квадрат повернут таким образом:

Тогда справедливы следующие равенства:

И при повороте каждая координата каждого угла меняется на или . Теперь можно посчитать координаты углов квадрата при любом угле поворота.

Пересчет основания в пространстве.

Довольно простая операция, когда из каждой у-координаты вершины вычитается у-координата центра, делится на 2, а потом обратно прибавляется к у центра. Таким образом квадрат сжимается к оси, проходящей через центр квадрата и параллельной ох.

Также тут просчитываются координаты вершины пирамиды и середины квадрата

Рисование.

Когда все точки просчитаны, можно безбоязненно водить виртуальным карандашом по окошку программы. Здесь задается цвет карандаша и толщина линии.

 

Язык программирования

Теперь, когда алгоритм готов, можно приступить к собственно написанию кода. Код полностью я приведу позже с комментариями, а пока что общая структура. Программа состоит из нескольких функций, привязанных к событиям (например нажатие кнопки – событие, а построение – функция). Для просчета и хранения координат я использовал двумерный массив pix[] примерно такого содержания:

 

pix [1,..] [2,..] [3,..] [4,..] [5,..] [6,..]
[..,1] x1 x2 х3 х4 х вершины  …
[..,2] y1 y2 у3 у4 у вершины  …

 

Где х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 с.: ил.

 



2020-02-03 267 Обсуждений (0)
Практическая часть «Записки программиста» 0.00 из 5.00 0 оценок









Обсуждение в статье: Практическая часть «Записки программиста»

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (267)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)