3

我正在编写一个函数来在 Windows 窗体应用程序的客户区域中绘制 UI 句柄(旋转、调整大小等)。选择对象时调用该函数。

调用者向我发送一个正确旋转、缩放和平移的 Graphics 对象,以适应更大的事物方案(所选对象具有自己的旋转/平移/缩放,并且 UI 句柄具有相对于所选对象的相对平移和旋转)。现在,我希望我的 UI 句柄大小相同,而不管父级(选定对象)的比例如何。

如何消除/重置转换矩阵中的比例因子?如何在保留宝贵的平移和旋转值的同时重置为 1 的比例?

4

2 回答 2

1

您必须意识到转换的顺序很重要。因此,仅删除比例可能会改变以下翻译的“含义”(例如偏移)。

也许只是记录到目前为止应用的规模(我们称之为这个)并为您的转换currentscale添加一个规模。1/currentscale

于 2009-05-11T07:18:17.207 回答
1

Anti-Grain Geometry使用一种基本方法来确定变换的缩放比例(在 agg_trans_affine.cpp 中找到了实现)。它通过以下方式做到这一点:

  1. 计算变换的旋转
  2. 复制变换并应用相反的旋转
  3. 变换两个已知点并根据结果计算比例

翻译成 C#,这看起来像:

Matrix transform = (Matrix)graphics.Transform.Clone();

PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);

double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));

PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);

float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;

AGG 代码还包含一条警告,指出在某些退化情况下这将无法正常工作,但它可能对您的情况有用。

于 2009-06-04T23:56:33.143 回答