用随机设置绘制一系列同心圆

时间:2013-09-15 05:30:47

标签: java swing jpanel java-2d paintcomponent

我真的被困在如何编程这个上。需要使用具有以下条件的Java drawArc方法绘制一系列8个同心圆

使用import java.util.Random library

  1. 提供在随机位置开始绘图(即x-y cooridinate必须随机计算。)
  2. 为每个圆圈提供随机颜色
  3. 为每个圆圈提供随机直径
  4. 我目前的代码能够获得每个圆圈的随机颜色,但不清楚如何满足其他随机条件

    // Exercise 12.6 Solution: CirclesJPanel.java
    // This program draws concentric circles
    import java.awt.Graphics;
    import javax.swing.JPanel;
    
    public class ConcentricCircles extends JPanel
    {
      // draw eight Circles separated by 10 pixels
       public void paintComponent( Graphics g )
       {
          Random random = new Random();
          super.paintComponent( g );
    
          // create 8 concentric circles
          for ( int topLeft = 0; topLeft < 80; topLeft += 10 )
          {
             int radius = 160 - ( topLeft * 2 );
             int r = random.nextInt(255);
             int gr = random.nextInt(255);
             int b = random.nextInt(255);
             Color c = new Color(r,gr,b);
             g.setColor(c);
             g.drawArc( topLeft + 10, topLeft + 25, radius, radius, 0, 360 );
          } // end for
       }  
    }
    
    // This program draws concentric circles
    import javax.swing.JFrame;
    
    public class ConcentricCirclesTest extends JFrame {
        /**
        * @param args
        */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            JFrame frame=new JFrame("Concentric Circles");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            ConcentricCircles cCirclesJPanel = new ConcentricCircles();
            frame.add(cCirclesJPanel);
            frame.setSize(200,250);
            frame.setVisible(true);
    
    
        }//end main
    }
    

1 个答案:

答案 0 :(得分:3)

有几点是这项工作的关键:

  • 从圈数和步长的常数开始;特别是随机数生成器只需要创建一次。

    private static final int N = 8;
    private static final int S = 32;
    private static Random random = new Random();
    
  • 选择坐标位于绘图区域内的随机点。

    // a random point inset by S
    int x = random.nextInt(getWidth() - S * 2) + S;
    int y = random.nextInt(getHeight() - S * 2) + S;
    
  • 对于每个圆圈,找到直径作为S的函数,添加步长的随机分数,并在所选择的点处渲染圆弧偏移半径。

    for (int i = 0; i < N; i++) {
        g2d.setColor(…);
        int d = (i + 1) * S + random.nextInt(S / 2);
        int r = d / 2;
        g2d.drawArc(x - r, y - r, d, d, 0, 360);
    }
    
  • 调整封闭框架的大小,以强制repaint(),以查看效果。

  • 由于随机颜色并不总是吸引人,请考虑Collections.shuffle()上的List<Color>

    private final List<Color> clut = new ArrayList<Color>();
    …
    for (int i = 0; i < N; i++) {
        clut.add(Color.getHSBColor((float) i / N, 1, 1));
    }
    …
    Collections.shuffle(clut);
    …
    g2d.setColor(clut.get(i));
    
  • 覆盖getPreferredSize()以建立绘图面板的大小。

    private static final int W = S * 12;
    private static final int H = W;
    …
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    
  • 另请参阅Initial Threads

concentric arcs