gpt4 book ai didi

android - android canvas 中位图的同步旋转、平移和缩放

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:18 32 4
gpt4 key购买 nike

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

这是我想要实现的目标:
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);

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

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

最佳答案

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

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

矩阵对象也有一个方法来应用 affine transformation直接地?因为这样您就不需要考虑操作顺序。

仿射变换可能看起来像这样:

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

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

Mt.preTranslate(-centerX,-centerY);

然后在应用 M 之前将 Mt 应用到图片,然后在需要应用 -Mt 之后

关于android - android canvas 中位图的同步旋转、平移和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10446154/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com