gpt4 book ai didi

delphi - 如何绘制旋转的圆角矩形

转载 作者:行者123 更新时间:2023-12-03 01:52:37 28 4
gpt4 key购买 nike

绘制 RoundRect 很容易:

procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer); override;

绘制旋转矩形也很容易。

获取角点并旋转它们,如下所示:

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;

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

最佳答案

您可以使用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;

顺时针旋转 15° 圆角矩形的示例调用:

RotatedRoundRect(Canvas.Handle, 15, 30, 20, 210, 150, 25, 25);   

关于delphi - 如何绘制旋转的圆角矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24208468/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com