HirstSquares.java
1    /* 
2    * Program to paint, centered on the canvas, a circle of randomly colored, black-framed squares with spaces inbetween them sort of 
3     */
4    package npw;
5    
6    import painter.SPainter;
7    import shapes.SCircle;
8    import shapes.SRectangle;
9    import shapes.SSquare;
10   
11   import javax.swing.*;
12   import java.awt.*;
13   import java.util.Random;
14   import java.util.Scanner;
15   
16   public class HirstSquares {
17       private void paintTheImage(){
18           int radius = getNumber("circle radius");
19           int side = getNumber("square side length");
20   
21           SPainter painter = new SPainter("Circle of Squares", radius*2+50, radius*2+50);
22           painter.setBrushWidth(3);
23           SCircle circle = new SCircle(radius);
24           SSquare square = new SSquare(side);
25   
26           paintCircleOfSquares(painter,circle,square);
27       }
28   
29       private void paintCircleOfSquares(SPainter painter, SCircle circle, SSquare square) {
30           painter.mfd(circle.radius());
31           painter.tr();
32   
33           double moved = 0;
34                   while ( moved < circle.diameter()) {
35                       double chord = chordLength(circle.radius() - moved, circle);
36                       int squares = squaresOnLineCount(chord, square.side());
37                       paintRow(painter,square,squares);
38                       nextRow(painter, square.side());
39                       moved = moved + square.side();
40                   }
41                   painter.tl();
42                   painter.mfd(circle.radius());
43       }
44   
45   
46   
47   
48       private void nextRow(SPainter painter, double rowHeight) {
49           painter.tr();
50           painter.mfd(rowHeight);
51           painter.tl();
52       }
53       private void paintRow(SPainter painter, SSquare square, int squaresToPaint) {
54           double centerOffset = ( ( squaresToPaint * square.side()) / 2) - square.side()/2;
55           painter.mbk(centerOffset);
56   
57           int painted = 0;
58           while (painted < squaresToPaint){
59               paintOneSquare(painter, square);
60               painter.mfd(square.side());
61               painted = painted +1;
62           }
63   
64           painter.mbk(centerOffset + square.side());
65       }
66   
67       private void paintOneSquare(SPainter painter, SSquare square) {
68           square.s2();
69           painter.setColor(randomColor());
70           painter.paint(square);
71           painter.setColor(Color.BLACK);
72           painter.draw(square);
73           square.x2();
74   
75   
76       }
77   
78   
79       private int squaresOnLineCount(double lineLength, double sideLength) {
80           int squares = ( (int) Math.ceil( (lineLength-sideLength )/ sideLength) + 1);
81           return squares;
82       }
83       private double chordLength(double yOffSet, SCircle circle) {
84           double xLength = Math.sqrt(Math.pow(circle.radius(), 2) - Math.pow(yOffSet, 2));
85           double chordLength = xLength * 2;
86           return chordLength;
87       }
88       private int getNumber(String prompt ) {
89           String nss = JOptionPane.showInputDialog(null,prompt+"?");
90           Scanner scanner = new Scanner(nss);
91           return scanner.nextInt();
92       }
93       private Color randomColor() {
94           Random rgen = new Random();
95           int r = rgen.nextInt(256);
96           int g = rgen.nextInt(256);
97           int b = rgen.nextInt(256);
98           return new Color(r,g,b);
99       }
100      public HirstSquares() {
101          paintTheImage();
102      }
103      
104      public static void main(String[] args) {
105          SwingUtilities.invokeLater(new Runnable() {
106              public void run() {
107                  new HirstSquares();
108                  
109              }
110          });
111      }
112  }
113