Silverlight 中MatrixTransform和其他Transform的数值转换

 

对各种transform的讲解已经很多了,但是有时MatrixTransform和其他transform变换效果之间需要转换时,变换量的转换又如何呢?下面的类就完成了Matrix和其他transform的转换方法。

 

        public static ScaleTransform GetScaleByMatrix(Matrix matrix)
        {
            ScaleTransform scaleTransform = new ScaleTransform();
            scaleTransform.ScaleX = matrix.M22;
            scaleTransform.ScaleY = matrix.M11;
            return scaleTransform;
        }
        public static double GetRotateByMatrix(Matrix matrix)
        {
            double rotate = Math.Acos(matrix.M11);
            return rotate;
        }
        public static TranslateTransform GetTranslateByMatrix(Matrix matrix)
        {
            TranslateTransform translate = new TranslateTransform();
            translate.X = matrix.OffsetX;
            translate.Y = matrix.OffsetY;
            return translate;
        }
        public static Matrix GetMatrixByScale(ScaleTransform scale)
        {
            return new Matrix(scale.ScaleY, 0, 0, scale.ScaleX, 0, 0);// x or y ???
        }
        public static Matrix GetMatrixByRotate(double rotate)
        {
            return new Matrix(Math.Cos(rotate), -Math.Sin(rotate), Math.Sin(rotate), Math.Cos(rotate), 0, 0);
        }
        public static Matrix GetMatrixByTranslate(TranslateTransform translate)
        {
            return new Matrix(1, 0, 0, 1, translate.X, translate.Y);
        }

 

在二位平面的平移变换中, TranslateTransform中的 X 和 Y 值分别对用MatrixTransform 中的OffsetX 和OffsetY, 但是对于RotateTransform 进行平面旋转的时候,他的三个参数Angle,CenterX,CenterY怎么对应到MatrixTransform中呢?在上面的函数 GetMatrixByRotate(a)可以把角度映射到Matrix中,但如果这做了Angle的转换,图片的旋转是默认的左上角点,但是我们的需求并不是左上角,那怎么按照我们设定的centerX 和CenterY来旋转呢?经过研究,找到一个比较笨拙的办法,目前还未找到更好的算法。

 

   private Matrix GetMatrixByPrimaryCenterRotate(Point primaryCenter, Matrix target)
        {
            MatrixTransform mt = new MatrixTransform() { Matrix = target };
            Point newCenter = mt.Transform(primaryCenter);
            target.OffsetX = primaryCenter.X - newCenter.X;
            target.OffsetY = primaryCenter.Y - newCenter.Y;
            return target;
        }

 

通过GetMatrixByRotate(a)方法我们可以计算出旋转angle后的Matrix,然后通过translateTransform 把旋转对象移回到中心旋转的效果,上面的方法可以计算出指定旋转中心的旋转效果。

 

对于同时进行ScaleTransform和RotateTransform的效果怎么计算呢?

对这样的效果我们对得到的不同的Matrix进行矩阵相乘即可得到混合变换合并之后的MatrixTransform.

 

 

See Also: http://msdn.microsoft.com/en-us/library/8667dchf(v=vs.110).aspx

转载于:https://www.cnblogs.com/anthonyBlog/p/3578152.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值