HirstDots.java
1    /* 
2     * A program to paint Hirst Dots. 
3     */
4    
5    package npw;
6    import painter.SPainter;
7    import  shapes.SCircle;
8    import javax.swing.*;
9    import java.awt.*;
10   import java.util.Random;
11   import java.util.Scanner;
12   
13   public class HirstDots {
14       public static void main(String[] args) {
15           SwingUtilities.invokeLater(HirstDots::new);
16       }
17   
18       public HirstDots() {
19           paintTheImage();
20       }
21   
22       private void paintTheImage() {
23           int width = getNumber("Width");
24           int height = getNumber("Height");
25           int dotSpace = getNumber("Horizontal space between dots");
26           SPainter painter = new SPainter("HirstDots", width, height);
27           SCircle dot = new SCircle(5);
28           painter.mfd(height / 2.0);
29           painter.tl();
30           painter.mfd(width / 2.0);
31           painter.tl();
32           paintGradient(painter, dot, height, width, dotSpace);
33       }
34   
35       private static int getNumber(String prompt) {
36           String nss = JOptionPane.showInputDialog(null, prompt+"?");
37           Scanner scanner = new Scanner(nss);
38           return scanner.nextInt();
39       }
40   
41       private void paintGradient(SPainter painter, SCircle dot, int height, int width, int dotSpace){
42           double colWidth = dot.diameter() + dotSpace;
43           int nrOfCols = (int) Math.floor((width / colWidth))-1;
44   
45           int cols = 0;
46           while (cols < nrOfCols){
47               nextCol(painter, dot, dotSpace);
48               paintColumn(painter, dot, height, dotSpace);
49               cols = cols + 1;
50           }
51       }
52   
53       private void paintOneDot(SPainter painter, SCircle dot) {
54           painter.setColor(randomColor());
55           painter.paint(dot);
56       }
57   
58       private void paintColumn(SPainter painter, SCircle dot, int height, int dotSpace){
59           int totalDistanceTraveled = 0;
60   
61           while(totalDistanceTraveled < height - (dot.radius()*3)) {
62               int travel = (int) (dot.diameter() + dotSpace);
63               totalDistanceTraveled = totalDistanceTraveled + travel;
64               painter.mfd(travel);
65               paintOneDot(painter,dot);
66           }
67           painter.mbk(totalDistanceTraveled);
68       }
69   
70       private void nextCol(SPainter painter, SCircle dot, int dotSpace){
71           painter.tl();
72           painter.mfd(dot.diameter() + dotSpace);
73           painter.tr();
74       }
75   
76       private Color randomColor(){
77           Random rcgen = new Random();
78           int r = rcgen.nextInt(256);
79           int g = rcgen.nextInt(256);
80           int b = rcgen.nextInt(256);
81           return new Color(r,g,b);
82       }
83   }