2013-02-02 102 views
3

我正在用Java创建一个小游戏,我有一个旋转的图像。计算图像的最大尺寸?

enter image description here

正如你可以在下面的两张图片看,有慢慢在游戏中旋转的巨船,但是当它到达某个点它就会被切断(由于其自身的小的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

旋转图像将改变其大小,你需要考虑到这一变化。查看[this](http://stackoverflow.com/questions/12165977/java-image-rotation)和[this](http://stackoverflow.com/questions/4156518/rotate-an-image-in-java )例如 – MadProgrammer

回答

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

这正是我所期待的,非常感谢。 –

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); 
+0

你可以进一步深入了解它的功能吗? 如果这就是我认为的那样,它会旋转我场景中的所有东西,这不是我想要的。 –

+0

@ShaunWild它不旋转一切。它只会旋转你正在绘制的图像。 – Doorknob

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

0

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

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

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

您可能还需要看一看this线为好,因为它可能会有所帮助。