处理图形矩阵的更好方法(而不是Matrix类)

时间:2013-05-01 20:34:11

标签: c# matrix .net-2.0 gdi+ transform

我正在为.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个值的轻量级类,并且有代码来操作它们。我不熟悉矩阵数学来自己编写所有代码。

1 个答案:

答案 0 :(得分:1)

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

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