当前位置: 首页 > 面试题库 >

围绕中心旋转图片

邵胜涝
2023-03-14
问题内容

有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为…

我的结果是这样的:

public class RotateOp implements BufferedImageOp {

    private double angle;
    AffineTransformOp transform;

    public RotateOp(double angle) {
        this.angle = angle;
        double rads = Math.toRadians(angle);
        double sin = Math.sin(rads);
        double cos = Math.cos(rads);
        // how to use the last 2 parameters?
        transform = new AffineTransformOp(new AffineTransform(cos, sin, -sin,
            cos, 0, 0), AffineTransformOp.TYPE_BILINEAR);
    }
    public BufferedImage filter(BufferedImage src, BufferedImage dst) {
        return transform.filter(src, dst);
    }
}

如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变换。所以我在过滤器中添加了一些东西:

    public BufferedImage filter(BufferedImage src, BufferedImage dst) {
        //don't let all that confuse you
        //with the documentation it is all (as) sound and clear (as this library gets)
        AffineTransformOp moveCenterToPointZero = new AffineTransformOp(
            new AffineTransform(1, 0, 0, 1, (int)(-(src.getWidth()+1)/2), (int)(-(src.getHeight()+1)/2)), AffineTransformOp.TYPE_BILINEAR);
        AffineTransformOp moveCenterBack = new AffineTransformOp(
            new AffineTransform(1, 0, 0, 1, (int)((src.getWidth()+1)/2), (int)((src.getHeight()+1)/2)), AffineTransformOp.TYPE_BILINEAR);
        return moveCenterBack.filter(transform.filter(moveCenterToPointZero.filter(src,dst), dst), dst);
    }

我在这里的想法是,形式更改矩阵应该是单位矩阵(是正确的英语单词吗?),并且移动整个图片的向量是最后2个条目。我的解决方案首先使图片变大,然后再变小(并没那么重要-
原因未知!!! ),并且也将图片的3/4切掉(重要的是-原因可能是图片是移动到图片尺寸“从(0,0)到(width,height)”的合理范围之外。

在所有数学方面,我并没有那么受过训练,计算机在计算时会犯所有错误,而其他所有无法轻易进入我脑海的东西,我都不知道该怎么做。请给个建议。我想绕图片中心旋转图片,我想了解AffineTransformOp。


问题答案:

如果我正确理解了您的问题,则可以转换为原点,旋转并向后平移,如本示例所示。

在使用时AffineTransformOp,此示例可能更合适。特别要注意的是,将操作串联在一起的
最后指定的先应用 顺序。它们 不是 可交换的。



 类似资料:
  • 我在下面有一个类,我将其附加到一个对象上,以使其围绕其轴旋转。我把雪碧的枢轴通过检查员送来了。 这正是我想要的效果,但是我遇到的问题是,每当我触摸并拖动它,然后再次触摸并拖动它,它就会捕捉到一个新的位置。 我想让它做的是,当它旋转,然后再次旋转时,精灵保持其相同的旋转,而不是捕捉到一个新的位置,我想精灵的角度重置为0。接下来,我想让角度持续旋转。所以如果我朝正方向旋转,角度应该在正方向上不断增加,

  • 问题内容: 我正在用Java制作2D游戏,玩家可以通过障碍物引导多边形。多边形上下移动,游戏世界向左和向右滚动。我需要多边形绕其中心旋转,但是由于它不断地被平移,所以它绕着点旋转。尝试将其平移回原始中心,旋转并重新平移不起作用。如何获得形状的中心? 这是我在2ms计时器上的运动计算: 这是我的paintComponent方法: 其中(xPos,yPos)是屏幕的中心。 问题答案: 转换(通常)是复

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(

  • 我使用上面的代码来旋转PDF。 对于上面的图像,我得到以下输出 从这段代码来看,页面的内容已经移出了框架,并且没有围绕其中心进行旋转。但我想把输出作为 请给我一些建议。提前谢谢。

  • 我有两个矩形,其中一个是另一个的剪裁。现在我想围绕剪切矩形的中心旋转较大的矩形并调整x / y值。 如何计算旋转后的新x/y值? 我只想绕着小盒子的中心旋转大盒子的x/y。因此,较大盒子的x/y点相对于较小盒子的顶部/左侧点。我有小盒子的宽度和高度,所以我可以计算大盒子相对于小盒子中心的x/y点。旋转的角度以度为单位。旋转可以是任何角度,例如10度。

  • 我试着绕着它的中心旋转一个矩形。使用GraphicsContext ie gc将旋转绘制到画布上。这是我的绘图代码。 这会将矩形移动到其中心,然后围绕其左上角点旋转矩形。我试着把两边的长度和宽度减半,但那只会让它飞得到处都是。我数学不好也许这里有更好的人能告诉我我做错了什么。 如果需要的话,我还存储了矩形的所有四个点(角)。 谢了乔