1 package npw; 2 3 import painter.SPainter; 4 import shapes.SCircle; 5 6 import javax.swing.*; 7 import java.awt.*; 8 import java.util.Random; 9 import java.util.Scanner; 10 11 public class HirstDots { 12 public static void main(String[] args) { 13 SwingUtilities.invokeLater(HirstDots::new); 14 } 15 public HirstDots() { 16 paintTheImage(); 17 } 18 private void paintTheImage(){ 19 int width = getNumber("width"); 20 int height = getNumber("height"); 21 int dotHorizontalSpace = getNumber("horizontal space between dots"); 22 int dotVerticalSpace = getNumber("vertical space between dots"); 23 // Establish the painter 24 SPainter painter = new SPainter("Hirst Dots", width, height); 25 SCircle dot = new SCircle(5); 26 // Move the painter to the upper left corner to get ready to paint the gradient 27 painter.mfd(height/2.0); 28 painter.tl(); 29 painter.mfd(width/2.0); 30 painter.tl(); 31 // Paint it! 32 paintGradient(painter, dot, height, width, dotHorizontalSpace, dotVerticalSpace); 33 } 34 private static int getNumber(String prompt) { 35 String nss = JOptionPane.showInputDialog(null,prompt+"?"); 36 Scanner scanner = new Scanner(nss); 37 return scanner.nextInt(); 38 } 39 private void paintGradient(SPainter painter, SCircle dot, int height, int width, int dotHorizontalSpace, int dotVerticalSpace){ 40 double colWidth = dot.diameter() + dotHorizontalSpace; 41 int nrOfCols = (int) Math.floor((width / colWidth)) - 1; 42 int cols = 0; 43 while (cols < nrOfCols){ 44 nextCol(painter, dot, dotHorizontalSpace); 45 paintColumn(painter, dot, height, dotVerticalSpace); 46 cols = cols + 1; 47 } 48 } 49 private void paintOneDot(SPainter painter, SCircle dot){ 50 painter.setColor(randomColor()); 51 painter.paint(dot); 52 } 53 // Dots are spaced more tightly together near the bottom of the canvas. 54 private void paintColumn(SPainter painter, SCircle dot, int height, int dotVerticalSpace) { 55 double totalDistanceTraveled = 0; 56 // Paint a column with decreasing distance between dots. 57 while (totalDistanceTraveled < (height - (2*(dot.diameter() + dotVerticalSpace)))){ 58 double travel = dot.diameter() + dotVerticalSpace; 59 totalDistanceTraveled = totalDistanceTraveled + travel; 60 painter.mfd(travel); 61 paintOneDot(painter, dot); 62 } 63 // Make the method invariant with respect to painter position. 64 painter.mbk(totalDistanceTraveled); 65 } 66 // Moves the painter to the next column. 67 private void nextCol(SPainter painter, SCircle dot, int dotHorizontalSpace){ 68 painter.tl(); 69 painter.mfd(dot.diameter() + dotHorizontalSpace); 70 painter.tr(); 71 } 72 private static Color randomColor() { 73 Random rgen = new Random(); 74 int r = rgen.nextInt(256); 75 int g = rgen.nextInt(256); 76 int b = rgen.nextInt(256); 77 return new Color( r, g, b); 78 } 79 } 80