HirstDots.java
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