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