【问题标题】:Rotate a group of Graphics objects around a single point?围绕一个点旋转一组图形对象?
【发布时间】:2013-11-04 16:11:11
【问题描述】:

我在网上找到了一张图片 (http://i.stack.imgur.com/y1oT4.png),我正在尝试拍摄太阳和天空,让它们围绕屏幕中心旋转,这样太阳和它的光线就好像在旋转。

我打算使用计时器来控制运动,但我不知道如何旋转任意角度。换句话说,我知道如何以 90 为增量旋转(切换宽度和高度),但我想做的是对一组对象进行分组并围绕一个点旋转它们。

我环顾四周,找到了 AffineTransform() 方法,但我不知道这是否真的是我需要的,或者如果需要,如何使用它。

编辑:这能解决我的问题吗? How to rotate Graphics in Java我会试试更新的。

编辑:它让我更接近,但没有解决它。它返回此运行时错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at FallScene.rotateBack(FallScene.java:77)
    at SceneDriver$1TimerListener.actionPerformed(SceneDriver.java:66)
    at javax.swing.Timer.fireActionPerformed(Timer.java:312)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:244)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo
    main.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    Press any key to continue...

FallScene.rotateBack(FallScene.java:77) 的调用是:

    bg.rotate(Math.toRadians(deg));

...转到:

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);

    // Get the size of the component window
    int w = getWidth();
    int h = getHeight();

    // The Graphics2D object for the BACKGROUND
    Graphics2D bg = (Graphics2D)g;          

    // Sun
    Color solarYellow = new Color(255, 218, 0);
    bg.setPaint(solarYellow);
    Ellipse2D.Double sun = new Ellipse2D.Double((w / 2) - 150, (h / 2) - 150, 300, 300);
    bg.fill(sun); bg.draw(sun);
}

【问题讨论】:

    标签: graphics rotation point affinetransform


    【解决方案1】:

    如果你还需要它,我认为这个操作和注释代码应该可以帮助你理解如何绘制它。

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Line2D;
    import java.awt.geom.Path2D;
    import java.util.TimerTask;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class SunRotate extends JComponent
    {  
        public static void main(String[] args) {
            final SunRotate sunRotate = new SunRotate(45);
            JFrame f = new JFrame();
            f.setContentPane(sunRotate);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setSize(new Dimension(800, 600));
            f.setVisible(true);
            new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    sunRotate.deltaAngle(.3f);
                    sunRotate.repaint();
                }
            }, 16, 16); // every 16 milliseconds
        }
    
    
        private float angle;
    
        public void deltaAngle(float delta) {
            angle += delta;
        }
    
        public SunRotate(float angle) {
            this.angle = angle;
        }
    
        public void paintComponent(Graphics g)
        {  
            super.paintComponent(g);
    
            int w = getWidth();
            int h = getHeight();
    
            // Recover Graphics2D 
            Graphics2D g2 = (Graphics2D) g;
    
            // Move and rotate
            g2.translate(w/2.0, h/2.0);
            g2.rotate(Math.toRadians(angle));
    
    
            // draw around 0,0
            Color solarYellow = new Color(255, 218, 0);
            g2.setPaint(solarYellow);
            Ellipse2D.Double sun = new Ellipse2D.Double( -150, -150, 300, 300);
            g2.fill(sun);
            { // draw some rays because the sun is round so we don't see the rotation
                // make a ray (triangle)
                Path2D ray = new Path2D.Float();
                ray.moveTo(0, 0);
                ray.lineTo(1000, 50);
                ray.lineTo(1000, -50);
                ray.closePath();
                // draw N rays, rotating each time
                int N = 20;
                for (int i = 0; i < N; i++) {
                    g2.fill(ray);
                    g2.rotate(Math.PI * 2 / N);
                }
            }
        }
    
    }
    

    【讨论】:

    • 这会作为独立文件运行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多