我有一个用于SVG绘图的java代码。它会处理包括rotate
在内的转换,并且可以很好地完成此操作,就我在许多测试图片中看到的与Chrome中的渲染进行比较而言。接下来我需要的是获得实际的对象位置,这是通过变换声明的许多图像。所以我决定只读取用于绘图的Matrix中的X和Y.不幸的是,rotate
转换的值不正确,即它们与图像中的实际对象位置不对应。
精简代码如下所示:
Matrix matrix = new Matrix();
float cx = 1000; // suppose this is an object X coordinate
float cy = 300; // this is its Y coordinate
float angle = -90; // rotate counterclockwise, got from "rotate(-90, 1000, 300)"
// shift to -X,-Y, so object is in the center
matrix.postTranslate(-cx, -cy);
// rotate actually
matrix.postRotate(angle);
// shift back
matrix.postTranslate(cx, cy);
// debug goes here
float[] values = new float[9];
matrix.getValues(values);
Log.v("HELLO", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]);
日志分别输出值700和1300。我期待0和0,因为我看到对象在我的图像中旋转到位(即没有任何移动),并且postTranslate调用应该相互补偿。当然,我看到这些值是如何从1000和300形成的,但不明白为什么。再一次,我指出具有这些奇怪值的矩阵用于实际的对象绘制,它看起来是正确的。有人可以解释这里发生了什么吗我错过了什么吗?到目前为止,我只有一个问题的解决方案:只是不要尝试从rotate
获取位置,只对明确的matrix
和translate
转换执行此操作。但是这种方法缺乏通用性,无论如何我认为矩阵应该对任何转换类型都有合理的值(包括偏移量)。
答案 0 :(得分:0)
答案是矩阵是空间变换的算子,不应该用于直接提取物体位置。相反,应该获得初始对象坐标,如SVG标记的x
和y
属性中所指定的,并在其上应用矩阵:
float[] src = new float[2];
src[0] = cx;
src[1] = cy;
matrix.mapPoints(src);
在此之后,我们在x和y变量中获得正确的位置值。