问题
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
using import java.util.Random library
- Provide for starting the drawings at random location (i.e., the x-y cooridinate must be calculated randomly).
- Provide a random color for each circle
- Provide a random diameter for each circle
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
}
回答1:
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;
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); }
Resize the enclosing frame, which forces a
repaint()
, to see the effect.As random colors are not always appealing, consider
Collections.shuffle()
on aList<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() 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);
See also Initial Threads.

来源:https://stackoverflow.com/questions/18809216/draw-series-of-concentric-circles-with-random-settings