Dots.java
1    /* 
2     * Program to paint 9 dots in the NPW subject to the following constraints: 
3     *   1) contains exactly 9 painted (filled in) circles 
4     *   2) contains circles of exactly 4 different sizes 
5     *   3) contains circles of exactly 4 different colors 
6     *   4) none of the circles touch 
7     *   5) the image is symmetric about the Y-axis 
8     *   6) not all of the circles touch the Y-axis 
9     */
10   
11   package npw;
12   
13   import painter.SPainter;
14   import shapes.SCircle;
15   
16   import javax.swing.*;
17   import java.awt.*;
18   
19   public class Dots {
20   
21       //Top level function for painting the dots
22       private void paintingCode() {
23           SPainter painter = new SPainter("Dots", 600, 600); //make canvas slightly bigger to fit dots
24           SCircle dot = new SCircle(50); //instantiate the circle object
25           //Stepwise refinement
26           paintMiddleCenterDot(painter, dot);
27           paintTopCenterDot(painter, dot);
28           paintBottomCenterDot(painter, dot);
29           paintMiddleLeftDot(painter, dot);
30           paintMiddleRightDot(painter, dot);
31           paintTopLeftDot(painter, dot);
32           paintTopRightDot(painter, dot);
33           paintBottomLeftDot(painter, dot);
34           paintBottomRightDot(painter, dot);
35       }
36   
37       //REQUIRED INFRASTRUCTURE
38       public Dots() {
39           paintingCode();
40       }
41   
42       public static void main(String[] args) {
43           SwingUtilities.invokeLater(new Runnable() {
44               public void run() {
45                   new Dots();
46               }
47           });
48       }
49   
50       //Paints center red dot
51       private void paintMiddleCenterDot(SPainter painter, SCircle dot) {
52           painter.setColor(Color.RED);
53           painter.paint(dot);
54       }
55   
56       //Paints top center orange dot
57       private void paintTopCenterDot(SPainter painter, SCircle dot) {
58           painter.setColor(Color.ORANGE);
59           dot.shrink(15); //shrink dot radius by 15 pixels
60           painter.mfd(200); //move painter up 200 pixels
61           painter.paint(dot);
62           dot.expand(15); //invariant
63           painter.mbk(200); //invariant
64       }
65   
66       //Paints bottom center green dot
67       private void paintBottomCenterDot(SPainter painter, SCircle dot) {
68           painter.setColor(Color.GREEN);
69           dot.shrink(5); //shrink dot radius by 5 pixels
70           painter.mbk(150); //move painter down 150 pixels
71           painter.paint(dot);
72           dot.expand(5); //invariant
73           painter.mfd(150); //invariant
74       }
75   
76       //Paints center left orange dot
77       private void paintMiddleLeftDot(SPainter painter, SCircle dot) {
78           painter.setColor(Color.ORANGE);
79           dot.shrink(15); //shrink dot radius by 15 pixels
80           painter.mlt(200); //move painter left 200 pixels
81           painter.paint(dot);
82           dot.expand(15); //invariant
83           painter.mrt(200); //invariant
84       }
85   
86       //Paints center right orange dot
87       private void paintMiddleRightDot(SPainter painter, SCircle dot) {
88           painter.setColor(Color.ORANGE);
89           dot.shrink(15); //shrink dot radius by 15 pixels
90           painter.mrt(200); //move painter right 200 pixels
91           painter.paint(dot);
92           dot.expand(15); //invariant
93           painter.mlt(200); //invariant
94       }
95   
96       //Paints top left pink dot
97       private void paintTopLeftDot(SPainter painter, SCircle dot) {
98           painter.setColor(Color.PINK);
99           dot.shrink(25); //shrink dot radius by 25 pixels
100          painter.mlt(200); //move painter left 200 pixels
101          painter.mfd(175); //move painter up 175 pixels
102          painter.paint(dot);
103          dot.expand(25); //invariant
104          painter.mrt(200); //invariant
105          painter.mbk(175); //invariant
106      }
107  
108      //paints top right pink dot
109      private void paintTopRightDot(SPainter painter, SCircle dot) {
110          painter.setColor(Color.PINK);
111          dot.shrink(25); //shrink dot radius by 25 pixels
112          painter.mrt(200); //move painter right 200 pixels
113          painter.mfd(175); //move painter up 175 pixels
114          painter.paint(dot);
115          dot.expand(25); //invariant
116          painter.mlt(200); //invariant
117          painter.mbk(175); //invariant
118      }
119  
120      //Paints bottom left green dot
121      private void paintBottomLeftDot(SPainter painter, SCircle dot) {
122          painter.setColor(Color.GREEN);
123          dot.shrink(5); //shrink dot radius by 5 pixels
124          painter.mlt(200); //move painter left 200 pixels
125          painter.mbk(150); //move painter down 150 pixels
126          painter.paint(dot);
127          dot.expand(5); //invariant
128          painter.mrt(200); //invariant
129          painter.mfd(150); //invariant
130      }
131  
132      //Paints bottom right green dot
133      private void paintBottomRightDot(SPainter painter, SCircle dot) {
134          painter.setColor(Color.GREEN);
135          dot.shrink(5); //shrink dot radius by 5 pixels
136          painter.mrt(200); //move painter right 200 pixels
137          painter.mbk(150); //move painter down 150 pixels
138          painter.paint(dot);
139          dot.expand(5); //invariant
140          painter.mlt(200); //invariant
141          painter.mfd(150); //invariant
142      }
143  }
144