微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让我的星星旋转?我能够制作星星,但不知道如何让它旋转

如何解决如何让我的星星旋转?我能够制作星星,但不知道如何让它旋转

这是我画星星的代码

        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 举报,一经查实,本站将立刻删除。