Нарисуйте ряд концентрических кругов со случайными настройками

Я действительно застрял на том, как идти о программировании этого. Необходимо нарисовать серию из 8 концентрических окружностей, используя метод Java drawArc со следующими условиями

использование библиотеки импорта java.util.Random

  1. Предусмотреть запуск рисунков в произвольном месте (т. Е. Координату xy необходимо рассчитать случайным образом).
  2. Укажите случайный цвет для каждого круга
  3. Укажите случайный диаметр для каждого круга

Мой текущий код может получить случайный случайный цвет для каждого круга, но не ясно, как удовлетворить другие случайные условия

// 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 ответ

Решение

Несколько пунктов являются ключевыми для такого упражнения:

  • Начните с констант для количества кругов и размера шага; в частности, генератор случайных чисел должен быть создан только один раз.

    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));
    
  • Override getPreferredSize() установить размер панели чертежа.

    private static final int W = S * 12;
    private static final int H = W;
    …
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    
  • Смотрите также Начальные темы.

концентрические дуги

Другие вопросы по тегам