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 大小,以便补偿缓冲图像的大小?

4

4 回答 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) working with Rotation

于 2013-02-02T20:48:31.517 回答
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
于 2013-02-02T20:49:55.933 回答
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);
于 2013-02-02T20:36:53.477 回答
0

让我们考虑width原始图像的宽度、height原始高度和angle以弧度为单位的旋转角度值。

根据我的计算,旋转图像的大小是这样的:

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

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

于 2013-02-02T20:48:45.853 回答