0

我有一个用于 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,仅用于显式matrixtranslate转换。但是这种方法缺乏通用性,无论如何我认为矩阵对于任何转换类型都应该具有合理的值(包括偏移量)。

4

1 回答 1

0

答案是矩阵是空间变换的算子,不应该直接用于物体位置的提取。相反,应该获取初始对象坐标,如SVG 标记xy属性中指定的那样,并将矩阵应用于它们:

float[] src = new float[2];
src[0] = cx;
src[1] = cy;
matrix.mapPoints(src);

在此之后,我们在 x 和 y 变量中获得正确的位置值。

于 2012-07-02T12:54:26.930 回答