确定 canvas 上应用 GDI+ 偏移、缩放 and/or 旋转变换的像素的绝对位置

Determine absolute position of a pixel on a canvas where GDI+ offset, scaling and/or rotation transforms have been applied

我有 Delphi 使用 GDI+ 在 canvas 上绘制各种仪表的代码。其中一个仪表在相对于转换后的 GDI+ canvas 中心的位置绘制一个小点。 GDI+ 转换可能包括平移、旋转 and/or 缩放。

是否可以确定那个点的绝对位置w.r.t。未转换的 canvas?

gdi := TGPGraphics.Create(Canvas.Handle);
gdi.TranslateTransform(info.Left + info.Width div 2, info.Top + info.Height div 2);
gdi.RotateTransform(info.Angle);
ThisPoint := TGPPoint.Create(30, 10);

我需要魔术代码来执行以下...

AbsolutePointOnCanvas := UnTransform(ThisPoint);

不确定转型方向...

如果要应用相同的转换,则可以调用 TransformPoints() 将转换应用到 TGPPoints 数组。

如果要应用反向转换,则必须使用与 sign changedreverse order 相同的转换来计算新的转换组合。然后使用TransformPoints到你想要的点reverse-transform.

为了更好地将变换与绘图分开,您可以使用 TGPMatrix 创建变换矩阵,使用 Multiply 将多个变换组合到一个矩阵中。获得完整的转换后,您可以使用 TGpGraphics.SetTransform().

应用它

您需要在外部条件发生变化(缩放、平移等)时计算一个新的变换矩阵,并将其应用到绘图过程中。

顺便说一句,我更喜欢使用 Direct2D canvas 而不是 GDI canvas,因为 Direct2D 使用 GPU,如果使用得当,现在它比 GDI 更快。