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

GDI+ 單段貝茲曲線繪製:DrawBezier 基礎用法

     編輯:Delphi

DrawBezier 繪製單段三次貝茲曲線,需指定 4 個點:起點、控制點1、控制點2、終點。曲線不經過控制點,但由控制點決定切線方向與彎曲程度,是向量圖形繪製的核心基元。

參數說明

g.DrawBezier(p, pts[0], pts[1], pts[2], pts[3]);
  • pts[0]:起點
  • pts[1]:第一控制點 (決定起點切線)
  • pts[2]:第二控制點 (決定終點切線)
  • pts[3]:終點

程式碼實作

互動式演示:四個控制點可拖曳移動,即時觀察曲線變化:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses GDIPOBJ, GDIPAPI;

var
  pts: array[0..3] of TGPPoint = ((X: 30; Y: 100), (X: 120; Y: 10),
       (X: 170; Y: 150), (X: 220; Y: 100));
  ptn: Integer = -1;
  f: Boolean;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  i: Integer;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclRed, 1);
  g.Clear(aclWhite);
  g.DrawBezier(p, pts[0], pts[1], pts[2], pts[3]);
  p.SetColor(aclBlue);
  for i := 0 to 3 do
    g.DrawRectangle(p, MakeRect(Rect(pts[i].X - 2, pts[i].Y - 2, pts[i].X + 2, pts[i].Y + 2)));
  g.Free;
  p.Free;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  f := True;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  R: TRect;
  i: Integer;
begin
  if f then
  begin
    if ptn = -1 then Exit;
    pts[ptn].X := X;
    pts[ptn].Y := Y;
    Repaint;
  end
  else
  begin
    ptn := -1;
    for i := 0 to 3 do
    begin
      R := Rect(pts[i].X - 2, pts[i].Y - 2, pts[i].X + 2, pts[i].Y + 2);
      if PtInRect(R, Point(X, Y)) then ptn := i;
    end;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  f := False;
end;

end.

表單設計 (DFM)

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 188
  ClientWidth = 254
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnMouseDown = FormMouseDown
  OnMouseMove = FormMouseMove
  OnMouseUp = FormMouseUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
end

執行效果

DrawBezier 單段曲線示範

貝茲曲線幾何特性

  • 曲線包含於四點構成的凸包內
  • 起點切線方向指向控制點1;終點切線方向來自控制點2
  • 移動控制點1影響起點附近曲率;移動控制點2影響終點附近曲率
  • 兩控制點對稱時曲線呈對稱形狀

掌握單段貝茲曲線是理解多段 DrawBeziers、路徑構建、字體輪廓繪製的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved