2011-09-22 267 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