Всё более чем просто.
1. Делаем пустое приложение с формой.
2. Помещаем на форму TPaintBox, TTimer и TButton
3. В свойствах таймера ставим enabled=false и interval=20
вот код
Код
unit Unit1;
interface
uses
Windows, SysUtils, Graphics, Forms, Classes, StdCtrls, ExtCtrls, Controls;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Timer1: TTimer;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
p1, p2: TPoint;
a1, a2: real;
v: real;
public
procedure MovePoint(var APoint: TPoint; var AAngle: real; AFrame: TRect);
procedure Draw;
end;
var
Form1: TForm1;
implementation
uses Types;
//uses math;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
PaintBox1.Canvas.Brush.Color := clWhite; // Устанавливаем цвет фона
PaintBox1.Canvas.Pen.Color := clBlack; // Цвет пера
PaintBox1.Canvas.Pen.Mode := pmNot; // Режим рисования при котором дважды нарисованное стирается
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect); // Закрашиваем пэинтбокс целиком
Randomize; // Сбрасываем рандомайзер
p1.X := random(PaintBox1.ClientWidth); // Выбираем случайные координаты
p1.Y := random(PaintBox1.ClientHeight);
p2.X := random(PaintBox1.ClientWidth);
p2.Y := random(PaintBox1.ClientHeight);
a1 := random * 2 * Pi; // и случайные углы
a2 := random * 2 * pi;
v := 3; // и какую-нибудь скорость
Timer1.Enabled := true; // запускаем таймер
Draw; // рисуем в первый раз
end;
procedure TForm1.Draw; // рисование двух окружностей и линии
begin
PaintBox1.Canvas.Ellipse(p1.X - 2, p1.y - 2, p1.X + 2, p1.y + 2);
PaintBox1.Canvas.Ellipse(p2.X - 2, p2.y - 2, p2.X + 2, p2.y + 2);
PaintBox1.Canvas.MoveTo(p1.X, p1.Y);
PaintBox1.Canvas.LineTo(p2.X, p2.Y);
end;
procedure TForm1.MovePoint(var APoint: TPoint; var AAngle: real; AFrame: TRect);
// Вычисление новой позиции точки и нового её направления движения
begin
APoint.X := round(APoint.X + v * cos(AAngle));
APoint.Y := round(APoint.Y + v * sin(AAngle));
// Проверка,е сли точка вышла за пределы прямоугольника, то поворачиваем её направление
if APoint.Y < AFrame.Top then
begin
AAngle := - AAngle;
APoint.Y := AFrame.Top;
end;
if APoint.Y > AFrame.Bottom then
begin
AAngle := - AAngle;
APoint.Y := AFrame.Bottom;
end;
if APoint.X < AFrame.Left then
begin
AAngle := pi - AAngle;
APoint.X := AFrame.Left;
end;
if APoint.X > AFrame.Right then
begin
AAngle := pi - AAngle;
APoint.X := AFrame.Right;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Draw; // Стираем прежнее опложение точек и прямой
MovePoint(p1, a1, PaintBox1.ClientRect); // двигаем точки
MovePoint(p2, a2, PaintBox1.ClientRect);
Draw; // рисуем в новом положении
end;
end.