确定 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 changed
和 reverse order
相同的转换来计算新的转换组合。然后使用TransformPoints到你想要的点reverse-transform.
为了更好地将变换与绘图分开,您可以使用 TGPMatrix 创建变换矩阵,使用 Multiply 将多个变换组合到一个矩阵中。获得完整的转换后,您可以使用 TGpGraphics.SetTransform().
应用它
您需要在外部条件发生变化(缩放、平移等)时计算一个新的变换矩阵,并将其应用到绘图过程中。
顺便说一句,我更喜欢使用 Direct2D canvas 而不是 GDI canvas,因为 Direct2D 使用 GPU,如果使用得当,现在它比 GDI 更快。
我有 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 changed
和 reverse order
相同的转换来计算新的转换组合。然后使用TransformPoints到你想要的点reverse-transform.
为了更好地将变换与绘图分开,您可以使用 TGPMatrix 创建变换矩阵,使用 Multiply 将多个变换组合到一个矩阵中。获得完整的转换后,您可以使用 TGpGraphics.SetTransform().
应用它您需要在外部条件发生变化(缩放、平移等)时计算一个新的变换矩阵,并将其应用到绘图过程中。
顺便说一句,我更喜欢使用 Direct2D canvas 而不是 GDI canvas,因为 Direct2D 使用 GPU,如果使用得当,现在它比 GDI 更快。