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;
Мы рассмотрели несколько способов создания символа Инь-Ян в Delphi:
1. Классический метод с эллипсами
2. Метод с использованием Path
3. Анимацию вращения
4. Оптимизацию для плавного отображения
Для более сложных эффектов можно экспериментировать с градиентами, прозрачностью и дополнительными трансформациями.
Создание и анимация символа Инь-Ян в Delphi с использованием библиотеки BGRABitmap, включая методы рисования и оптимизацию для плавного вращения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.