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