2011-09-22 176 views
14

我到處搜索過,只是無法找到答案。
如何旋轉在Java中的矩形?旋轉Java Graphics2D矩形?

下面是我的一些代碼:

package net.chrypthic.Space; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Space extends JPanel implements ActionListener{ 
    Timer time; 
    public Space() 
    { 
     setVisible(true); 
     setFocusable(true); 
     addMouseMotionListener(new ML()); 
     addMouseListener(new ML()); 
     addKeyListener(new AL()); 
     time=new Timer(5, this); 
     time.start(); 
    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setColor(Color.WHITE); 
     Rectangle rect2 = new Rectangle(100, 100, 20, 20); 

     g2d.draw(rect2); 
     g2d.fill(rect2); 
    } 
    public void actionPerformed(ActionEvent ae) { 
     repaint(); 
    } 
    public class AL extends KeyAdapter 
    { 
     public void keyPressed(KeyEvent e) { 
     } 

     public void keyReleased(KeyEvent e) { 
     } 
    } 
    public class ML extends MouseAdapter 
    { 
     public void mouseMoved(MouseEvent e) { 
     } 

     public void mousePressed(MouseEvent e){ 
     } 
    } 
} 

我試圖g2d.rotate(100D);但它沒有工作。 在此先感謝。

這裏是我的編輯代碼:

package net.chrypthic.Space; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Space extends JPanel implements ActionListener{ 
    Timer time; 
    public Space() 
    { 
     setVisible(true); 
     setFocusable(true); 
     setSize(640, 480); 
     setBackground(Color.BLACK); 
     time=new Timer(5, this); 
     time.start(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D)g; 
     Rectangle rect1 = new Rectangle(100, 100, 20, 20); 
     g2d.setColor(Color.WHITE); 
     g2d.translate(rect1.x+(rect1.width/2), rect1.y+(rect1.height/2)); 
     g2d.rotate(Math.toRadians(90)); 
     g2d.draw(rect1); 
     g2d.fill(rect1); 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     repaint(); 
    } 
} 
+0

這樣你第一次翻譯的矩形,然後旋轉它。它相當於:new Rectangle(110,110,20,20); g2d.rotate(Math.toRadians(45)); – Heisenbug

回答

11

對於必須使用的Graphics2D的drawImage方法與相關AffineTransform圖像。

對於形狀,您可以旋轉的Graphics2D本身:

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.setColor(Color.WHITE); 
    Rectangle rect2 = new Rectangle(100, 100, 20, 20); 

    g2d.rotate(Math.toRadians(45)); 
    g2d.draw(rect2); 
    g2d.fill(rect2); 
} 

而且順便說一句,你應該重寫paintComponent方法,而不是油漆。

援引JComponent的API:

由Swing調用,以繪製組件。應用程序不應該直接調用 油漆,而是應該使用repaint方法來安排 重繪組件。

此方法實際上將繪畫工作委託給三個受保護的方法:paintComponent,paintBorder和paintChildren。 他們被稱爲中列出,以確保兒童出現在 頂部組件本身的順序。一般而言,該組件及其子 不應在分配給邊界的插入區域中繪畫。 子類可以像往常一樣重寫此方法。這 只想特殊化UI子類(外觀)委託的paint方法 應該只重寫paintComponent。

也請記住,當你執行仿射變換,就像一個旋轉,對象是隱式繞軸旋轉的起源比。因此,如果您的目的是圍繞任意點旋轉它,您應該在將其翻譯回原點之前旋轉它,然後將其重新轉換爲所需的點。

+0

謝謝生病嘗試一下,paintComponent有什麼更好的? – chrypthic

+0

K,我試了一下。現在我的矩形被楔入左側角落,儘管我將X的位置設置爲100.爲什麼會發生這種情況? (screenie:http://cl.ly/AM8c) – chrypthic

+0

「還記得,當你進行仿射變換,比如旋轉時,對象會圍繞軸原點隱式旋轉,所以如果你的意圖是圍繞一個任意的點,你應該在將它翻譯回原點之前旋轉它,然後將它重新轉換到所需的點。「我怎麼做的? – chrypthic

10
public void draw(Graphics2D g) { 
    Graphics2D gg = (Graphics2D) g.create(); 
    gg.rotate(angle, rect.x + rect.width/2, rect.y + rect.height/2); 
    gg.drawRect(rect.x, rect.y, rect.width, rect.height); 
    gg.dispose(); 

    gg = (Graphics2D) g.create(); 
    ... other stuff 
} 

Graphics.create()Graphics.dispose()讓您保存當前變換參數(以及當前的字體,筆畫,油漆等),對他們以後恢復。這相當於OpenGL中的glPushMatrix()glPopMatrix()

還可以,一旦你繪製的矩形恢復變換矩陣恢復到初始狀態應用逆向旋轉。但是,替換期間的浮點逼近可能會導致錯誤結果。

+0

JComponent不存在繪製方法 – Heisenbug

+0

當然,我希望op能夠知道如何在JPanel上繪製,這只是一個代碼片段:) –

+0

對於_other_ ['rotate()'] +1( http://download.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#rotate%28double,%20double,%20double%29)。 – trashgod

-1

與g2d.rotate唯一的問題是,它並沒有圍繞一個特定的點旋轉。它將大多搞亂你想要的圖像的位置,然後強制你移動圖像的x和y座標。我不會使用它,特別是對於一款遊戲。你應該看看旋轉java中的一個點。

6

另一種方式是通過使用Path2D,有了它,你可以旋轉的路徑,而不是整個圖形對象:

Rectangle r = new Rectangle(x, y, width, height); 
Path2D.Double path = new Path2D.Double(); 
path.append(r, false); 

AffineTransform t = new AffineTransform(); 
t.rotate(angle); 
path.transform(t); 
g2.draw(path); 
+1

Path2D是Java2D的一個非常棒的功能,我不知道... – Jose