【问题标题】:Get the corners of a rotating rectangle获取旋转矩形的角
【发布时间】:2013-05-27 17:14:16
【问题描述】:

我有一个围绕它的中间旋转的矩形,我还有另一个矩形要连接到旋转矩形的右上角。问题是我不知道如何得到角,以便第二个矩形总是会粘在那个角上。

这是我的示例代码。现在第二个矩形将一直在同一个地方,这不是我想要的结果。

package Test;

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

class Test{

    public static void main(String[] args){
        new Test();
    }

    public Test(){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new Graphic());
                frame.setSize(1000,700);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

class Graphic extends JPanel{
    private int x, y, windowW, windowH;
    private double angle;
    private Rectangle rect1, rect2;
    private Path2D path;
    private Timer timer;
    private AffineTransform rotation;

    public Graphic(){
        windowW = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        windowH = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        path = new Path2D.Double();
        rotation = new AffineTransform();
        angle = 0;
        x = windowW / 2;
        y = windowH / 2;
        timer = new Timer(100, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                angle += .1;
                if(angle > 360) angle -= 360;
                repaint();
            }
        });
        timer.start();
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        rotation.setToTranslation(500, 200);
        rotation.rotate(angle, 32, 32);
        rect1 = new Rectangle(0, 0, 64, 64);
        path = new Path2D.Double(rect1, rotation);
        rect2 = new Rectangle(path.getBounds().x, path.getBounds().y, 10, 50);
        g2d.fill(path);
        g2d.fill(rect2);
    }
}

【问题讨论】:

  • 你在angle上的界限似乎暗示你想用度数来表达;然而rotate 函数的第一个参数是弧度。条件if(angle > 360) angle -= 360 在到达时实际上会导致奇怪的跳跃,并且矩形的旋转速度比您想要的要快得多。

标签: java rotation awt shape rectangles


【解决方案1】:

数学解:)

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    rotation.setToTranslation(500, 200);
    rotation.rotate(angle, 32, 32);
    rect1 = new Rectangle(0, 0, 64, 64);
    path = new Path2D.Double(rect1, rotation);
    double r = 32.0 * Math.sqrt(2);
    // (532, 232) - coordinates of rectangle center        |
    // you can change position of second rectangle by this V substraction (all you need to know is that the full circle corresponds to 2Pi)
    int x2 = (int) Math.round(532 + r * Math.cos(angle - Math.PI / 4));
    int y2 = (int) Math.round(232 + r * Math.sin(angle - Math.PI / 4));
    rect2 = new Rectangle(x2, y2, 10, 50);
    g2d.fill(path);
    g2d.fill(rect2);
}

当然,有些常量应该是类字段,而不是方法变量。

【讨论】:

    【解决方案2】:

    我无法确定测试此代码,但我相信它是您想要的正确工作代码

    int hw = -width / 2;
    int hh = -height / 2;
    int cos = Math.cos( theta );
    int sin = Math.sin( theta );
    int x = hw * cos - hh * sin;
    int y = hw * sin + hh * cos;
    

    这将根据正方形的 theta、旋转为您提供左上角。要获得其他角落,您只需更改 hw 和 hh 值:

    //top right corner
    hw = width / 2
    hh = -height / 2
    
    //bottom right corner
    hw = width / 2
    hh = height / 2
    
    //bottom left corer
    hw = -width / 2
    hh = height / 2
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2018-12-29
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多