Движение градиента по спирали

gradient

Цель задачи: создать движение градиента по спирали.
Реализуется путём многократного рисования окружностей, постоянно и плавно меняющих свой цвет. Плавный переход в цвете достигается благодаря коэффициенту, который меняется в зависимости от предыдущих цветов окружностей, и влияет на цвет текущей окружности.

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.

Ключевые слова: 
градиент, окружности, движение, спираль
ВложениеРазмер
gradient.zip312.8 кб