Вот я уже сам написал всю основную часть программы: Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls, Spin;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; SpinEdit1: TSpinEdit; Button3: TButton; Bevel1: TBevel; Bevel2: TBevel; Button4: TButton;
procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure SpinEdit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure Button4Click(Sender: TObject);
private { Private declarations } public { Public declarations } x0 : integer; // начальное положение частицы на экране по Ох в пикселях y0 : integer; // начальное положение частицы на экране по Оy в пикселях xPix : integer; yPix : integer; bPix : integer; // Прицельный радиус в пикселях b : real; // Прицельный радиус в пм, вводимый с клавиатуры
procedure Calc; // Процедура обсчёта траектории движения частицы procedure MyDraw(x, y : integer); // Процедура прорисовки альфа-частицы // и траетории её движения function xPixel(x : real) : integer; // Функция пересчёта координаты х function yPixel(y : real) : integer; // Функция пересчёта координаты y end;
const DKer = 25; // Диаметр ядра DPart = 5; // Диаметр альфа-частицы clMyBKColor = TColor(clLtGray - $121212); // Цвет фона формы DeltaYKer = 80; // Расстояние по оси Y от нижней границы формы до ядра
var Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
// Процедура создания формы procedure TForm1.FormCreate(Sender: TObject); begin
{ b := StrToFloat(Edit2.Text) * 1e-12; bPix := yPixel(b); // использование того, что в фиг. скобках ни к чему не приводит // Задание начальных параметров: НАДО ЛИ ИХ ЗДЕСЬ ПИСАТЬ??? x0 := 0; // ... начальных координат частицы на экране по оси Х y0 := Self.ClientHeight - DeltaYKer - bPix; // ... начальных координат } // частицы на экране по оси Y Self.Color := clMyBKColor; // ... цвета формы end; //FormCreate// //-----------------------------------------------------------------------------
// Процедура прорисовки формы procedure TForm1.FormPaint(Sender: TObject); begin // Прорисовка ядра Canvas.Pen.Color := clGreen; Canvas.Brush.Color := clGreen; Canvas.Ellipse(Self.ClientWidth div 2, Self.ClientHeight - DeltaYKer, Self.ClientWidth div 2 + DKer, Self.ClientHeight - DeltaYKer + DKer); end; //FormPaint// //-----------------------------------------------------------------------------
// Процедура обсчёта траектории движения частицы procedure TForm1.Calc; const k = 9e9; // Коэф-т пропорциональности qe = 1.6e-19; // Заряд электрона m = 6.68e-27; // Масса альфа-частицы dt = 1e-3; // Интервал времени var x, y, r, r2 : real; // Реальные координаты в м t : real; // Время F : real; // Сила vx, vy, ax, ay : real; // Проекции скоростей и ускорений в м Z : integer; // Зарядовое число ядра begin Self.Cursor := crHourGlass;
x := -4.1e-10;
y := StrToFloat(Edit2.Text) * 1e-12;
Z := StrToInt(SpinEdit1.Text); // Зарядовое число ядра vx := sqrt(3.2e-13 * StrToFloat(Edit3.Text) / m); // Проекция скорости на Ох vy := 0; // Проекция скорости на Оy t := 0;
while true do begin // цикл обсчета (метод Верле)
r2 := sqr(x) + sqr(y); r := sqrt(r2);
F := -k * (2 * qe) * (Z * qe) / r2;
ax := F * x / (m * r); ay := F * y / (m * r);
vx := vx + ax * t; vy := vy + ay * t;
x := x + vx * t + ax * sqr(t) / 2; y := y + vy * t + ay * sqr(t) / 2;
t := t + dt;
if (yPixel(y) > 93) and (xPixel(x) < Self.ClientWidth) then
// if (yPix > 93) and // так вообще не появляется и не летит // (xPix < Self.ClientWidth) then begin Self.MyDraw(xPixel(x), yPixel(y));
end else begin break; // выход из while end; end; //while//
Self.Cursor := crDefault; end; //Calc// //-----------------------------------------------------------------------------
{// НОВАЯ ПРОЦЕДУРА procedure TForm1.Calc; const k = 9e9; // Коэф-т пропорциональности qe = 1.6e-19; // Заряд электрона m = 6.68e-27; // Масса альфа-частицы dfi = 1e-3; // или 1e-5; интервал времени var x, y, r : real; // Реальные координаты в пм Z : integer; // Зарядовое число ядра T, fi : real; begin Self.Cursor := crHourGlass;
x := -4.1e-10; y := StrToFloat(Edit2.Text) * 1e-12; b := round(StrToFloat(Edit2.Text) * 1e-12); r := sqrt(sqr((Self.ClientWidth div 2) * 1e-12) + sqr(b)); r := sqrt(sqr(x) + sqr(y));
Z := StrToInt(SpinEdit1.Text); // Зарядовое число ядра T := 1.6e-13 * StrToFloat(Edit3.Text);
fi := -ArcTan(b / ((Self.ClientWidth div 2) * 1e-12));
while true do begin
r := 1 / ((sin(fi)) / b - (1 + cos(fi)) * k * Z * qe * qe / (T * b * b)); fi := fi + dfi;
if (r < 5.66e-10) then begin Self.MyDraw(xPixel(x), yPixel(y));
end else begin break; // выход из while end; end; //while//
Self.Cursor := crDefault; end; //Calc// }//=============================================================================
// Процедура прорисовки альфа-частицы и траетории её движения procedure TForm1.MyDraw(x, y : integer); // in pixels begin with Self do begin // Очистка формы Canvas.Pen.Color := clMyBKColor; Canvas.Brush.Color := clMyBKColor; Canvas.Ellipse(x0, y0, x0 + DPart, y0 + DPart); x0 := xPix; y0 := yPix;
// Прорисовка траектории Canvas.Pixels[xPix - DPart div 2, yPix + DPart div 2] := clBlack;
// Прорисовка альфа-частицы Canvas.Pen.Color := clRed; Canvas.Brush.Color := clRed; Canvas.Ellipse(xPix, yPix, xPix + DPart, yPix + DPart); end; //with// end; //MyDraw// //-----------------------------------------------------------------------------
// Функция пересчёта координаты х function TForm1.xPixel(x: real): integer; begin xPix := round(x * 1e-19) + Self.ClientWidth div 2; result := xPix; end; //xPixel// //-----------------------------------------------------------------------------
// Функция пересчёта координаты у function TForm1.yPixel(y: real): integer; begin yPix := Self.ClientHeight - DeltaYKer - round(y * 1e-19); result := yPix; end; //yPixel// //-----------------------------------------------------------------------------
// Нажатие кнопки Пуск procedure TForm1.Button1Click(Sender: TObject); begin Calc; // Вызов процедуры Calc Form1.SpinEdit1.SetFocus; end; //Button1Click// //-----------------------------------------------------------------------------
// Нажатие кнопки Справка procedure TForm1.Button2Click(Sender: TObject); begin Form2.Visible := true; end; //Button2Click// //-----------------------------------------------------------------------------
// Нажатие кнопки Выход procedure TForm1.Button3Click(Sender: TObject); begin Form1.Close; // Закрытие окна программы end; //Button3Click// //-----------------------------------------------------------------------------
// Процедура вызова программы "Таблица Менделеева" procedure TForm1.Button4Click(Sender: TObject); begin WinExec('Mendeleyev.exe', SW_SHOWNORMAL); end; //Button4Click// //-----------------------------------------------------------------------------
// Нажатие клавиши в поле "Зарядовое число ядра" procedure TForm1.SpinEdit1KeyPress(Sender: TObject; var Key: Char); begin case Key of '0' .. '9' : ; // цифры #8 : ; // клавиша <Backspace> #13 : Form1.Edit2.SetFocus; // клавиша <Enter>
else Key := Chr(0); // Все остальные символы запрещены end; end; //SpinEdit1KeyPress// //-----------------------------------------------------------------------------
// Нажатие клавиши в поле "Прицельный радиус (пм)" procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin case Key of '0' .. '9' : ; // цифры #8 : ; // клавиша <Backspace> #13 : Form1.Edit3.SetFocus; // клавиша <Enter> '.', ',' : begin if Key = '.' then Key := ',';
end; else Key := Chr(0); // Все остальные символы запрещены end; end; //Edit2KeyPress// //-----------------------------------------------------------------------------
// Нажатие клавиши в поле "Начальная кинетическая энергия альфа-частицы (МэВ)" procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin case Key of '0' .. '9' : ; // цифры #8 : ; // клавиша <Backspace> #13 : Form1.Button1.SetFocus; // клавиша <Enter> '.', ',' : begin if Key = '.' then Key := ','; // if Pos (',', Edit3.Text) <> 0 // НАДО ЛИ ЭТО??? // then Key := Chr(0);
end; else Key := Chr(0); // Все остальные символы запрещены end; end; //Edit3KeyPress// //-----------------------------------------------------------------------------
end.
|
, но почему-то частица летит не от левого края формы, а от ядра. И вообще летит не так как надо. Может проблема с пересчётом координат в функциях xPixel и yPixel. За основу пересчёта я взял 1 пиксель= 1 пм (10^(-12)м). Также в этих функциях перевожу координаты: в процедуре Calc центр координат отсчитывается относительно ядра, а на форме в Delphi - относительно левого верхнего края. Соответствующий пересчёт и производится в данных функциях. В закомментированной новой процедуре я попробовал другой метод обсчета, который исходит из физического смысла задачи. Начало темы тут: http://forum.vingrad.ru/forum/topic-202415.htmlЗдесь и изложена вся физическая суть процесса. Помогите пожалуйста найти ошибку.
Присоединённый файл ( Кол-во скачиваний: 3 )
___________.rar 297,09 Kb
|