【问题标题】:How to draw and rotate square inside center of other square?如何在其他正方形的中心内绘制和旋转正方形?
【发布时间】:2013-04-04 13:57:53
【问题描述】:

我需要在其他方格内绘制一些方格,但我不知道如何按方格的中心旋转方格并使它们变小? 这是最后应该是什么样子的图片:

现在我有一些代码可以绘制成圆形的正方形。

class MySquare  extends JComponent {
public void paint(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;
    for (int i = 0; i < 20; i++) {

        g2d = (Graphics2D) g.create();
        g2d.rotate(Math.toRadians(45 - (i * 10)), 100, 100);

        // Difrent colors:
        if (i % 2 == 0)
            g2d.setColor(Color.black);
        else
            g2d.setColor(Color.green);
        g2d.fillRect(50, 50, 100, 100);

    }
    }
}

public class DrawRect {
  public static void main(String[] a) {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 800, 800);
    window.getContentPane().add(new MySquare());
    window.setVisible(true);
  }
}

【问题讨论】:

    标签: java swing user-interface graphics graphics2d


    【解决方案1】:

    你可以先在原点周围画出你的图形(这很容易),然后翻译:

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setSize(400, 400);
            frame.setVisible(true);
    
            frame.add(new JPanel() {
    
                @Override
                protected void paintComponent(Graphics g) {
                    Graphics2D g2d = (Graphics2D) g;
    
                    double alpha = Math.toRadians(5);
                    double factor = 1 / (Math.sin(alpha) + Math.cos(alpha));
                    double size = 200;
    
                    g2d.translate(size, size);
    
                    for (int i = 0; i < 20; i++) {
                        g2d.setColor(i % 2 == 0 ? Color.black : Color.green);
    
                        int intSize = (int) Math.round(size);
    
                        g2d.fillRect(-intSize / 2, -intSize / 2, intSize, intSize);
    
                        size = size * factor;
    
                        g2d.rotate(alpha);
                    }
                }
            });
        }
    }
    

    【讨论】:

    • 我运行了这段代码,但方块甚至不在一个地方,所以我不确定我是否想要那个。
    • Swing 组件的自定义绘画应该在paintComponent(与paint)中完成 - 也应在@user2245026 中完成
    • @user2245026 你是对的,空间转换总是令人困惑。我应该在旋转之前完成翻译。更新了代码并制作了一个 SSCCE 来展示这个概念。
    • @kleopatra 谢谢,已解决
    • @user2245026 是的,我会根据上图尝试解释。看看最大的黑色和绿色方块。假设黑色方块的边长为N,绿色的边长为X。黑色正方形的底部等于 2 个黑色三角形的总和。左侧黑色三角形的边长为X sin(alpha),右侧为X cos(alpha)。因此,N = X (sin(alpha) + cos(alpha))X = N / (sin(alpha) + cos(alpha))。这种模式在每个方格都重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2017-10-28
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多