【问题标题】:Better way to handle graphics matrices (instead of the Matrix class)处理图形矩阵的更好方法(而不是 Matrix 类)
【发布时间】:2013-05-01 20:34:10
【问题描述】:

我正在为 .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 个值并有代码来操作它们。我对矩阵数学不够熟悉,无法自己编写所有代码。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多