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