首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DelphiX 實戰:TDIB.DoSmoothRotate 平滑旋轉

     編輯:Delphi

TDIB.DoSmoothRotate 以雙線性/雙三次插值實現任意角度的高品質影像旋轉,避免最近鄰插值的鋸齒與像素遺失。本文提供累加角度旋轉動畫範例。

效果預覽

DoSmoothRotate 效果

核心程式碼

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DIB, StdCtrls;
type
  TForm1 = class(TForm)
    DXPaintBox1: TDXPaintBox;
    Button1: TButton; // 載入圖片/重置
    Button2: TButton; // 旋轉 22.5°
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;
var Form1: TForm1;
implementation {$R *.dfm}
var dib: TDIB; Angle: Double;

procedure TForm1.FormCreate(Sender: TObject);
begin dib := TDIB.Create; end;

procedure TForm1.FormDestroy(Sender: TObject); begin dib.Free; end;

procedure TForm1.Button1Click(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
  dib.LoadFromFile(ImgPath1);
  DXPaintBox1.DIB.Assign(dib);
  DXPaintBox1.Width := dib.Width;
  DXPaintBox1.Height := dib.Height;
  Angle := 0;
  DXPaintBox1.Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DXPaintBox1.DIB.Fill(0); // 黑底
  Angle := Angle + 22.5;
  // DoSmoothRotate(SrcDIB, CenterX, CenterY, AngleDeg)
  DXPaintBox1.DIB.DoSmoothRotate(dib, dib.Width div 2, dib.Height div 2, Angle);
  DXPaintBox1.Repaint;
end;
end.

參數說明

DoSmoothRotate(SrcDIB: TDIB; CenterX, CenterY: Integer; AngleDeg: Double)
  • SrcDIB:來源原圖(每次從原圖旋轉,避免品質累積損失)
  • CenterX, CenterY:旋轉中心點
  • AngleDeg:逆時針旋轉角度(度),支援浮點數精度
  • 輸出尺寸 = 目標 DIB 尺寸,超出邊界裁剪

關鍵優勢:避免品質遞減

❌ **錯誤做法**:DIB.DoSmoothRotate(DIB, ...) 自己旋轉自己 → 每次累積插值誤差,幾幀後模糊不堪
✅ **正確做法**:DIB.DoSmoothRotate(OriginalDIB, ...) 永遠從原圖旋轉 → 品質恆定

應用場景

  • **2D 角色/載具旋轉**:頂視角遊戲、太空船、砲塔
  • **UI 動畫**:按鈕旋轉、載入圖示、指針儀表
  • **粒子系統**:每顆粒子獨立旋轉角度
  • **地圖/雷達旋轉**:跟隨玩家朝向

效能考量

  • CPU 插值運算,大圖高頻率旋轉會佔用較多 CPU
  • 優化:預渲染 360 幀(每 1° 一幀)存入陣列,執行期直接索引
  • 現代專案建議用 GPU(Direct3D/OpenGL/Vulkan)硬體旋轉

預渲染 360 幀範例


var RotatedFrames: array[0..359] of TDIB;
procedure PrecomputeRotations(Source: TDIB);
var i: Integer;
begin
  for i := 0 to 359 do begin
    RotatedFrames[i] := TDIB.Create;
    RotatedFrames[i].SetSize(Source.Width, Source.Height, 24);
    RotatedFrames[i].Fill(0);
    RotatedFrames[i].DoSmoothRotate(Source, Source.Width div 2, Source.Height div 2, i);
  end;
end;
// 執行期:DXPaintBox1.DIB.Assign(RotatedFrames[Round(Angle) mod 360]);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved