KOSS
KOSS
你好,我想请问下 canvas中的contact()方法是前乘(pre) 还是后乘(post) 操作, 又比如之前对matrix进行了一堆变换, 这时候如果我想基于当前的变换 再旋转30度, 那这时候改使用 preRotate 还是postRotate,因为矩阵不满足交换律,这里两种情况一定是不一样的 , 那这样 改怎么理解和使用 pre和post
你好我是看过了这篇文章后才有的这两个疑问,文章看了但是还是没有搞明白,主要是两个内容 1.我理解 canvas中的contact就是 一个乘法操作,毕竟Matrix中也有 pre和post的contact方法,那么canvas中的contact操作相当于 pre还是post? 2.第二个没理解的就是pre和post到底该怎么使用,基于某一点旋转这个可以理解,但是如果一个矩阵经过了一系列组合变化(旋转、位移、缩放)后得到一个矩阵, 那么如果我想在视觉在对变换后的图像再进行操作,比如再tranlate 1000个像素,或者再旋转 30度, 那这时候该使用pre还是使用post。 感谢您的时间。
3q, 刚刚测试 pre是受之前matrix变换的影响, post不受之前matrix变换的影响, 不知道这个结论对吗?
以translate为例,其他类似,pre是 M*T ,post是 T*M ,这里的M是源矩阵(对应代码中 mMatrix) ,T是目标矩阵(对应 pre/post translate() 括号中参数对应的矩阵 ),pre操作会受到源矩阵M的影响,post不会受到源矩阵M影响,例如M是一个单位阵先sacle了(0.5,0.5),这时pretranslate(1000,1000)实际效果只有(500,500),而postTranslate(1000,1000)的效果还是(1000,1000)。基于这个理论去理解上面两种方案。 方案一: 整个过程相当于三个操作, 1. 移动矩阵到屏幕中心 2.postRotate(基于图片中心旋转)3.postTranslate去移动圆上某点的坐标再减去图片的宽高距离。 其中操作2 postRotate 实际效果就是基于图片中心点进行旋转,这里作者解释过,围绕某一点旋转对应的矩阵就是 M' = M*T*R*-T = T*R*-T 用代码表示出来有两种 // 第一种 mMatrix.preTranslate(mBitmap.getWidth()/2,mBitmap.getHeight()/2); mMatrix.preRotate(degrees); mMatrix.preTranslate(-mBitmap.getWidth()/2,-mBitmap.getHeight()/2);...