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