ColorfulAbstractGradient.java
|
1 package assign_4;
2
3 import painter.SPainter;
4 import shapes.SCircle;
5 import javax.swing.*;
6 import java.awt.*;
7 import java.util.Random;
8 import java.util.Scanner;
9
10 public class ColorfulAbstractGradient {
11 public static void main(String[] args) {
12 SwingUtilities.invokeLater(new Runnable() {
13 @Override
14 public void run() {
15 new ColorfulAbstractGradient();
16 }
17 });
18 }
19
20 public ColorfulAbstractGradient() {
21 paintTheImage();
22 }
23
24 private void paintTheImage() {
25 //Grab the input information
26 int width = getNumber("width");
27 int height = getNumber("height");
28 int colWidth = getNumber("column width");
29 //Establish the painter
30 SPainter painter = new SPainter("Colorful Abstract Gradient", width, height);
31 SCircle dot = new SCircle(5);
32 //Move the painter to the upper left corner to get ready to paint the gradient
33 painter.mfd(height / 2);
34 painter.tl(90);
35 painter.mfd(width / 2 - 10);
36 painter.tl(90);
37 //Paint it!
38 paintGradient(painter, dot, height, width, colWidth);
39 }
40
41 private static int getNumber(String prompt) {
42 String nss = JOptionPane.showInputDialog(null, prompt + "?");
43 Scanner scanner = new Scanner(nss);
44 return scanner.nextInt();
45 }
46
47 private void paintGradient(SPainter painter, SCircle dot, int height, int width, int colWidth) {
48 int cols = 0;
49 //Calculate the number of columns. We want to fill the screen, but we don't want
50 //any dots only half on the canvas, so we subtract some space
51 int nrOfCols = (width / colWidth) - 2;
52 while (cols < nrOfCols) {
53 nextCol(painter, colWidth);
54 paintColumn(painter, dot, height);
55 cols = cols + 1;
56 }
57 }
58
59 public void paintOneDot(SPainter painter, SCircle dot) {
60 randomColor(painter);
61 painter.paint(dot);
62 }
63
64 public void randomColor(SPainter painter) {
65 Random randomGenerator = new Random();
66 int red = randomGenerator.nextInt(255);
67 int blue = randomGenerator.nextInt(255);
68 int green = randomGenerator.nextInt(255);
69 Color randomColor = new Color(red, green, blue);
70 painter.setColor(randomColor);
71 }
72
73 //Dots are spaced tighter together near the bottom of the canvas
74 private void paintColumn(SPainter painter, SCircle dot, int height) {
75 int travel = 0;
76 int totalDistanceTraveled = 0;
77 //Paint a row with decreasing distance between dots
78 while (totalDistanceTraveled < height - (dot.radius() * 3)) {
79 travel = randomDistance((height - totalDistanceTraveled) / 4);
80 totalDistanceTraveled = totalDistanceTraveled + travel;
81 painter.mfd(travel);
82 paintOneDot(painter, dot);
83 }
84 //Make the method invariant with respect to painter position
85 painter.mbk(totalDistanceTraveled);
86 }
87
88 //Moves the painter to the next column
89 private void nextCol(SPainter painter, int colWidth) {
90 painter.tl(90);
91 painter.mfd(colWidth);
92 painter.tr(90);
93 }
94
95 private int randomDistance(int maxDistance) {
96 Random rgen = new Random();
97 return rgen.nextInt(maxDistance);
98 }
99 }
100