1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License as
4  * published by the Free Software Foundation; either version 2 of the
5  * License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful, but
8  * WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOUSE. See the GNU
10  * General Public License for more details.
11  *
12  * You should have recieved a copy of the GNU General Public License
13  * along with this program; if not write to the Free Software
14  * Foundation, inc., 59 Temple Place, Suite 330, Boston MA 02111-1307
15  * USA
16  */
17 package j3d;
18 
19 import java.awt.*;
20 import java.awt.geom.*;
21 
22 import javax.media.opengl.GL;
23 /**
24  * Insert the type's description here.
25  *
26  * @author: Yuriy Mikhaylovskiy
27  */
28 
29 public class shpQuad extends Area implements shp{
30   private float sx1,sx2,sx3,sx4,sy1,sy2,sy3,sy4,sz1,sz2,sz3,sz4;
31   private float x1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4;
32   private Paint fill;
33   private Color contur;
34   private float cr,cg,cb;
35   private Color[] gradient = null;
36   private float z_sort;
37   private double z_normal;
38   private boolean show;
39   private boolean picked = false;
40   private float l, vx1,vx2,vy1,vy2,vz1,vz2,nx,ny,nz;
41 
shpQuad(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float x4,float y4,float z4, Paint f, Color cont)42   public shpQuad(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float x4,float y4,float z4, Paint f, Color cont){
43     sx1=x1;
44     sx2=x2;
45     sx3=x3;
46     sx4=x4;
47     sy1=y1;
48     sy2=y2;
49     sy3=y3;
50     sy4=y4;
51     sz1=z1;
52     sz2=z2;
53     sz3=z3;
54     sz4=z4;
55     fill=f;
56     contur=cont;
57     cr = cont.getRed()/255f;
58     cg = cont.getGreen()/255f;
59     cb = cont.getBlue()/255f;
60     gradient = null;
61     calculateNormal();
62   }
63 
shpQuad(float x1, float y1, float z1, Color c1, float x2, float y2, float z2, Color c2, float x3, float y3, float z3, Color c3, float x4, float y4, float z4, Color c4, Color f, Color cont)64   public shpQuad(float x1, float y1, float z1, Color c1, float x2, float y2, float z2, Color c2, float x3, float y3, float z3, Color c3, float x4, float y4, float z4, Color c4, Color f, Color cont){
65     sx1=x1;
66     sx2=x2;
67     sx3=x3;
68     sx4=x4;
69     sy1=y1;
70     sy2=y2;
71     sy3=y3;
72     sy4=y4;
73     sz1=z1;
74     sz2=z2;
75     sz3=z3;
76     sz4=z4;
77     fill=null;
78     gradient = new Color[5];
79     gradient[0]=c1;
80     gradient[1]=c2;
81     gradient[2]=c3;
82     gradient[3]=c4;
83     gradient[4]=f;
84     contur=cont;
85     cr = cont.getRed()/255f;
86     cg = cont.getGreen()/255f;
87     cb = cont.getBlue()/255f;
88     calculateNormal();
89     }
90 
shpQuad(float x1, float y1, float z1, Color c1, float x2, float y2, float z2, Color c2, float x3, float y3, float z3, Color c3, float x4, float y4, float z4, Color c4, Color cont)91   public shpQuad(float x1, float y1, float z1, Color c1, float x2, float y2, float z2, Color c2, float x3, float y3, float z3, Color c3, float x4, float y4, float z4, Color c4, Color cont){
92     sx1=x1;
93     sx2=x2;
94     sx3=x3;
95     sx4=x4;
96     sy1=y1;
97     sy2=y2;
98     sy3=y3;
99     sy4=y4;
100     sz1=z1;
101     sz2=z2;
102     sz3=z3;
103     sz4=z4;
104     fill=null;
105     gradient = new Color[5];
106     gradient[0]=c1;
107     gradient[1]=c2;
108     gradient[2]=c3;
109     gradient[3]=c4;
110     gradient[4]=new Color((c1.getRed()+c2.getRed()+c3.getRed()+c4.getRed())/4,(c1.getGreen()+c2.getGreen()+c3.getGreen()+c4.getGreen())/4,(c1.getBlue()+c2.getBlue()+c3.getBlue()+c4.getBlue())/4);
111     contur=cont;
112     cr = cont.getRed()/255f;
113     cg = cont.getGreen()/255f;
114     cb = cont.getBlue()/255f;
115     calculateNormal();
116   }
117 
paint(Graphics2D g, Canvas3D j3d)118   public void paint(Graphics2D g, Canvas3D j3d){
119     if (j3d.getDRAFTMODE()) {
120       g.setColor(contur);
121       g.drawLine((int)x1,(int)y1,(int)x2,(int)y2);
122       g.drawLine((int)x2,(int)y2,(int)x3,(int)y3);
123       g.drawLine((int)x3,(int)y3,(int)x4,(int)y4);
124       g.drawLine((int)x1,(int)y1,(int)x4,(int)y4);
125       return;
126     }
127     if((fill!=null || gradient!=null) && (j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_SOLID || j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_SURFACE)){
128       if(gradient==null){
129         try{
130           g.setPaint(libColor.transformColor((Color)fill,z_normal));
131         }catch(Exception e){g.setPaint(fill);}
132         g.fill(this);
133       }else if(j3d.getRENDERMODE() == Canvas3D.RENDERMODE_HIDE){
134         g.setPaint(j3d.getBGCOLOR());
135         g.fill(this);
136       }else if(j3d.getRENDERMODE() == Canvas3D.RENDERMODE_SHADE){
137         g.setPaint(libColor.transformColor(gradient[4],z_normal));
138         g.fill(this);
139       }else{
140         try{
141           Color[] gradient0 = new Color[gradient.length];
142           for(int i=0; i<gradient.length; i++){
143             gradient0[i]=libColor.transformColor(gradient[i],z_normal);
144           }
145           Point2D p12 = lib2D.centerL(x1,y1,x2,y2);
146           Point2D p23 = lib2D.centerL(x2,y2,x3,y3);
147           Point2D p34 = lib2D.centerL(x3,y3,x4,y4);
148           Point2D p14 = lib2D.centerL(x1,y1,x4,y4);
149           Point2D pc1 = lib2D.centerL(p12.getX(),p12.getY(),p14.getX(),p14.getY());
150           Point2D pc2 = lib2D.centerL(p12.getX(),p12.getY(),p23.getX(),p23.getY());
151           Point2D pc3 = lib2D.centerL(p23.getX(),p23.getY(),p34.getX(),p34.getY());
152           Point2D pc4 = lib2D.centerL(p34.getX(),p34.getY(),p14.getX(),p14.getY());
153           Point2D pc = lib2D.intersectionLL(x1,y1,x3,y3,x2,y2,x4,y4,false);
154           Color cc=gradient0[4];
155           GeneralPath gp = new GeneralPath();
156           gp.moveTo(x1,y1);
157           gp.lineTo((float)p12.getX(),(float)p12.getY());
158           gp.lineTo((float)pc.getX(),(float)pc.getY());
159           gp.lineTo((float)p14.getX(),(float)p14.getY());
160           gp.closePath();
161           g.setPaint(new GradientPaint(x1,y1,gradient0[0],(float)pc1.getX(),(float)pc1.getY(),cc));
162           g.fill(gp);
163           gp = new GeneralPath();
164           gp.moveTo(x2,y2);
165           gp.lineTo((float)p23.getX(),(float)p23.getY());
166           gp.lineTo((float)pc.getX(),(float)pc.getY());
167           gp.lineTo((float)p12.getX(),(float)p12.getY());
168           gp.closePath();
169           g.setPaint(new GradientPaint(x2,y2,gradient0[1],(float)pc2.getX(),(float)pc2.getY(),cc));
170           g.fill(gp);
171           gp = new GeneralPath();
172           gp.moveTo(x3,y3);
173           gp.lineTo((float)p23.getX(),(float)p23.getY());
174           gp.lineTo((float)pc.getX(),(float)pc.getY());
175           gp.lineTo((float)p34.getX(),(float)p34.getY());
176           gp.closePath();
177           g.setPaint(new GradientPaint(x3,y3,gradient0[2],(float)pc3.getX(),(float)pc3.getY(),cc));
178           g.fill(gp);
179           gp = new GeneralPath();
180           gp.moveTo(x4,y4);
181           gp.lineTo((float)p14.getX(),(float)p14.getY());
182           gp.lineTo((float)pc.getX(),(float)pc.getY());
183           gp.lineTo((float)p34.getX(),(float)p34.getY());
184           gp.closePath();
185           g.setPaint(new GradientPaint(x4,y4,gradient0[3],(float)pc4.getX(),(float)pc4.getY(),cc));
186           g.fill(gp);
187         }catch(Exception e){/*System.out.println("Area of a triangle = 0");*/}
188       }
189 
190     }
191     if(contur!=null && (j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_WIREFRAME || j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_SURFACE || j3d.getRENDERMODE() == Canvas3D.RENDERMODE_HIDE)){
192       g.setColor(contur);
193       g.draw(this);
194     }
195   }
196 
197 
paintGL(GL gl, Graphics2D g2D, Canvas3D j3d, float rcx, float rcy, float rcz, float scale)198 public void paintGL(GL gl, Graphics2D g2D, Canvas3D j3d, float rcx, float rcy, float rcz, float scale) {
199     Color c;
200 
201 
202     if (j3d.getDRAFTMODE()) {
203         gl.glColor3f(cr, cg, cb);
204         gl.glBegin(GL.GL_LINE_LOOP);
205             gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
206             gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
207             gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
208             gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
209         gl.glEnd();
210         return;
211       }
212 
213     if((fill!=null || gradient!=null) && (j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_SOLID || j3d.getGRAPHICSMODE() == Canvas3D.GRAPHICSMODE_SURFACE)){
214         if(gradient==null){
215             c = (Color)fill;
216             gl.glColor3f(0.3f*c.getRed()/255f, 0.3f*c.getGreen()/255f, 0.3f*c.getBlue()/255f);
217             gl.glBegin(GL.GL_QUADS);
218                 gl.glNormal3f(nx,ny,nz);
219                 gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
220                 gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
221                 gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
222                 gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
223             gl.glEnd();
224         }else if(j3d.getRENDERMODE() == Canvas3D.RENDERMODE_HIDE){
225           gl.glColor3f(0.3f*j3d.getBGCOLOR().getRed()/255f, 0.3f*j3d.getBGCOLOR().getGreen()/255f, 0.3f*j3d.getBGCOLOR().getBlue()/255f);
226           gl.glBegin(GL.GL_QUADS);
227               gl.glNormal3f(nx,ny,nz);
228               gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
229               gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
230               gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
231               gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
232           gl.glEnd();
233           gl.glColor3f(cr, cg, cb);
234           gl.glBegin(GL.GL_LINE_LOOP);
235               gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
236               gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
237               gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
238               gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
239           gl.glEnd();
240 
241         }else if(j3d.getRENDERMODE() == Canvas3D.RENDERMODE_SHADE){
242           gl.glColor3f(0.3f*gradient[4].getRed()/255f, 0.3f*gradient[4].getGreen()/255f, 0.3f*gradient[4].getBlue()/255f);
243           gl.glBegin(GL.GL_QUADS);
244               gl.glNormal3f(nx,ny,nz);
245               gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
246               gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
247               gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
248               gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
249           gl.glEnd();
250         }else{
251             gl.glColor3f(0.3f*cr, 0.3f*cg, 0.3f*cb);
252             gl.glBegin(GL.GL_QUADS);
253                 gl.glNormal3f(nx,ny,nz);
254                 gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
255                 gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
256                 gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
257                 gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
258             gl.glEnd();
259 
260          /* try{
261             Color[] gradient0 = new Color[gradient.length];
262             for(int i=0; i<gradient.length; i++){
263               gradient0[i]=libColor.transformColor(gradient[i],z_normal);
264             }
265             Point2D p12 = lib2D.centerL(x1,y1,x2,y2);
266             Point2D p23 = lib2D.centerL(x2,y2,x3,y3);
267             Point2D p34 = lib2D.centerL(x3,y3,x4,y4);
268             Point2D p14 = lib2D.centerL(x1,y1,x4,y4);
269             Point2D pc1 = lib2D.centerL(p12.getX(),p12.getY(),p14.getX(),p14.getY());
270             Point2D pc2 = lib2D.centerL(p12.getX(),p12.getY(),p23.getX(),p23.getY());
271             Point2D pc3 = lib2D.centerL(p23.getX(),p23.getY(),p34.getX(),p34.getY());
272             Point2D pc4 = lib2D.centerL(p34.getX(),p34.getY(),p14.getX(),p14.getY());
273             Point2D pc = lib2D.intersectionLL(x1,y1,x3,y3,x2,y2,x4,y4,false);
274             Color cc=gradient0[4];
275             GeneralPath gp = new GeneralPath();
276             gp.moveTo(x1,y1);
277             gp.lineTo((float)p12.getX(),(float)p12.getY());
278             gp.lineTo((float)pc.getX(),(float)pc.getY());
279             gp.lineTo((float)p14.getX(),(float)p14.getY());
280             gp.closePath();
281             g.setPaint(new GradientPaint(x1,y1,gradient0[0],(float)pc1.getX(),(float)pc1.getY(),cc));
282             g.fill(gp);
283             gp = new GeneralPath();
284             gp.moveTo(x2,y2);
285             gp.lineTo((float)p23.getX(),(float)p23.getY());
286             gp.lineTo((float)pc.getX(),(float)pc.getY());
287             gp.lineTo((float)p12.getX(),(float)p12.getY());
288             gp.closePath();
289             g.setPaint(new GradientPaint(x2,y2,gradient0[1],(float)pc2.getX(),(float)pc2.getY(),cc));
290             g.fill(gp);
291             gp = new GeneralPath();
292             gp.moveTo(x3,y3);
293             gp.lineTo((float)p23.getX(),(float)p23.getY());
294             gp.lineTo((float)pc.getX(),(float)pc.getY());
295             gp.lineTo((float)p34.getX(),(float)p34.getY());
296             gp.closePath();
297             g.setPaint(new GradientPaint(x3,y3,gradient0[2],(float)pc3.getX(),(float)pc3.getY(),cc));
298             g.fill(gp);
299             gp = new GeneralPath();
300             gp.moveTo(x4,y4);
301             gp.lineTo((float)p14.getX(),(float)p14.getY());
302             gp.lineTo((float)pc.getX(),(float)pc.getY());
303             gp.lineTo((float)p34.getX(),(float)p34.getY());
304             gp.closePath();
305             g.setPaint(new GradientPaint(x4,y4,gradient0[3],(float)pc4.getX(),(float)pc4.getY(),cc));
306             g.fill(gp);
307           }catch(Exception e){System.out.println("Area of a triangle = 0");}
308           */
309         }
310 
311       }
312     else
313     {
314         gl.glColor3f(cr, cg, cb);
315         gl.glBegin(GL.GL_LINE_LOOP);
316             gl.glVertex3f(sx1-rcx,sy1-rcy,sz1-rcz);
317             gl.glVertex3f(sx2-rcx,sy2-rcy,sz2-rcz);
318             gl.glVertex3f(sx3-rcx,sy3-rcy,sz3-rcz);
319             gl.glVertex3f(sx4-rcx,sy4-rcy,sz4-rcz);
320         gl.glEnd();
321     }
322 
323 }
324 
transform2D(Matrix3D t, Vector3D cor, Canvas3D J3D)325 public void transform2D(Matrix3D t, Vector3D cor, Canvas3D J3D){
326       sx1 += cor.x;
327       sy1 += cor.y;
328       sz1 += cor.z;
329       sx2 += cor.x;
330       sy2 += cor.y;
331       sz2 += cor.z;
332       sx3 += cor.x;
333       sy3 += cor.y;
334       sz3 += cor.z;
335       sx4 += cor.x;
336       sy4 += cor.y;
337       sz4 += cor.z;
338 
339     x1=sx1*t.xx+sy1*t.xy+sz1*t.xz+t.xo;
340     x2=sx2*t.xx+sy2*t.xy+sz2*t.xz+t.xo;
341     x3=sx3*t.xx+sy3*t.xy+sz3*t.xz+t.xo;
342     x4=sx4*t.xx+sy4*t.xy+sz4*t.xz+t.xo;
343     y1=sx1*t.yx+sy1*t.yy+sz1*t.yz+t.yo;
344     y2=sx2*t.yx+sy2*t.yy+sz2*t.yz+t.yo;
345     y3=sx3*t.yx+sy3*t.yy+sz3*t.yz+t.yo;
346     y4=sx4*t.yx+sy4*t.yy+sz4*t.yz+t.yo;
347     z1=sx1*t.zx+sy1*t.zy+sz1*t.zz+t.zo;
348     z2=sx2*t.zx+sy2*t.zy+sz2*t.zz+t.zo;
349     z3=sx3*t.zx+sy3*t.zy+sz3*t.zz+t.zo;
350     z4=sx4*t.zx+sy4*t.zy+sz4*t.zz+t.zo;
351     this.reset();
352     GeneralPath gp = new GeneralPath();
353     gp.moveTo(x1,y1);
354     gp.lineTo(x2,y2);
355     gp.lineTo(x3,y3);
356     gp.lineTo(x4,y4);
357     gp.closePath();
358     this.add(new Area(gp));
359     z_sort = (z1+z2+z3+z4)/4.0f;
360     //z_normal = (Math.abs(z1-z2)/Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))
361     //            +Math.abs(z1-z3)/Math.sqrt(Math.pow(x1-x3,2)+Math.pow(y1-y3,2))
362     //            +Math.abs(z3-z2)/Math.sqrt(Math.pow(x3-x2,2)+Math.pow(y3-y2,2)))/3d;
363     float xn =(y2-y1)*(z3-z1)-(z2-z1)*(y3-y1);
364     float yn =(z2-z1)*(x3-x1)-(x2-x1)*(z3-z1);
365     float zn =(x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
366     z_normal = -Math.abs(zn/(Math.sqrt(xn*xn+yn*yn+zn*zn)));
367 
368     sx1 -= cor.x;
369     sy1 -= cor.y;
370     sz1 -= cor.z;
371     sx2 -= cor.x;
372     sy2 -= cor.y;
373     sz2 -= cor.z;
374     sx3 -= cor.x;
375     sy3 -= cor.y;
376     sz3 -= cor.z;
377     sx4 -= cor.x;
378     sy4 -= cor.y;
379     sz4 -= cor.z;
380 
381   }
get_Z()382   public float get_Z(){
383     return z_sort;
384   }
385 
isPickPoint(int x, int y, boolean ogl)386   public boolean isPickPoint(int x, int y, boolean ogl) {
387 
388       if (ogl == true) return picked;
389 
390       return this.contains((double)x, (double)y);
391 
392   }
393 
isPickPoint(Rectangle2D r, boolean ogl)394   public boolean isPickPoint(Rectangle2D r, boolean ogl) {
395       float[] b = this.get2DBoundaries();
396 
397       if (ogl == true) return picked;
398 
399       return r.contains((int)b[1],(int)b[3],(int)(b[0]-b[1])+1,(int)(b[2]-b[3])+1);
400 
401   }
402 
setPicked(boolean s)403   public void setPicked(boolean s) {
404       picked = s;
405   }
406 
407 
setShow(boolean s)408   public void setShow(boolean s) {
409       show = s;
410   }
411 
isShow()412   public boolean isShow() {
413       return show;
414   }
415 
getBoundaries()416   public float[] getBoundaries() {
417       float[] b = new float[6];
418       b[0] = Math.max(sx1,Math.max(sx2,Math.max(sx3,sx4)));
419       b[1] = Math.min(sx1,Math.min(sx2,Math.min(sx3,sx4)));
420       b[2] = Math.max(sy1,Math.max(sy2,Math.max(sy3,sy4)));
421       b[3] = Math.min(sy1,Math.min(sy2,Math.min(sy3,sy4)));
422       b[4] = Math.max(sz1,Math.max(sz2,Math.max(sz3,sz4)));
423       b[5] = Math.min(sz1,Math.min(sz2,Math.min(sz3,sz4)));
424       return b;
425   }
426 
get2DBoundaries()427   public float[] get2DBoundaries() {
428       float[] b = new float[4];
429       b[0] = Math.max(x1,Math.max(x2,Math.max(x3,x4)));
430       b[1] = Math.min(x1,Math.min(x2,Math.min(x3,x4)));
431       b[2] = Math.max(y1,Math.max(y2,Math.max(y3,y4)));
432       b[3] = Math.min(y1,Math.min(y2,Math.min(y3,y4)));
433       return b;
434   }
435 
calculateNormal()436 private void calculateNormal() {
437     vx1 = sx2 - sx1;
438     vy1 = sy2 - sy1;
439     vz1 = sz2 - sz1;
440 
441     vx2 = sx3 - sx1;
442     vy2 = sy3 - sy1;
443     vz2 = sz3 - sz1;
444 
445     nx = vy1 * vz2 - vz1 * vy2;
446     ny = vz1 * vx2 - vx1 * vz2;
447     nz = vx1 * vy2 - vy1 * vx2;
448 
449     l = (float)Math.sqrt(nx*nx + ny*ny + nz*nz);
450 
451     nx = nx / l;
452     ny = ny / l;
453     nz = nz / l;
454 
455 }
456 
457 }