1 package npw; 2 3 import painter.SPainter; 4 import shapes.SCircle; 5 import shapes.SSquare; 6 7 import javax.swing.*; 8 import java.awt.*; 9 import java.util.Random; 10 import java.util.Scanner; 11 12 import static javax.swing.UIManager.getColor; 13 import static javax.swing.UIManager.getString; 14 15 16 public class Invention1 { 17 18 public static void main(String[] args) { 19 SwingUtilities.invokeLater(new Runnable() { 20 public void run() { 21 new Invention1(); 22 } 23 }); 24 } 25 26 public Invention1() { 27 paintTheImage(); 28 } 29 30 private String inputColor = getString( "dot color" ); 31 private int dotSpacing = getNumber("column width"); 32 private int width = getNumber("width"); 33 private int height = getNumber("height"); 34 35 public void paintTheImage() { 36 // Establish the painter 37 SPainter painter = new SPainter("Invention 1", width, height); 38 SCircle dot = new SCircle(5); 39 SSquare box = new SSquare(5); 40 41 // Move the painter to the upper left corner to get ready to paint the gradient 42 painter.mfd(height / 2); 43 painter.tl(90); 44 painter.mfd(width / 2 - 10); 45 painter.tl(90); 46 47 // Paint it! 48 paintGradient(painter, dot, box, height, width, dotSpacing); 49 } 50 51 52 private static int getNumber(String prompt) { 53 String nss = JOptionPane.showInputDialog(null,prompt+"?"); 54 Scanner scanner = new Scanner(nss); 55 return scanner.nextInt(); 56 } 57 58 private void paintGradient(SPainter painter, SCircle dot, SSquare box, int height, int width, int dotSpacing) { 59 int cols = 0; 60 // Calculate the number of columns. We want to fill the screen but we don't want 61 //any of the dots only half on the canvas, so we subtract some space. 62 int nrOfCols = ( width / dotSpacing) - 2; 63 64 while (cols < nrOfCols){ 65 nextCol(painter, dotSpacing); 66 paintColumn(painter, dot, box, height, dotSpacing); 67 cols = cols + 1; 68 } 69 } 70 71 72 73 // Dots are spaced tighter together near the bottom of the canvas. 74 private void paintColumn(SPainter painter, SCircle dot, SSquare box, int height, int dotSpacing) { 75 int travel = 0; 76 int totalDistanceTraveled = 0; 77 78 // Paint a row with decreasing distance between dots. 79 while(totalDistanceTraveled < height - (dot.radius() * 3)) { 80 travel = dotSpacing; 81 totalDistanceTraveled = totalDistanceTraveled + travel; 82 painter.mfd(travel); 83 paintOneDot(painter, dot, box, totalDistanceTraveled); 84 } 85 86 // Make the method invariant with respect to painter position. 87 painter.mbk(totalDistanceTraveled); 88 89 } 90 91 private void paintOneDot(SPainter painter, SCircle dot, SSquare box, int totalDistanceTraveled) { 92 dynamicColor(painter); 93 if (totalDistanceTraveled < 300) { 94 painter.paint(dot);} 95 else { 96 painter.paint(box);} 97 } 98 99 private static String getString(String prompt) { 100 String nss = JOptionPane.showInputDialog(null,prompt+"?"); 101 Scanner scanner = new Scanner(nss); 102 return scanner.next(); 103 104 } 105 106 private void dynamicColor(SPainter painter) { 107 Random rgen = new Random(); 108 if (inputColor.equalsIgnoreCase("red")) { 109 painter.setColor(Color.RED); 110 } else if (inputColor.equalsIgnoreCase("green")) { 111 painter.setColor(Color.GREEN); 112 } else if (inputColor.equalsIgnoreCase("blue")) { 113 painter.setColor(Color.BLUE); 114 } else { 115 painter.setColor(Color.BLACK); 116 } 117 } 118 119 private void nextCol(SPainter painter,int dotSpacing){ 120 painter.tl(90); 121 painter.mfd(dotSpacing); 122 painter.tr(90); 123 } 124 125 126 }