Files

108 lines
3.1 KiB
ObjectPascal

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
StartStopBtn: TButton;
Screen: TPaintBox;
procedure ScreenPaint(Sender: TObject);
procedure StartStopBtnClick(Sender: TObject);
private
var EarthX, EarthY: Integer; { Координаты земли }
EarthA: Real; { Текущий угол отклонения Земли }
MoonX, MoonY: Integer; { Координаты Луны }
MoonA: Real; { Текущий угол отклонения Луны }
IsRunning: Boolean;
const SunR: Integer = 60; { Радиус Солнца }
EarthR: Integer = 20; { Радиус Земли }
MoonR: Integer = 4; { Радиус Луны }
EarthD: Integer = 140; { Расстояние от Солнца до Земли }
MoonD: Integer = 40; { Радиус от Земли до Луны }
EarthV: Real = 0.02; { Угловая скорость Земли }
MoonV: Real = 0.1; { Угловая скорость Луны }
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.StartStopBtnClick(Sender: TObject);
begin
if IsRunning then
begin
IsRunning := false;
StartStopBtn.Caption := 'Пуск';
Exit;
end;
StartStopBtn.Caption := 'Стоп';
IsRunning := true;
{ Инициализация переменных }
EarthA := 0;
MoonA := 0;
EarthX := 0;
EarthY := 0;
MoonX := 0;
MoonY := 0;
while IsRunning do { Основной цикл }
begin
{ Пересчитаем координаты Земли и Луны }
EarthX := Round(Screen.Width div 2 + EarthD * Cos(EarthA));
EarthY := Round(Screen.Height div 2 + EarthD * Sin(EarthA));
MoonX := Round(EarthX + MoonD * Cos(MoonA));
MoonY := Round(EarthY + MoonD * Sin(MoonA));
EarthA := EarthA + EarthV; { Изменяем текущие углы отклонения }
MoonA := MoonA + MoonV; { Земли и Луны }
if EarthA > 2 * PI then EarthA := EarthA - 2 * PI; { Корректируем углы }
if MoonA > 2 * PI then MoonA := MoonA - 2 * PI; { если требуется }
Screen.Invalidate;
Sleep(30); { Пауза }
Application.ProcessMessages;
if Application.Terminated then break;
end;
end;
procedure TForm1.ScreenPaint(Sender: TObject);
begin
if not IsRunning then Exit;
Screen.Canvas.Pen.Width := 5; { Толщина линий - 5 пикселей }
Screen.Canvas.Pen.Color := clRed; { Рисуем Солнце в центре экрана }
Screen.Canvas.Ellipse(Screen.Width div 2 - SunR,
Screen.Height div 2 - SunR,
Screen.Width div 2 + SunR,
Screen.Height div 2 + SunR);
Screen.Canvas.Pen.Color := clGreen; { Рисуем Землю }
Screen.Canvas.Ellipse(EarthX - EarthR, EarthY - EarthR,
EarthX + EarthR, EarthY + EarthR); { и Луну }
Screen.Canvas.Pen.Color := clBlue;
Screen.Canvas.Ellipse(MoonX - MoonR, MoonY - MoonR,
MoonX + MoonR, MoonY + MoonR);
end;
end.