Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Инь-Ян: различные способы создания и анимация в Delphi и Pascal

Delphi , Графика и Игры , Графика

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, BGRABitmap, BGRABitmapTypes;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    FAngle: Double;
    FBitmap: TBGRABitmap;
    procedure DrawYinYang(ABitmap: TBGRABitmap; AAngle: Double);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FAngle := 0;
  FBitmap := TBGRABitmap.Create(ClientWidth, ClientHeight);
  DoubleBuffered := True;
  Timer1.Interval := 50;
  Timer1.Enabled := True;
end;

procedure TForm1.DrawYinYang(ABitmap: TBGRABitmap; AAngle: Double);
var
  CenterX, CenterY, Radius, HalfRadius: Integer;
  WhiteColor, BlackColor: TBGRAPixel;
begin
  ABitmap.Fill(BGRAPixelTransparent);
  CenterX := ABitmap.Width div 2;
  CenterY := ABitmap.Height div 2;
  Radius := Min(CenterX, CenterY) - 20;
  HalfRadius := Radius div 2;

  WhiteColor := BGRA(255, 255, 255);
  BlackColor := BGRA(0, 0, 0);

  // Draw main circle
  ABitmap.FillEllipseAntialias(CenterX, CenterY, Radius, Radius, WhiteColor);
  ABitmap.EllipseAntialias(CenterX, CenterY, Radius, Radius, BlackColor, 2);

  // Draw upper half (black)
  ABitmap.FillEllipseAntialias(CenterX, CenterY - HalfRadius div 2, HalfRadius, HalfRadius, BlackColor);

  // Draw lower half (white)
  ABitmap.FillEllipseAntialias(CenterX, CenterY + HalfRadius div 2, HalfRadius, HalfRadius, WhiteColor);

  // Draw small circles
  ABitmap.FillEllipseAntialias(CenterX, CenterY - HalfRadius div 2, HalfRadius div 3, HalfRadius div 3, WhiteColor);
  ABitmap.FillEllipseAntialias(CenterX, CenterY + HalfRadius div 2, HalfRadius div 3, HalfRadius div 3, BlackColor);

  // Rotate the whole image
  ABitmap.Rotate(AAngle, False);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  DrawYinYang(FBitmap, FAngle);
  FBitmap.Draw(Canvas, 0, 0, True);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FAngle := FAngle + 0.1;
  if FAngle > 360 then FAngle := 0;
  Invalidate;
end;

end.

Инь-Ян: различные способы создания и анимация в Delphi и Pascal

В этой статье мы рассмотрим несколько способов создания символа Инь-Ян с использованием библиотеки BGRABitmap в Delphi, а также реализуем анимацию вращения.

1. Основной способ (с использованием BGRABitmap)

Первый метод основан на комбинации эллипсов и заливок: - Рисуем основной круг - Добавляем два полукруга противоположных цветов - Добавляем маленькие круги для завершения символа

procedure DrawYinYang(ABitmap: TBGRABitmap);
var
  CenterX, CenterY, Radius, HalfRadius: Integer;
begin
  CenterX := ABitmap.Width div 2;
  CenterY := ABitmap.Height div 2;
  Radius := Min(CenterX, CenterY) - 20;
  HalfRadius := Radius div 2;

  // Основной круг
  ABitmap.FillEllipseAntialias(CenterX, CenterY, Radius, Radius, BGRAWhite);
  ABitmap.EllipseAntialias(CenterX, CenterY, Radius, Radius, BGRABlack, 2);

  // Верхний полукруг
  ABitmap.FillEllipseAntialias(CenterX, CenterY - HalfRadius div 2, HalfRadius, HalfRadius, BGRABlack);

  // Нижний полукруг
  ABitmap.FillEllipseAntialias(CenterX, CenterY + HalfRadius div 2, HalfRadius, HalfRadius, BGRAWhite);

  // Маленькие круги
  ABitmap.FillEllipseAntialias(CenterX, CenterY - HalfRadius div 2, HalfRadius div 3, HalfRadius div 3, BGRAWhite);
  ABitmap.FillEllipseAntialias(CenterX, CenterY + HalfRadius div 2, HalfRadius div 3, HalfRadius div 3, BGRABlack);
end;

2. Альтернативный способ (с использованием Path)

Можно создать символ через построение пути:

procedure DrawYinYangPath(ABitmap: TBGRABitmap);
var
  Path: TBGRAPath;
begin
  Path := TBGRAPath.Create;
  try
    // Добавляем элементы пути для создания Инь-Ян
    Path.moveTo(100, 50);
    Path.arc(100, 100, 50, 50, 0, 180);
    Path.arc(100, 75, 25, 25, 180, 0);
    Path.arc(100, 125, 25, 25, 180, 0);
    Path.closePath;

    ABitmap.Fill(Path, BGRABlack);
  finally
    Path.Free;
  end;
end;

3. Анимация вращения

Для анимации используем таймер и вращение битмапа:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FAngle := FAngle + 0.1;
  if FAngle > 360 then FAngle := 0;
  Invalidate;
end;

4. Оптимизация (двойная буферизация)

Для плавной анимации:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  FBitmap := TBGRABitmap.Create(ClientWidth, ClientHeight);
end;

Заключение

Мы рассмотрели несколько способов создания символа Инь-Ян в Delphi: 1. Классический метод с эллипсами 2. Метод с использованием Path 3. Анимацию вращения 4. Оптимизацию для плавного отображения

Для более сложных эффектов можно экспериментировать с градиентами, прозрачностью и дополнительными трансформациями.

Создано по материалам из источника по ссылке.

Создание и анимация символа Инь-Ян в Delphi с использованием библиотеки BGRABitmap, включая методы рисования и оптимизацию для плавного вращения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-12 12:52:04/0.0032031536102295/0