Цель задачи: создать движение градиента по спирали.
Реализуется путём многократного рисования окружностей, постоянно и плавно меняющих свой цвет. Плавный переход в цвете достигается благодаря коэффициенту, который меняется в зависимости от предыдущих цветов окружностей, и влияет на цвет текущей окружности.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
{ TForm1 }
Trealpoint = Record
x, y: double;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
PaintBox1: TPaintBox;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
x0, y0, i, R, Rn, N, cnt, d: integer;
angle: double;
x, y, x2, y2: double;
xar: Array[1..1000] of Trealpoint;
maxx, maxy, minx, miny, xn, yn: double;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
// начальные данные
x0:=4;
y0:=3;
R:=3;
N:=40;
angle:=0;
// генерируем центры окружностей
for i:=60 to 570 do begin
// по формулам вычисляем координаты центров окружностей
x:=x0+(i*R/N)*cos(angle);
y:=y0+((N-i)*R/N)*sin(angle);
// заносим координаты x и y в массив
xar[i].x:=x;
xar[i].y:=y;
// увеличивая угол на 6 градусов
angle:=angle+pi/30;
end;
// активируем таймер
Timer1.Enabled:=True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// радиус окружностей
Rn:=R*10;
// задание цвета для каждой окружности отдельно и прорисовка самих окружностей
for i:=60 to 570 do begin
// цвет для каждой окружности
PaintBox1.Canvas.Brush.Color:=RGBToColor(cnt, 0, 0);
// для видимости плавного перехода цветов используется слудеющее:
if cnt >= 255 then d := -1;
if cnt <= 0 then d := 1;
cnt := cnt + 5 * d;
// изменяем координаты центра для каждой окружности
x2:=xar[i].x * 20 + 600;
y2:=xar[i].y * 20 + 350;
// прорисовываем окружность
PaintBox1.Canvas.Ellipse(round(x2-Rn), round(y2-Rn), round(x2+Rn), round(y2+Rn));
end;
end;
end.
Ключевые слова:
градиент, окружности, движение, спираль