1

我正在为 .NET 2.0/GDI+ 创建一个 2D 绘图框架。

我需要能够为不同的视觉效果定义变换,例如旋转和平移变换。我还需要能够根据这些转换将点坐标从祖先转换为子坐标。

所以我有如下功能:

public Matrix TransformToAncestor(Element ancestor)
public Matrix TransformToDescendant(Element descendant)
public PointF TransformPoint(Matrix matrix, PointF point)

我依靠矩阵类来执行以下功能:

相乘、反转、TransformPoints、RotateAt、缩放

我的问题是 Matrix 类是 IDisposable 并且不方便使用。我需要能够动态创建矩阵。我需要能够说,“给我一个矩阵来从这个元素转换到那个元素,并使用那个矩阵来转换这个点”。

Matrix 类使用 GDI+ 本机互操作分配非托管资源。因此,如果我不再需要它时不立即处理它,我可能会造成内存泄漏。

现在据我所知,Matrix 类只表示一个由 6 个元素组成的数组,并且它具有对这些元素执行数学运算的功能。进行互操作调用似乎有点矫枉过正。

我真的只需要一个轻量级的类来存储这 6 个值并有代码来操作它们。我对矩阵数学不够满意,无法自己编写所有代码。

4

1 回答 1

1

这就是我要做的:查看 WPF 的System.Windows.Media.Matrix结构(http://msdn.microsoft.com/en-us/library/system.windows.media.matrix.aspx)。直接使用它,或者在您自己的代码中重新创建它(使用 ILSpy 或 Reflector 在这里非常有用)。这样您就不必对数学感到满意,您只需重新创建他们正在做的事情(它为您提供了一种非常简单的单元测试方法,只需将您的输出与 WPF 进行比较!)。

然后,构建任何实用程序、扩展和转换方法,以帮助您以对您的库来说自然的方式与 GDI+ 进行互操作。

于 2013-05-24T00:32:14.713 回答