2013-02-02 114 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線爲好,因爲它可能會有所幫助。