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