计算图像的最大尺寸?

3
我正在使用Java创建一个小游戏,其中有一张图片会被旋转。
如下面的两张图片所示,在游戏中有一艘巨大的船缓慢旋转,但当它到达某个点时,由于自己的小BufferedImage而被切断。
这是我的渲染代码:
public void drawImageRotated(BufferedImage img, double x, double y, double scale,    double angle) {
        x -= xScroll;
        y -= yScroll;  
        BufferedImage image = new BufferedImage((int)(img.getWidth() * 1.5D), (int)(img.getHeight() * 1.5D), 2);
        Graphics2D g = (Graphics2D)image.getGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.rotate(Math.toRadians(angle), image.getWidth() / 2, image.getHeight() / 2);
        g.drawImage(img, image.getWidth() / 2 - img.getWidth() / 2, image.getHeight() / 2 - image.getHeight() / 2, null);
        g2d.drawImage(image, (int)(x-image.getWidth()*scale/2), (int)(y-image.getHeight()*scale/2), (int)(image.getWidth()*scale), (int)(image.getHeight()*scale), null);
        g.dispose();      
 }

回到正题,我该如何计算旋转后图像的最大 x 和 y 大小,以便可以根据缓冲图像的大小进行补偿?


1
旋转图像会改变其大小,您需要考虑这种变化。请查看以下链接以获取示例:这个这个 - MadProgrammer
4个回答

1
我该如何计算旋转后图像的最大x和y尺寸,以便我可以通过缓冲图像的尺寸进行补偿?
double sin = Math.abs(Math.sin(angle));
double cos = Math.abs(Math.cos(angle));
int w = image.getWidth();
int h = image.getHeight();
int neww = (int)Math.floor(w*cos+h*sin);
int newh = (int)Math.floor(h*cos+w*sin);

上面的代码取自这个示例:Java(SWING)与旋转配合工作

1
如果您有一张基本上是矩形的图像,它围绕其中心旋转,那么在旋转过程中的最大宽度和高度将会在图像矩形的对角线水平或垂直时出现。这个对角线距离可以用勾股定理计算,并用于BufferedImage的宽度和高度。
    int size = (int) Math.sqrt((img.getWidth() * img.getWidth()) + (img.getHeight() * img.getHeight()));
    BufferedImage image = new BufferedImage(size, size, 2);
    // The rest of your code as before

0

另一种方法是旋转实际的Graphics对象,绘制图像,然后恢复旋转:

AffineTransform old = g2d.getTransform();
g2d.rotate(Math.toRadians(angle), x + image.getWidth() / 2, y + image.getWidth() / 2);
g2d.drawImage(image, x, y, null);
g2d.setTransform(old);

你能否更详细地解释一下它的作用?如果我猜得没错,它会旋转场景中的所有物体,这不是我想要的。 - Shaun Wild
@ShaunWild它并不会旋转所有的东西。它只会旋转你正在绘制的图像。 - tckmn

0

我们考虑 width 为原始图像的宽度,height 为其原始高度,angle 为弧度旋转角度值。

根据我的计算,旋转后的图像大小大致如下:

rotatedWidth = Math.cos(angle) * width + Math.sin(angle) * height;
rotatedHeight = Math.sin(angle) * width + Math.cos(angle) * height;

你可能还需要查看this线程,因为它可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接