【问题标题】:Scale and translate transformations on a matrix在矩阵上缩放和平移变换
【发布时间】:2015-04-30 21:56:17
【问题描述】:

我目前正在尝试在 C# 中移植以下 Java 或 Swift 代码(在 Windows Phone 库中):

这里是 Java 代码:

public Matrix zoom(float scaleX, float scaleY, float x, float y) 
{
 final Matrix save = new Matrix();
 save.set(anotherMatrix);
 save.postScale(scaleX, scaleY, x, y);
 return save;
}

这里是 Swift 代码:

public func zoom(#scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat) -> CGAffineTransform
{
  var matrix = CGAffineTransformTranslate(_touchMatrix, x, y);
  matrix = CGAffineTransformScale(matrix, scaleX, scaleY);
  matrix = CGAffineTransformTranslate(matrix, -x, -y);
  return matrix;
}

基本上,在 Windows Phone 的 C# 中,我有以下类:

  • System.Windows.Media.Matrix
  • System.Windows.Media.TranslateTransform
  • System.Windows.Media.ScaleTransform

但是...TranslateTransformScaleTransform 类的 Transform 方法适用于 Point 而不适用于 Matrix

如何在 C# 中对矩阵应用缩放和转换转换?

【问题讨论】:

标签: c# matrix windows-phone transformation


【解决方案1】:

这里的解决方案:

var tt1 = new TranslateTransform(x,y);
var matrix=_touchMatrix* tt1.Value;

var sc=new ScaleTransform(scaleX, scaleY);
matrix = matrix *sc.Value;

var tt2 = new TranslateTransform(-x,-y);
matrix =matrix*tt2.Value ;

【讨论】:

    【解决方案2】:

    @john-odom 想说的是,您需要将两个变换相乘才能将它们的组合效果应用于一个点。 Matrix.Multiply 方法将帮助您做您需要做的事情,指向基于 XNA 的答案的链接并不是将您指向这些特定类型/库,而是让您了解其背后的原理。

    【讨论】:

    • 感谢您的帮助。不幸的是,我无法访问本文档中描述的所有方法:msdn.microsoft.com/fr-fr/library/… 基本上,在实例化像这样的矩阵 var matrix = new Matrix() 之后,自动完成不提供 scale 方法...
    • 这就是我要说的。您不能使用System.Windows.Media.TranslateTransformSystem.Windows.Media.ScaleTransform。您需要将System.Windows.Media.MatrixTranslateScale 方法一起使用。
    • 但在 Windows Phone 中这些方法不存在:msdn.microsoft.com/en-us/library/windows/apps/… 无论如何,我已经发布了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2017-02-09
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多