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 }