У меня есть прямоугольник, который вращается вокруг его середины, и у меня есть другой прямоугольник, который я хочу подключить к верхнему правому углу вращающегося прямоугольника. Проблема в том, что я понятия не имею, как получить угол, чтобы второй прямоугольник всегда застрял в этом углу.Получить углы вращающегося прямоугольника
Это мой пример кода. Прямо сейчас второй прямоугольник будет в одном и том же месте все время, а это не результат, который мне нужен.
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' фактически вызывает странный скачок, когда он достигнут, и прямоугольник вращается намного быстрее, чем вы, должно быть, хотели этого. – Arend