用随机设置绘制一系列同心圆 [英] Draw series of concentric circles with random settings

查看:205
本文介绍了用随机设置绘制一系列同心圆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm really stuck on how to go about programming this. Need to draw a series of 8 concentric circles using Java drawArc method with following conditions

使用import java.util.Random library

using import java.util.Random library


  1. 提供在随机位置开始绘图(即,必须随机计算xy
    cooridinate)。

  2. 提供随机颜色每个圆圈

  3. 为每个圆圈提供随机直径

我当前的代码能够获取每个圆圈的随机颜色,但不清楚如何满足其他随机条件

My current code is able to get random random color for each circle but not clear how to meet other random conditions

// 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
}


推荐答案

有几点是这样做的关键:

Several points are key to such an exercise:


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

  • Start with constants for the number of circles and step size; the random number generator in particular only needs to be created once.

private static final int N = 8;
private static final int S = 32;
private static Random random = new Random();


  • 选择坐标位于绘图区域内的随机点。

  • Choose a random point whose coordinates fall within the drawing area.

    // a random point inset by S
    int x = random.nextInt(getWidth() - S * 2) + S;
    int y = random.nextInt(getHeight() - S * 2) + S;
    


  • 对于每个圆圈,找到直径作为 S的函数,添加一个步骤的随机部分,并在所选择的点处渲染圆弧偏移半径。

  • For each circle, find the diameter as a function of S, adding a random fraction of a step, and render the arc at the chosen point offset by the radius.

    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()< Color>

    As random colors are not always appealing, consider Collections.shuffle() on a 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() 建立绘图面板的大小。

  • Override getPreferredSize() to establsh the drawing panel's size.

    private static final int W = S * 12;
    private static final int H = W;
    …
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    


  • 另见 初始主题

    这篇关于用随机设置绘制一系列同心圆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆