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