如何解决如何让我的星星旋转?我能够制作星星,但不知道如何让它旋转
这是我画星星的代码
g2d.setstroke(new Basicstroke(5.0f));
g2d.setPaint(Color.BLACK);
g2d.drawLine(-40,-90,40,40);
g2d.drawLine(80,-80,0);
g2d.drawLine(-80,160,0);
g2d.drawLine(160,-40,-90);
解决方法
这是一种方法。另一种方法是在 Polygon
类中构建星形,然后旋转多边形本身或旋转图形上下文。请注意,我通过反复试验翅膀创造了星星。使用三角函数计算出星星的一点,然后旋转绘制所有五个点。
另外,请注意我在 paintComponent
方法中构建了星形。可能不是最好的做法,因为将事件调度线程中的处理保持在最低限度很重要。
速率旋转由角度增量和定时器延迟控制。在这种情况下,计时器是一个 Swing 计时器。
如果您想查看您的星星版本,只需注释掉我的 drawStar
方法调用并在 paintComponent
中取消注释您的代码
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class StarPicture {
JFrame frame = new JFrame();
MyPanel panel = new MyPanel();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new StarPicture().start());
}
public void start() {
Timer t = new Timer(0,(ae)-> frame.repaint());
t.setDelay(50); //50 milliseconds per rotational increment
t.start();
}
public StarPicture() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
// center on screen
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MyPanel extends JPanel {
double angle = 0;
static double RADIUS = 50;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
// visually smooth the lines
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(2.0f));
g2d.setPaint(Color.BLACK);
// set the origin to the center of the panel
g2d.translate(250,250);
g2d.rotate(angle);
// draw the star in the center of the panel
drawStar(g2d);
// g2d.drawLine(-40,-90,40,40);
// g2d.drawLine(80,-80,0);
// g2d.drawLine(-80,160,0);
// g2d.drawLine(160,-40,-90);
// adjust the amount of rotation per timer interval
angle += Math.PI/200;
g2d.dispose();
}
public static void drawStar(Graphics2D g) {
int a = (int)(RADIUS*Math.cos(Math.toRadians(54)));
int b = (int)(RADIUS*Math.sin(Math.toRadians(54)));
int y = (int)(a*Math.tan(Math.toRadians(72)))+b;
for (int i = 0; i < 5; i++) {
g.drawLine(-a,b,y);
g.drawLine(a,y);
g.rotate(Math.toRadians(72));
}
}
public Dimension getPreferredSize() {
return new Dimension(500,500);
}
}
我建议您阅读有关 Graphics2D 类和 AffineTransform 类中所有方法的更多信息,以了解您可以做什么。此外,请查看 Java Tutorials 以了解有关绘画的更多信息。
,您可能想要一个视场角,以该角度进行绘制:
double angle;
g2d.rotate(angle,60,65);
g2d.setStroke(new BasicStroke(5.0f));
g2d.setPaint(Color.BLACK);
g2d.drawLine(-40,40);
g2d.drawLine(80,0);
g2d.drawLine(-80,0);
g2d.drawLine(160,-90);
g2d.rotate(-angle,65); // Undo rotation for other paints.
旋转发生在中心周围(60、65,如果我数对了)
对于动画连续旋转,可以使用摆动计时器:
ActionListener tickTack = evt -> {
angle += Math.PI / 8;
if (angle >= 2 * Math.PI) {
angle -= 2 * Math.PI;
}
};
Timer timer = new Timer(1000L,tickTack,this); // Start after 1000 ms.
timer.setRepeats(true);
timer.setDelay(100L); // Every 100 ms.
timer.start();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。