Number3.java
1    /* 
2     *This program makes Hirst Dots, it's very similar to Number 2 but instead the squares are circles... 
3     * Also the circles are outlined... 
4     */
5    package npw;
6    import java.awt.Color;
7    import java.util.Random;
8    import java.util.Scanner;
9    import javax.swing.JOptionPane;
10   import javax.swing.SwingUtilities;
11   import painter.SPainter;
12   import shapes.SCircle;
13   
14   public class Number3 {
15       //Solution to the graphical problem.
16       private void paintTheImage() {
17           //Get the input info from the user.
18           int numOfRows = getNumber("rows");
19           int numOfColumns = getNumber("columns");
20           int sizeOfCircle = getNumber("circle side length");
21           //Establishing the painter.
22           int height = numOfRows * sizeOfCircle;
23           int width = numOfColumns * sizeOfCircle;
24           SPainter leo = new SPainter("Number 3",width+50,height+50);
25           leo.setBrushWidth(4);
26           SCircle circle = new SCircle(sizeOfCircle);
27           paintCircle(leo,circle,numOfRows,numOfColumns);
28       }
29   
30       private int getNumber(String prompt) {
31           String nss = JOptionPane.showInputDialog(null,prompt+"?");
32           Scanner scan = new Scanner(nss);
33           return scan.nextInt();
34       }
35       private void paintCircle(SPainter leo, SCircle circle, int numOfRows, int numOfColumns) {
36           //Position the painter to paint the rectangle of squares.
37           leo.mlt(((numOfColumns-1)/2.0)*circle.radius());
38           leo.mbk(((numOfRows-1)/2.0)*circle.radius());
39           //Paint the rectangle of circles.
40           int i = 1;
41           while (i <= numOfRows) {
42               paintOneRow(leo,numOfColumns,circle);
43               leo.mfd(circle.radius());
44               i = i + 1;
45           }
46           //Used to make method invariant with respect to painter position.
47           leo.mrt(((numOfColumns-1)/2.0)*circle.radius());
48           leo.mfd(((numOfColumns-1)/2.0)*circle.radius());
49       }
50   
51       private void paintOneRow(SPainter leo, int numOfColumns, SCircle circle) {
52           int i = 1;
53           while (i <= numOfColumns) {
54               paintOneCircle(leo,circle);
55               leo.mrt(circle.radius());
56               i = i + 1;
57           }
58           //invariant
59           leo.mlt(numOfColumns*circle.radius());
60       }
61   
62       private void paintOneCircle(SPainter leo, SCircle circle) {
63           circle.setRadius(((int) circle.radius())/4);
64           leo.setColor(randomColor());
65           leo.paint(circle);
66           circle.setRadius(((int) circle.radius())*4);
67   
68   
69   
70       }
71   
72       private Color randomColor() {
73           Random randomGenerator = new Random();
74           int r = randomGenerator.nextInt(256);
75           int g = randomGenerator.nextInt(256);
76           int b = randomGenerator.nextInt(256);
77           return new Color(r,b,g);
78       }
79       public Number3(){
80           paintTheImage();
81       }
82       public static  void main(String[] args){
83           SwingUtilities.invokeLater(new Runnable() {
84               @Override
85               public void run() {
86                   new Number3();
87               }
88           });
89       }
90   }
91