Number3.java
1    package NPW;
2    
3    import java.awt.Color;
4    import java.util.Random;
5    import java.util.Scanner;
6    import javax.swing.JOptionPane;
7    import javax.swing.SwingUtilities;
8    
9    import painter.SPainter;
10   import shapes.SCircle;
11   import shapes.SSquare;
12   
13   public class Number3 {
14   
15       // The solution to the graphical problem.
16       private void paintTheImage() {
17           // Get the input information from the user.
18           int nrOfRows = getNumber("rows");
19           int nrOfColumns = getNumber("columns");
20           int sizeOfCircle = getNumber("circle radius");
21           // Establish the painter.
22           int height = (nrOfRows * sizeOfCircle) * 2;
23           int width = nrOfColumns * sizeOfCircle * 2;
24           SPainter miro = new SPainter("Number 3",width+50,height+50);
25           miro.setBrushWidth(4);
26           SCircle circle = new SCircle(sizeOfCircle);
27           // Paint the rectangles.
28           paintRectangle(miro,circle,nrOfRows,nrOfColumns);
29       }
30   
31       private static int getNumber(String prompt) {
32           String nss = JOptionPane.showInputDialog(null,prompt+"?");
33           Scanner scanner = new Scanner(nss);
34           return scanner.nextInt();
35       }
36   
37       private static void paintRectangle(SPainter miro, SCircle circle,
38                                          int nrOfRows, int nrOfColumns) {
39           // Position the painter to paint the rectangle of squares.
40           miro.mlt(((nrOfColumns-1)/2.0) * circle.diameter());
41           miro.mbk(((nrOfRows-1)/2.0) * circle.diameter());
42           // Paint the rectangle of squares.
43           int i = 1;
44           while ( i <= nrOfRows) {
45               paintOneRow(miro,nrOfColumns,circle);
46               miro.mfd(circle.diameter());
47               i = i + 1;
48           }
49           // Make the method invariant with respect to painter position.
50           miro.mrt(((nrOfColumns-1)/2.0) * circle.diameter());
51           miro.mfd(((nrOfRows-1)/2.0) * circle.diameter());
52       }
53   
54       private static void paintOneRow(SPainter miro, int nrOfColumns, SCircle circle) {
55           int i = 1;
56           while ( i <= nrOfColumns ) {
57               paintOneSquare(miro,circle);
58               miro.mrt(circle.diameter());
59               i = i + 1;
60           }
61           miro.mlt(nrOfColumns*circle.diameter());
62       }
63   
64       private static void paintOneSquare(SPainter miro, SCircle circle) {
65           //Add two instructions
66           circle.s2();
67           miro.setColor(randomColor());
68           miro.paint(circle);
69           circle.x2();
70       }
71       private static Color randomColor() {
72           Random rgen = new Random();
73           int r = rgen.nextInt(256);
74           int g = rgen.nextInt(256);
75           int b = rgen.nextInt(256);
76           return new Color(r,b,g);
77       }
78   
79       public Number3(){
80           paintTheImage();
81       }
82   
83       public static void main(String[] args){
84           SwingUtilities.invokeLater(new Runnable() {
85               @Override
86               public void run() {
87                   new Number3();
88               }
89           });
90       }
91   }
92