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

再學GDI+[55]: 路徑曲線拉直 - Flatten 方法將貝塞爾曲線轉為多段直線

     編輯:Delphi

前言

TGPGraphicsPath.Flatten 將路徑中的所有曲線(貝塞爾曲線、弧線、橢圓弧)近似轉換為多段直線。透過 flatness 參數控制近似精度,是路徑簡化、碰撞偵測、向量轉光柵的關鍵步驟。

Flatten 參數詳解

procedure Flatten(matrix: TGPMatrix = nil; flatness: Single = 0.25);
  • matrix:可選矩陣變換,可同時進行幾何變換與拉直
  • flatness:最大偏離距離(設備單位),值越小越精確、頂點越多
  • 預設 0.25:平衡品質與效能的典型值

TrackBar 即時調整精度範例

  • TrackBar 範圍 -5000 到 5000,對應 flatness -50.0 到 50.0
  • 負值會被內部處理為正值
  • 繪製橢圓路徑並顯示當前 flatness 值

核心實作

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  path: TGPGraphicsPath;
  f: Single;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclBlue, 2);
  path := TGPGraphicsPath.Create;
  path.AddEllipse(20, 20, ClientWidth-40, ClientHeight-80);
  f := TrackBar1.Position / 100;  {轉換為 Single}
  path.Flatten(nil, f);           {關鍵:拉直曲線}
  Caption := Format('Flatness: %.3f', [f]);
  g.DrawPath(p, path);            {繪製拉直後的多段線}
  path.Free; p.Free; g.Free;
end;

執行效果預覽

Flatten 曲線拉直效果

Flatness 參數效果對照

Flatness 值視覺效果頂點數適用場景
0.01 ~ 0.1極平滑,肉眼不可辨別直線段極多高精度輸出、列印、CNC
0.25 (預設)良好平衡適中通用 UI、螢幕顯示
1.0 ~ 5.0明顯多邊形感少低解析度、快速碰撞偵測
> 10幾乎變成正方形/少邊形極少極度簡化、包圍盒近似

進階技術細節

  • 不可逆操作:Flatten 後原始曲線資訊永久遺失
  • 矩陣結合:可一次完成「變換+拉直」,避免中間路徑產生
  • 文字路徑:AddString 產生的字形路徑同樣適用 Flatten
  • 區域運算前置:複雜曲線路徑進行區域運算前建議先 Flatten 提升穩定度

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 200
  ClientWidth = 264
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object TrackBar1: TTrackBar ... {範圍 -5000~5000}
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved