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