2

これをプログラミングする方法に本当にこだわっています。Java drawArc メソッドを使用して、次の条件で一連の 8 つの同心円を描画する必要があります。

import 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
}
4

1 に答える 1

4

このような演習には、いくつかのポイントが重要です。

  • 円の数とステップ サイズの定数から始めます。特に乱数ジェネレーターは一度だけ作成する必要があります。

    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);
    
  • 初期スレッドも参照してください。

同心円弧

于 2013-09-16T16:41:16.823 に答える