旋转 Java 图形 2D 矩形?

2022-09-02 09:28:32

我到处寻找,我只是找不到答案。
如何在java中旋转矩形?

这是我的一些代码:

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();
    }
}

答案 1

对于图像,您必须使用Graphics2D的drawImage方法和相对的仿射变形

对于形状,您可以旋转图形2D本身:

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方法而不是paint。

引用JComponent的API:

由 Swing 调用以绘制组件。应用程序不应直接调用 paint,而应使用重绘方法来计划重绘组件。

此方法实际上将绘画工作委托给三种受保护的方法:paintComponent,paintBorder和paintChildren。它们按列出的顺序调用,以确保子级显示在组件本身的顶部。一般来说,组件及其子组件不应在分配给边框的插图区域进行绘制。子类可以像往常一样重写此方法。只想专门化 UI(外观和感觉)委托的绘制方法的子类应该只覆盖 paintComponent。

还要记住,当您执行仿射变换(如旋转)时,对象将隐式地围绕轴原点旋转。因此,如果您的意图是围绕任意点旋转它,则应在将其平移回原点之前旋转它,然后将其重新移入所需的点。


答案 2
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()并允许您保存当前的转换参数(以及当前的字体,笔触,绘画等),并在以后恢复它们。它等同于 OpenGL 中的和 OpenGL。Graphics.dispose()glPushMatrix()glPopMatrix()

绘制矩形后,还可以应用反向旋转,以将转换矩阵恢复到其初始状态。但是,减法过程中的浮点近似可能会导致错误的结果。


推荐