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 CircleOfSquares { 13 14 private void paintTheImage(){ 15 int radius = getNumber("circle radius"); 16 int side = getNumber("square side length"); 17 SPainter painter = new SPainter("Circle of 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 painter.setColor(randomColor()); 59 painter.paint(square); 60 painter.setColor(Color.BLACK); 61 painter.draw(square); 62 } 63 64 private static int squaresOnLineCount(double lineLength, double sideLength){ 65 int squares = ( (int)Math.ceil( ( lineLength - sideLength ) / sideLength ) + 1); 66 return squares; 67 } 68 69 private double chordLength(double yOffset, SCircle circle){ 70 double xLength = Math.sqrt(Math.pow(circle.radius(), 2) - Math.pow(yOffset, 2)); 71 double chordLength = xLength * 2; 72 return chordLength; 73 } 74 75 private static int getNumber(String prompt) { 76 String nss = JOptionPane.showInputDialog(null,prompt+"?"); 77 Scanner scanner = new Scanner(nss); 78 return scanner.nextInt(); 79 } 80 81 private static Color randomColor() { 82 Random rgen = new Random(); 83 int r = rgen.nextInt(256); 84 int g = rgen.nextInt(256); 85 int b = rgen.nextInt(256); 86 return new Color(r,g,b); 87 } 88 89 public CircleOfSquares() { 90 paintTheImage(); 91 } 92 93 public static void main(String[] args) { 94 SwingUtilities.invokeLater(new Runnable() { 95 public void run() { 96 new CircleOfSquares(); 97 } 98 }); 99 } 100 }