5

我正在尝试展示一张可以缩放和平移的图片,并且可以通过指南针读数旋转。使用下面的代码,所有三个操作都可以工作,但它们会相互影响。

这是我想要实现的目标:
1. 围绕屏幕中心旋转
2. 缩放,将图片的相同部分留在中心
3. 平移到图片中的所需位置

以下是以下代码实际发生的情况:
1. 旋转按预期工作,围绕屏幕中心
2. 缩放有效,但它围绕图片中心缩放 3. 只有当为零时,
翻译才会按预期工作,否则angle它朝着错误的方向发展

// the center of the view port
float centerX = screen.right/2;
float centerY = screen.bottom/2;

Matrix m = new Matrix();
m.preRotate(angle, centerX, centerY);
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY);

// scaling the amount of translation, 
// rotating the translation here gave crazy results
float x = mPosX / mScaleFactor;
float y = mPosY / mScaleFactor;
m.preTranslate(x, y);

canvas.drawBitmap(pic, m, null);

如果我先平移,然后再旋转,则平移会按预期工作,但旋转不再围绕视口的中心。

我怎样才能应用所有三种转换,而不会使它们相互影响?

4

1 回答 1

1

我不确定围绕图像中心的缩放比例,但至于平移方向错误,这不是因为您旋转图像而不是平移的结果吗?也许尝试这样的事情:

float x = (mPosX*(cos(angle) + sin(angle)) / mScaleFactor;
float y = (mPosY*(cos(angle) - sin(angle)) / mScaleFactor;
m.preTranslate(x, y);

矩阵对象也有直接应用仿射变换的方法吗?因为那样你就不需要考虑操作的顺序了。

仿射变换可能如下所示:

M = |mScaleFactor*cos(angle)       sin(angle)            x|
    |     -sin(angle)          mScaleFactor*cos(angle)   y|
    |          0                         0               1|

但这将围绕图像的角落旋转,因此您需要先使用 preTranslate() 函数,如下所示:

Mt.preTranslate(-centerX,-centerY);

并在应用 M 之前将 Mt 应用于 pic,然后在您需要应用 -Mt 之后

于 2012-05-04T09:38:28.007 回答