Частицы движутся под действием сил тяготения, пропорциональных A, B/R/R, радиальной и тангенциальной составляющих вихревых сил Cr/R, Ct/R.
A, B, Cr, Ct -- константы, подобранные опытным путём, R -- расстояние от частиц до центра Сатурна. Частицы имеют начальную скорость, которая в программе не отражена (подменена воображаемым вращением осей координат).
uses Crt, Graph; label M1,M2; var I
:
LongInt; Gd,Gm
:
Integer; Xo,Yo,Rn,Rs,J,F,N,Dxi,Dyi
: Integer; Ar,At,Z,S,Dx,Dy,R,Rp
: Real; T,A,B,Ct,Cr,Eps
: Real; Massa,Alfa,Betta,Gamma,U,Ux,Uy
: Real;
Procedure P; {Вычисление текущих
координат и рисование траектории} begin
R:=Sqrt(Z*Z+S*S);
{ Расстояние
частицы от центра Сатурна } if S=0 then S:=0.00001;
{ Защита
от деления на ноль }
Alfa:=ArcTan(Z/S);
{
Угол
наклона радиуса-вектора
}
At:=Ct/R/Massa;
{
Ускорение тангенциальное } Ar:=(A+B/R/R+Cr/R)/Massa; {
Сумма
радиальных ускорений } U:=Sqrt(At*At+Ar*Ar); { Амплитуда
вектора полного ускорения }
{
Вычисление
угла наклона вектора полного ускорения } Ux:=U*Sin(Gamma); Uy:=U*Cos(Gamma); {Выч. текущих координат}
{ Пересчёт координат для устранения
системной
ошибки } if Dx>Xo then begin Dx:=Dx+(Ux*T); Dy:=Dy-(Uy*T) end
else begin Dx:=Dx-(Ux*T); Dy:=Dy+(Uy*T) end; Dxi:=Round(Dx); Dyi:=Round(Dy);
{ Округление } LineTo(Dxi,Dyi);
end;
{ Конец процедуры P } Procedure P1; {
Рисование
траектории движения частиц } begin J:=1; R:=5; repeat Z:=Yo-Dy; S:=Xo-Dx;
{ Расстояние от частицы до
осей Х и У } Rp:=R;
{ Запоминание
радиуса } P;
{ Использование процедуры
P } for I:=1 to 10000000 do;
{
Пустой цикл для замедления процесса } J:=J+1; until Abs(R-Rp)<Eps; end; {
Конец процедуры P1} Procedure P2;
{Продолжение
траектории
с рисованием частиц} begin J:=1; repeat Z:=Yo-Dy; S:=Xo-Dx;
{
Расстояние от частицы до осей Х и У } P;
{ Использование процедуры
P } Pieslice(Dxi,Dyi,0,360,2);
{
Рисование частицы } for I:=1 to 1000000 do;
{ Пустой цикл для замедления процесса } J:=J+1; until J>N; end; {Конец
процедуры P2} {ШШШШШШШШШШШШШШШШШШШШШШШШШ}
{Программа рисования колец} begin { Включение графического
режима } Gd := Detect; InitGraph(Gd, Gm, 'B:\Tp55\BGI'); if GraphResult <> grOk then Halt(1); {---------------------------------------------} SetColor(15); SetTextStyle(TriplexFont,HorizDir,1);
{Печать
заголовка} MoveTo(0,0); OutText('Образование колец Сатурна');
Xo:=Round(GetMaxX*2/3-50); Yo:=Round(GetMaxY/2);
{Начало
осей } Line(150,Yo,GetMaxX-50,Yo);
Line(Xo,0,Xo,GetmaxY-30); { Оси X и Y }
Rs:=80; Pieslice(Xo,Yo,0,360,Rs);
{
Рисование Сатурна } T:=0.005; Eps:=0.03;{Шаг
счёта времени и точность выхода на орбиту}
A:=0.5; B:=150; Ct:=2000; Cr:=10;
{Константы}
{ШШШШШШШШШШШШШШШШШШШШШШШШШ}
{ Рисование первого
кольца } OutTextXY(0,GetMaxY-50,'Захват частицы массой 0,004
'); Massa:=0.004; N:=70;
{
Масса и
количество частиц в кольце} Rn:=150; R:=Rs+Rn;
{ Расстояние частицы от
Сатурна и его центра } F:=1;
{
Установка флага }
M1: Dx:=Xo; Dy:=Yo-R;
{ Начальные
координаты частицы } Dxi:=Round(Dx); Dyi:=Round(Dy);
{ Округление
координат } SetColor(14);
{
Цвет рисования } MoveTo(Dxi,Dyi); Pieslice(Dxi,Dyi,0,360,2);
{ Начало
траектории } P1; P2;
{
Процедуры рисования } if F=2 then Goto M2;
{
Проверка флага }
{ШШШШШШШШШШШШШШШШШШШШШШШШШ}
{ Рисование
второго кольца } SetColor(15); OutTextXY(0,GetMaxY-25,'Частица
массой 0,008 отрывается от Сатурна'); Massa:=0.008; N:=80; { Масса и количество частиц в
кольце} Rn:=2; R:=Rs+Rn; {
Расстояние от частицы до Сатурна и его
центра
} F:=2;
{
Перестановка флага
} Goto M1; M2: SetColor(15); OutTextXY(GetMaxX-100,GetMaxY-25,'Готово'); Readln; CloseGraph; end. |