该代码旨在绘制一个矩形,该矩形一次围绕画布中心移动一圈。我公司目前拥有的代码是如何绘制围绕画布中心的圆圈移动矩形?
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.Timer;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Q3_Circular extends JComponent {
protected int degree = 0;
protected double xStart;
protected double yStart;
protected Timer timer;
public Q3_Circular() {
timer = new Timer(1000, new TimerCallback()); //creates new times that refreshes every 100 ms, and called the TimerCallback class
timer.start();
}
protected class TimerCallback implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (degree < (2 * Math.PI)){
xStart = getWidth()/2 * Math.cos(degree+1);
yStart = getHeight()/2 * Math.sin(degree+1);
degree+= 1;
repaint();
}
else {
degree += 0;
repaint();
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("AnimatedSquare");
Q3_Circular canvas = new Q3_Circular();
frame.add(canvas);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void paintComponent(Graphics g){
xStart = (double)(getWidth())/2.0 * Math.cos(degree);
yStart = (double)(getHeight())/2.0 * Math.sin(degree);
Graphics2D g2 = (Graphics2D) g;
g2.draw(new Rectangle2D.Double(xStart,yStart, 25,25));
repaint();
}
}
此代码出现非常迅速地绘制矩形围绕点(0,0)。我不确定代码出错的地方。
您需要知道'Math#cos'和'Math#sin'中的'degree'参数假设为* Radian *而非Degrees。此外,您应该知道,对于某些输入,“sin”和“cos”函数的输出可以是** Negative **。所以你的'xStart'和'yStart'被计算为负值,然后在你的帧之外绘制。另外,当您在'paintComponent'方法中计算'xStart'和'yStart'时,您将忽略'actionPerformed'方法中的计算。询问任何问题,如果这些提示没有帮助。 – STaefi
顺便说一句,虽然它没有回答你的问题,但可能它可以简化你的代码。在Graphics2D中,您可以使用仿射变换进行旋转。他们基本上会让你摆脱三角函数。请阅读此处:http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html –
谢谢,这非常有帮助。我仍然遇到的唯一问题是它围绕点0,0围绕点(getWidth()/ 2,getHeight()/ 2)旋转。 –