确定已在画布上应用GDI +偏移,缩放和/或旋转变换的像素的绝对位置

问题描述

我有使用GDI +在画布上绘制各种规格的Delphi代码。这些量规之一在相对于转换后的GDI +画布的中心的位置绘制了一个小点。 GDI +转换可能包括平移,旋转和/或缩放。

是否有可能确定该点的绝对位置未转换的画布?

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到要反向转换的点。

要更好地将变换与图形分开,可以使用TGPMatrix创建变换矩阵,并使用Multiply在单个矩阵中组合多个变换。一旦获得了完整的转换,就可以使用TGpGraphics.SetTransform()应用它。

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

顺便说一句,我更喜欢使用Direct2D画布而不是GDI画布,因为Direct2D使用GPU,并且今天如果使用得当,它比GDI快。