/home/evankemp/NetBeansProjects/CS1/src/npw/Number3.java
  1 /*
  2  * Program to paint a rectangle made up of not-bonded randomly 
  3  * colored circles.
  4  */
  5 package npw;
  6 
  7 import java.awt.Color;
  8 import java.awt.Graphics;
  9 import java.util.Random;
 10 import java.util.Scanner;
 11 import javax.swing.JOptionPane;
 12 import javax.swing.SwingUtilities;
 13 import painter.SPainter;
 14 import shapes.SCircle;
 15 import shapes.SSquare;
 16 
 17 /**
 18  *
 19  * @author evankemp
 20  */
 21 public class Number3 {
 22 
 23     // REQUIRED INFRASTRUCTURE
 24     /**
 25      * @param args the command line arguments
 26      */
 27     public static void main(String[] args) {
 28         SwingUtilities.invokeLater(new Runnable() {
 29             public void run() {
 30                 new Number3();
 31             }
 32         });
 33     }
 34 
 35     public Number3() {
 36         paintTheImage();
 37     }
 38 
 39     // THE SOLUTION TO THE GRAPHICAL PROBLEM
 40     private void paintTheImage() {
 41         //GRAB THE INPUT INFORMATION
 42         int nrOfRows = getNumber("rows");
 43         int nrOfColumns = getNumber("columns");
 44         int sizeOfCircle = getNumber("circle radius length");
 45         //ESTABLISH THE PAINTER
 46         int height = nrOfRows * sizeOfCircle * 2;
 47         int width = nrOfColumns * sizeOfCircle * 2;
 48         SPainter miro = new SPainter("Number 3", width + 50, height + 50);
 49         miro.setBrushWidth(4);
 50         SCircle circle = new SCircle(sizeOfCircle);
 51         //PAINT THE RECTANGLE
 52         paintRectangle(miro, circle, nrOfRows, nrOfColumns);
 53     }
 54 
 55     private static int getNumber(String prompt) {
 56         String nss = JOptionPane.showInputDialog(null, prompt + "?");
 57         Scanner scanner = new Scanner(nss);
 58         return scanner.nextInt();
 59     }
 60 
 61     private static void paintRectangle(SPainter miro, SCircle circle, int nrOfRows, int nrOfColumns) {
 62         //POSITION THE PAINTER TO PAINT THE RECTANGLE OF CIRCLES
 63         miro.mlt(((nrOfColumns - 1) / 2.0) * circle.diameter());
 64         miro.mbk(((nrOfRows - 1) / 2.0) * circle.diameter());
 65         //PAINT THE RECTANGLE OF CIRCLES
 66         int i = 1;
 67         while (i <= nrOfRows) {
 68             paintOneRow(miro, nrOfColumns, circle);
 69             miro.mfd(circle.diameter());
 70             i = i + 1;
 71         }
 72         //MAKE THE METHOD INVARIANT WITH RESPECT TO THE PAINTER POSITION
 73         miro.mrt(((nrOfColumns - 1) / 2.0) * circle.diameter());
 74         miro.mfd(((nrOfRows - 1) / 2.0) * circle.diameter());
 75     }
 76 
 77     private static void paintOneRow(SPainter miro, int nrOfColumns, SCircle circle) {
 78         int i = 1;
 79         while (i <= nrOfColumns) {
 80             paintOneCircle(miro, circle);
 81             miro.mrt(circle.diameter());
 82             i = i + 1;
 83         }
 84         miro.mlt(nrOfColumns * circle.diameter());
 85     }
 86 
 87     private static void paintOneCircle(SPainter miro, SCircle circle) {
 88         circle.s2();
 89         miro.setColor(randomColor());
 90         miro.paint(circle);
 91         circle.x2();
 92     }
 93 
 94     private static Color randomColor() {
 95         Random rgen = new Random();
 96         int r = rgen.nextInt(256);
 97         int g = rgen.nextInt(256);
 98         int b = rgen.nextInt(256);
 99         return new Color(r, b, g);
100     }
101 
102 }
103