1   package fi.jyu.mit.graphics;
2   
3   import java.awt.Color;
4   import java.awt.Graphics;
5   
6   /**
7    * Kaikkien kuvioiden yliluokka
8    * @author Markus Kivioja
9    * @author Vesa Lappalainen
10   */
11  public abstract class BasicShape implements Drawable { // NOPMD
12  
13      private Color color;
14      private Matrix matrix;
15      private Matrix rotator;
16      private BasicDrawableCollection parent;
17  
18      public BasicShape() {
19          this.matrix = null; // NOPMD
20          this.rotator = null;// NOPMD
21          this.color = null;  // NOPMD
22      }
23  
24      @Override
25      public Drawable setColor(int r, int g, int b) { // NOPMD
26          return setColor(new Color(r, g, b));
27      }
28  
29      /**
30       * Asetetaan piirtoobjecktin väri
31       * @see fi.jyu.mit.graphics.Drawable#setColor(java.awt.Color)
32       */
33      @Override
34      public Drawable setColor(Color c) {  // NOPMD
35          this.color = c;
36          redraw();
37          return this;
38      }
39  
40  
41      /**
42       * Palautetaan väri jota käyteään piirtämiseen
43       * @return kuvion väri
44       */
45      @Override
46      public Color getColor() {
47          if ( color != null ) return this.color;
48          if ( parent == null ) {  return Color.BLACK; }
49          return parent.getColor();
50      }
51  
52  
53      /**
54       * Alustetaan graphics nykyisten tietojen pohjalta.
55       * Vari haetaan omistajalta jos itsella ei ole.
56       * Jos kenellakaan ei ole varia, kaytetaan mustaa.
57       * @param g Graphics joka alustetaan
58       */
59      protected void initGraphics(Graphics g) {
60          if ( color == null ) {
61              if ( parent == null ) { g.setColor(Color.BLACK); return; }
62              parent.initGraphics(g);
63              return;
64          }
65          g.setColor(this.color);
66      }
67  
68      /**
69       * Palauttaa annetun matriisin muunnettuna kuvion omalla muunnosmatriisilla,
70       * jos muunnosmatriisia ei ole asetettu se on yksikkömatriisi
71       * @param a muunnettava matriisi
72       * @return a muunnettuna kuvion omalla matriisilla
73       */
74      public Matrix getTransform(Matrix a) {  // NOPMD
75          if ( matrix == null ) return a;
76          if ( a == null ) return getTransform();
77          return a.multiply(matrix);
78      }
79  
80      /**
81       * Palauttaa annetun matriisin kierrettynä kuvion omalla kiertomatriisilla,
82       * jos kiertomatriisia ei ole asetettu se on yksikkömatriisi
83       * @param a muunnettava matriisi
84       * @return a muunnettuna kuvion omalla matriisilla
85       */
86      public Matrix getRotator(Matrix a) {  // NOPMD
87          if ( rotator == null ) return a;
88          if( a == null) return rotator;
89          return a.multiply(rotator);
90      }
91  
92  
93      @Override
94      public Matrix getTransform() {  // NOPMD
95          if ( matrix == null ) matrix = new Matrix();
96          return matrix;
97      }
98  
99      /**
100      * Muuntaa annetun pisteen annetulla matriisilla ja kuvion omalla muunnosmatriisilla,
101      * palauttaa muunnetun pisteen SPoint-oliona
102      * @param a muunnosmatriisi
103      * @param x muunnettavan pisteen x-koordinaatti
104      * @param y muunnettavan pisteen y-koordinaatti
105      * @param z muunnettavan pisteen z-koortinaatti
106      * @return muunnettu piste SPoint-oliona
107      */
108     public SPoint getPoint(Matrix a,double x,double y, double z) {  // NOPMD
109         Matrix tr = getTransform(a);
110         if ( tr != null ) return tr.transform(x, y, z);
111         return new SPoint((int)x,(int)y);
112     }
113 
114     /**
115      * Pirtää kuvion annetulla Graphics-oliolla ja muunnosmatriisilla
116      * @param g Graphics-olio
117      * @param a muunnosmatriisi
118      */
119     abstract protected void drawShape(Graphics g, Matrix a);
120 
121     @Override
122     public void draw(Graphics g, Matrix a) {
123         Matrix t = getRotator(getTransform(a));
124         initGraphics(g);
125         drawShape(g,t);
126     }
127 
128     @Override
129     public void setParent(BasicDrawableCollection parent) {
130         if ( this.parent == parent ) return;
131         if ( this == parent ) return; // itseaan ei saa lisata itseensa
132         if ( this.parent != null ) this.parent.justRemove(this);
133         this.parent = parent;
134         if (parent != null) parent.justAdd(this);
135         redraw();
136     }
137 
138     @Override
139     public void redraw() {
140         if ( this.parent == null ) return;
141         this.parent.redraw();
142     }
143 
144     @Override
145     public Drawable transform(Matrix m) {  // NOPMD
146         if ( this.matrix == null ) this.matrix = new Matrix();
147         matrix.multiplyThis(m);
148         redraw();
149         return this;
150     }
151 
152     @Override
153     public Drawable setTransform(Matrix m) {  // NOPMD
154         if ( this.matrix == m ) return this;
155         this.matrix = m;
156         redraw();
157         return this;
158     }
159 
160     @Override
161     public void changeTransform(Matrix m) {  // NOPMD
162         setTransform(m);
163     }
164 
165     @Override
166     public void setRotator(Matrix m) {  // NOPMD
167         this.rotator = m;
168         redraw();
169     }
170 
171     @Override
172     public Matrix getRotator() {  // NOPMD
173         if ( this.rotator == null ) this.rotator = new Matrix();
174         return this.rotator;
175     }
176 
177     @Override
178     public Drawable scale(double dx, double dy, double dz) {  // NOPMD
179         return transform(new ScaleMatrix(dx,dy,dz));
180     }
181 
182     @Override
183     public Drawable move(double sx, double sy, double sz) {  // NOPMD
184         return transform(new TranslateMatrix(sx,sy,sz));
185     }
186 
187     @Override
188     public Drawable rotate(int axis, double deg) {  // NOPMD
189         return transform(new RotMatrix(axis,deg));
190     }
191 
192 
193 }
194