如何画一个旋转的圆形

Joh*_*ica 2 delphi vcl

绘制RoundRect很容易:

procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer); override;
Run Code Online (Sandbox Code Playgroud)

绘制旋转的矩形也很容易.

获取角点并像这样旋转它们:

procedure RotatePoints(var Points: TArray<TPoint>; const Angle: Double; const OrgPt: TPoint);
var
  Sin, Cos: Double;
  Prime: TPoint;
  P: TPoint;
begin
 SinCos(NormalizeAngle(Angle), Sin, Cos);
 for P in Points do begin
   Prime.X := P.X - OrgPt.X;
   Prime.Y := P.Y - OrgPt.Y;
   P.X := Round(Prime.X * Cos - Prime.Y * Sin) + OrgPt.X;
   P.Y := Round(Prime.X * Sin + Prime.Y * Cos) + OrgPt.Y;
end;
Run Code Online (Sandbox Code Playgroud)

但是如何绘制旋转的RoundRect?
请注意,我使用的是VCL,而不是Firemonkey.

Ser*_*yuz 7

您可以使用SetWorldTransform在要使用的设备上下文上进行旋转.例:

procedure RotatedRoundRect(DC: HDC; Degrees: Integer;
    X1, Y1, X2, Y2, X3, Y3: Integer);
var
  XForm, SaveXForm: TXForm;
  r: Single;
  ht, vt: Single;
  SaveMode: Integer;
begin
  r := (2 * pi * Degrees) / 360;

  XForm.eM11 := Cos(r);
  XForm.eM12 := Sin(r);
  XForm.eM21 := - XForm.eM12;
  XForm.eM22 := XForm.eM11;
  ht := (X1 + X2) / 2;
  vt := (Y1 + Y2) / 2;
  XForm.eDx := ht - XForm.eM11 * ht + XForm.eM12 * vt;
  XForm.eDy := vt - XForm.eM11 * vt - XForm.eM12 * ht;

  GetWorldTransform(DC, SaveXForm);
  SaveMode := GetGraphicsMode(DC);
  SetGraphicsMode(DC, GM_ADVANCED);
  SetWorldTransform(DC, XForm);
  RoundRect(DC, X1, Y1, X2, Y2, X3, Y3);
  SetWorldTransform(DC, SaveXForm);
  SetGraphicsMode(DC, SaveMode);
end;
Run Code Online (Sandbox Code Playgroud)

样品调用顺时针旋转15°圆角矩形:

RotatedRoundRect(Canvas.Handle, 15, 30, 20, 210, 150, 25, 25);   
Run Code Online (Sandbox Code Playgroud)

  • 这让我想起了一段时间以前我被要求写的[`一个小帮手`](http://pastebin.com/CeZV1Hfj).幸运的是,我不再是GDI的奴隶了:-) (3认同)