// RokMill.java + P3DMill r1.1c 2000/04/23 import java.io.*; import java.net.*; import java.awt.*; import java.applet.Applet; /** An applet to put a 3D model into a page **/ public class RokMill extends Applet implements Runnable { String modelname; DataInputStream in; int x[],y[],z[],grp[],grp2[]; int x2[],y2[],z2[]; int x3[],y3[]; int face[][]; int lines[][]; int zsort[][]; int cr[][] = new int[14][2]; int cg[][] = new int[14][2]; int cb[][] = new int[14][2]; int lineno=0; int faceno=0; int no=0; int scale=100; int viewface=1; int viewline=1; int fastmode=0; int movemode=2; int fastmode2=0; int dragmode=4; boolean lensmode=false; String message = "RokMill"; boolean painted = false; boolean readed = false; static final double pi = 3.14159265358979; int prevx,prevy; float xtheta=0; float ytheta=0; int xmove=0; int ymove=0; int zmove=0; Image image; Graphics off; boolean xy_on=true; boolean message_on=true; boolean switch_on=true; boolean zoom_on=false; boolean pers_on=false; int pers=2500; int zoom=100; int width2=0; int height2=0; int pointnum=5000; String p3dname = ""; boolean p3dmode=false; int parts[][]; int partsx[]; int partsy[]; int partsz[]; double partsx2[]; double partsy2[]; double partsz2[]; int partsno; int keyno=0; int keyno5[]; int keystart5[]; int sec2[]; int partsno2; double rotw[][],rotx[][],roty[][],rotz[][]; double offsetx[],offsety[],offsetz[],offsetw[]; int movx[],movy[],movz[]; double nowcx[],nowsx[]; double nowcy[],nowsy[]; double nowcz[],nowsz[]; float nowx,nowy,nowz; double now4w[],now4x[],now4y[],now4z[]; double now4w2[],now4x2[],now4y2[],now4z2[]; double p3dfx=0; double p3dfy=0; double p3dfz=0; int timer=0; int sec=100; int movno=1; int movno2=1; int m=0; int byoga=0; Thread thread; boolean zchk[][]; boolean debugmode = false; int gfps=0; public void init() { System.out.println("---- RokMill ----"); modelname = getParameter("model"); try { int pscale = Integer.parseInt(getParameter("scale").trim()); if(pscale>0 && pscale<10000) scale=pscale; }catch(Exception e){}; try { if(getParameter("message").trim().equals("OFF")) message_on=false; }catch(Exception e){}; try { if(getParameter("xy").trim().equals("OFF")) xy_on=false; }catch(Exception e){}; try { if(getParameter("switch").trim().equals("OFF")) switch_on=false; }catch(Exception e){}; try { if(getParameter("zoom").trim().equals("ON")) zoom_on=true; }catch(Exception e){}; try { if(getParameter("pers").trim().equals("ON")) pers_on=true; }catch(Exception e){}; try { if(getParameter("lens").trim().equals("ON")) lensmode=true; }catch(Exception e){}; try { int pnum = Integer.parseInt(getParameter("pointnum").trim()); if(pnum<1000) pnum=1000; pointnum=pnum; }catch(Exception e){}; try { if(getParameter("fastmode").trim().equals("OFF")) fastmode=0; }catch(Exception e){}; try { if(getParameter("fastmode").trim().equals("ON")) fastmode=1; }catch(Exception e){}; try { if(getParameter("movemode").trim().equals("V")) movemode=0; }catch(Exception e){}; try { if(getParameter("movemode").trim().equals("H")) movemode=1; }catch(Exception e){}; try { if(getParameter("movemode").trim().equals("R")) movemode=2; }catch(Exception e){}; try { int pmovno = Integer.parseInt(getParameter("movno").trim()); if(pmovno>0 && pmovno<10000){ movno=pmovno; movno2=pmovno; } }catch(Exception e){}; try { if(!getParameter("p3d").trim().equals("")) p3dname = getParameter("p3d"); }catch(Exception e){}; try { if(getParameter("debug").trim().equals("ON")) debugmode=true; }catch(Exception e){}; x = new int[pointnum]; y = new int[pointnum]; z = new int[pointnum]; grp = new int[pointnum]; x2 = new int[pointnum]; y2 = new int[pointnum]; z2 = new int[pointnum]; x3 = new int[pointnum]; y3 = new int[pointnum]; face = new int[pointnum][10]; lines = new int[pointnum*2][7]; zsort = new int[pointnum*2][3]; resize(size().width <= 100 ? 100 : size().width, size().height <= 100 ? 100 : size().height); show(); width2=size().width; height2=size().height; image = this.createImage(width2,height2); off = image.getGraphics(); boolean readflag=true; while(readflag){ try { URLConnection connection = new URL(getDocumentBase(), modelname).openConnection() ; in = new DataInputStream(connection.getInputStream()) ; while(true){ String line = in.readLine() ; if(line == null) break ; line = line.trim() ; if(line.equals("ROKU4")){ System.out.println("ROKU4"); } if(line.equals("POINT")){ message = "RokMill : now reading POINT data..." ; painted = false; paint2(this.getGraphics()); while(painted==false) java.lang.Thread.sleep(100); while(true){ if(line == null) break ; line = in.readLine().trim() ; if(line.equals("LINE0")) break ; no = Integer.parseInt(line); line = in.readLine() ; line = in.readLine() ; line = in.readLine() ; line = in.readLine() ; line = in.readLine() ; int k=line.indexOf("."); String l=line.substring(k-6,k).trim(); l=l+line.substring(k+1,k+4); int j=Integer.parseInt(l); x[no]=j; line = in.readLine() ; k=line.indexOf("."); l=line.substring(k-6,k).trim(); l=l+line.substring(k+1,k+4); j=Integer.parseInt(l); y[no]=j; line = in.readLine() ; k=line.indexOf("."); l=line.substring(k-6,k).trim(); l=l+line.substring(k+1,k+4); j=Integer.parseInt(l); z[no]=j; z2[no]=z[no]; x3[no]=x[no]*zoom/100*scale/500+(size().width/2); y3[no]=y[no]*zoom/100*scale/500+(size().height/2); } message = "RokMill : now reading LINE data..." ; painted = false ; paint2(this.getGraphics()) ; while(painted==false) java.lang.Thread.sleep(100) ; while(true){ if(line == null) break ; line = in.readLine().trim() ; if(line.equals("FACE0")) break ; lines[lineno][0] = Integer.parseInt(line); line = in.readLine().trim() ; lines[lineno][1] = Integer.parseInt(line); line = in.readLine().trim() ; lines[lineno][2] = Integer.parseInt(line); grp[lines[lineno][0]] = lines[lineno][2]; grp[lines[lineno][1]] = lines[lineno][2]; line = in.readLine().trim() ; lines[lineno][3] = Integer.parseInt(line); lines[lineno][6] = 1; lineno++; } message = "RokMill : now reading FACE data..." ; painted = false ; paint2(this.getGraphics()) ; while(painted==false) java.lang.Thread.sleep(100) ; while(true){ if(line == null) break ; line = in.readLine().trim() ; if(line.equals("END00")) break ; face[faceno][0] = Integer.parseInt(line); line = in.readLine().trim() ; face[faceno][5] = Integer.parseInt(line); line = in.readLine() ; line = in.readLine().trim() ; face[faceno][1] = Integer.parseInt(line); line = in.readLine().trim() ; face[faceno][2] = Integer.parseInt(line); line = in.readLine().trim() ; face[faceno][3] = Integer.parseInt(line); lines[face[faceno][1]-1][6] = 0; lines[face[faceno][2]-1][6] = 0; lines[face[faceno][3]-1][6] = 0; if(face[faceno][0]==4){ line = in.readLine().trim() ; face[faceno][4] = Integer.parseInt(line); lines[face[faceno][4]-1][6] = 0; } /* line -> point */ int dxdy = 0; int nno[] = new int[8]; for(int j=1;j0;k--){ nno[k]=nno[k-1]; } nno[0]=q1; dxdy++; }else if(nno[0]==q1){ for(int k=7;k>0;k--){ nno[k]=nno[k-1]; } nno[0]=q0; dxdy++; }else if(nno[dxdy-1]==q0){ nno[dxdy]=q1; dxdy++; }else if(nno[dxdy-1]==q1){ nno[dxdy]=q0; dxdy++; } } } if(face[faceno][0]==3){ face[faceno][6]=nno[0]; face[faceno][7]=nno[1]; face[faceno][8]=nno[2]; }else{ face[faceno][6]=nno[0]; face[faceno][7]=nno[1]; face[faceno][8]=nno[2]; face[faceno][9]=nno[3]; } faceno++; } message = "RokMill : now reading LINE2 data..." ; /* ...and PALC data, BACK data, VIEW data */ painted = false ; paint2(this.getGraphics()) ; while(painted==false) java.lang.Thread.sleep(100) ; line = in.readLine().trim() ; line = in.readLine().trim() ; line = in.readLine().trim() ; for(int i=0;i<13;i++){ if(line == null) break ; line = in.readLine().trim() ; if(line.equals("ENDP0")) break ; cr[i][0] = Integer.parseInt(line); line = in.readLine().trim() ; cg[i][0] = Integer.parseInt(line); line = in.readLine().trim() ; cb[i][0] = Integer.parseInt(line); line = in.readLine().trim() ; cr[i][1] = Integer.parseInt(line); line = in.readLine().trim() ; cg[i][1] = Integer.parseInt(line); line = in.readLine().trim() ; cb[i][1] = Integer.parseInt(line); line = in.readLine().trim() ; } line = in.readLine().trim() ; line = in.readLine().trim() ; line = in.readLine().trim() ; line = in.readLine().trim() ; int j = Integer.parseInt(line); cr[13][0]=cr[j][0]; cg[13][0]=cg[j][0]; cb[13][0]=cb[j][0]; while(!line.equals("VIEW0")){ line = in.readLine().trim() ; } line = in.readLine().trim() ; viewline = Integer.parseInt(line); line = in.readLine().trim() ; viewface = Integer.parseInt(line); while(!line.equals("LINE2")){ line = in.readLine().trim() ; } while(true){ line = in.readLine().trim() ; if(line == null) break ; if(line.equals("ENDL2")) break ; j = Integer.parseInt(line); line = in.readLine().trim() ; line = in.readLine().trim() ; lines[j-1][4] = Integer.parseInt(line); line = in.readLine().trim() ; lines[j-1][5] = Integer.parseInt(line); if(j==lineno) break; } } } in.close(); message = "RokMill : "+modelname ; readflag=false; } catch(Exception e) { System.out.println(e); System.out.print("ERR "); System.out.println("point:"+no+" line:"+lineno+" face:"+faceno); if(no==pointnum || lineno==pointnum*2 || faceno==pointnum){ pointnum*=2; x = new int[pointnum]; y = new int[pointnum]; z = new int[pointnum]; grp = new int[pointnum]; x2 = new int[pointnum]; y2 = new int[pointnum]; z2 = new int[pointnum]; x3 = new int[pointnum]; y3 = new int[pointnum]; face = new int[pointnum][10]; lines = new int[pointnum*2][7]; zsort = new int[pointnum*2][3]; no=0; lineno=0; faceno=0; readflag=true; System.out.println("retry!"); }else{ x[1]=100; y[1]=0; z[1]=0; z2[1]=0; x[2]=-100; y[2]=0; z[2]=0; z2[2]=0; x3[1]=x[1]*zoom/100*scale/500+(size().width/2); y3[1]=y[1]*zoom/100*scale/500+(size().height/2); x3[2]=x[2]*zoom/100*scale/500+(size().width/2); y3[2]=y[2]*zoom/100*scale/500+(size().height/2); grp[1]=-99; grp[2]=-99; lines[0][0]=1; lines[0][1]=2; lines[0][2]=0; lines[0][3]=0; lines[0][4]=0; lines[0][5]=1; lines[0][6]=1; no=2; lineno=1; faceno=0; cr[0][0]=0; cg[0][0]=0; cb[0][0]=0; cr[13][0]=255; cg[13][0]=255; cb[13][0]=255; message = "RokMill : file can't read" ; readflag=false; } } } readed=true; System.out.println("point:"+no+" line:"+lineno+" face:"+faceno); grp2 = new int[no+1]; for(int m=1;m0){ line=line.substring(0,line.indexOf(" ")); } parts[i][4]=Integer.parseInt(line); } } if(line.equals("MOV002")){ message = "RokMill : now reading MOV002 data..." ; if(painted){ painted = false ; paint2(this.getGraphics()) ; } keyno5 = new int[128]; keystart5 = new int[128]; sec2 = new int[128]; rotw = new double[1024][partsno]; rotx = new double[1024][partsno]; roty = new double[1024][partsno]; rotz = new double[1024][partsno]; movx = new int[1024]; movy = new int[1024]; movz = new int[1024]; nowcx = new double[partsno]; nowsx = new double[partsno]; nowcy = new double[partsno]; nowsy = new double[partsno]; nowcz = new double[partsno]; nowsz = new double[partsno]; now4w = new double[partsno]; now4x = new double[partsno]; now4y = new double[partsno]; now4z = new double[partsno]; now4w2 = new double[partsno]; now4x2 = new double[partsno]; now4y2 = new double[partsno]; now4z2 = new double[partsno]; keyno=0; while(true){ line = in.readLine() ; // name if(line.equals("MOV_END")){ line="normal end"; break; } m++; line = in.readLine() ; // partsno2 partsno2=Integer.parseInt(line); line = in.readLine().trim() ; keyno5[m]=Integer.parseInt(line); keystart5[m]=keyno; line = in.readLine() ; line = in.readLine() ; // sec. k=line.indexOf("."); l=line.substring(0,k).trim(); l=l+line.substring(k+1,k+2); sec2[m]=Integer.parseInt(l); for(int i=keyno;i<(keyno+keyno5[m]);i++){ line = in.readLine() ; // move k=line.indexOf("."); l=line.substring(0,k).trim(); l=l+line.substring(k+1,k+4); movz[i]=-Integer.parseInt(l); line=line.substring(line.indexOf(" ")+1, line.length()); k=line.indexOf("."); l=line.substring(0,k).trim(); l=l+line.substring(k+1,k+4); movx[i]=Integer.parseInt(l); line=line.substring(line.indexOf(" ")+1, line.length()); k=line.indexOf("."); l=line.substring(0,k).trim(); l=l+line.substring(k+1,k+4); movy[i]=-Integer.parseInt(l); for(int j=0;j1){ System.out.print("FIX "+rotw[i][j]+" => "); rotw[i][j]=Math.sqrt( 1.0-(rotx[i][j]*rotx[i][j] +roty[i][j]*roty[i][j] +rotz[i][j]*rotz[i][j]) ); System.out.println(rotw[i][j]); } if(rotw[i][j]<-1){ System.out.print("FIX "+rotw[i][j]+" => "); rotw[i][j]=-Math.sqrt( 1.0-(rotx[i][j]*rotx[i][j] +roty[i][j]*roty[i][j] +rotz[i][j]*rotz[i][j]) ); System.out.println(rotw[i][j]); } } if(partsno>partsno2){ for(int j=partsno2;j=(sec*100)){ timer-=sec*100; gfps = fps*100/sec; message = "RokMill : "+modelname+" + "+p3dname+" : " +(gfps/10.0)+" fps" ; fps=0; } if(painted){ painted = false ; paint2(this.getGraphics()) ; fps++; } } } } public void start() { if(thread == null){ thread = new Thread(this); thread.start(); } } public void stop() { if(thread != null){ thread.stop(); thread = null; } } public boolean mouseDown(Event e, int mx, int my) { if((my>(size().height-41) && my<(size().height-23) && zoom_on && pers_on) || (my>(size().height-21) && my<(size().height-4) && zoom_on && !pers_on)){ dragmode=1; Graphics g=this.getGraphics(); zoom=mx*100/size().width+50; int yyy=size().height-40; if(!pers_on) yyy+=20; g.setColor(Color.black); g.fillRect(0,yyy,size().width,16); g.setColor(Color.white); g.fillRect(0,yyy+2,size().width,12); g.setColor(Color.yellow); g.fillRect((zoom-50)*size().width/100-6,yyy+2,12,12); }else if(my>(size().height-21) && my<(size().height-4) && pers_on){ dragmode=2; Graphics g=this.getGraphics(); pers=mx*4000/size().width+500; g.setColor(Color.black); g.fillRect(0,size().height-20,size().width,16); g.setColor(Color.white); g.fillRect(0,size().height-18,size().width,12); g.setColor(Color.yellow); g.fillRect((pers-500)*size().width/4000-6,size().height-18,12,12); }else if(my>3 && my<20 && mx>(size().width-61) && switch_on){ dragmode=3; if(mx>(size().width-61) && mx<(size().width-44)){ movemode=0; }else if(mx>(size().width-41) && mx<(size().width-24)){ movemode=1; }else if(mx>(size().width-21) && mx<(size().width-4)){ movemode=2; } }else if(my>23 && my<40 && mx>(size().width-61) && switch_on){ dragmode=3; if(mx>(size().width-61) && mx<(size().width-44)){ fastmode=1-fastmode; }else if(mx>(size().width-41) && mx<(size().width-24)){ viewface=1-viewface; }else if(mx>(size().width-21) && mx<(size().width-4)){ viewline=1-viewline; } }else if(my>(size().height/2-21) && my<(size().height/2+36) && mx>(size().width-21) && p3dmode){ dragmode=5; }else{ dragmode=4; prevx = mx; prevy = my; } return true; } public boolean mouseUp(Event e, int mx, int my) { if(readed && p3dmode==false){ painted = false; paint2(this.getGraphics()) ; }else if(my>(size().height/2-21) && my<(size().height/2+36) && mx>(size().width-21) && p3dmode){ if(my>(size().height/2+8)){ if(movno21) movno2--; } dragmode=5; } return true; } public boolean mouseDrag(Event e, int mx, int my) { if(dragmode==1 && readed && zoom_on){ Graphics g=this.getGraphics(); zoom=mx*100/size().width+50; if(zoom<50) zoom=50; if(zoom>150) zoom=150; int yyy=size().height-40; if(!pers_on) yyy+=20; g.setColor(Color.black); g.fillRect(0,yyy,size().width,16); g.setColor(Color.white); g.fillRect(0,yyy+2,size().width,12); g.setColor(Color.yellow); g.fillRect((zoom-50)*size().width/100-6,yyy+2,12,12); if (painted && p3dmode==false) { painted = false; if(fastmode==1){ paint3(g) ; }else{ paint2(g) ; } } }else if(dragmode==2 && readed && pers_on){ Graphics g=this.getGraphics(); pers=mx*4000/size().width+500; if(pers<500) pers=500; if(pers>4500) pers=4500; g.setColor(Color.black); g.fillRect(0,size().height-20,size().width,16); g.setColor(Color.white); g.fillRect(0,size().height-18,size().width,12); g.setColor(Color.yellow); g.fillRect((pers-500)*size().width/4000-6,size().height-18,12,12); if (painted && p3dmode==false) { painted = false; if(fastmode==1){ paint3(g) ; }else{ paint2(g) ; } } }else if(dragmode==4 && readed){ if(movemode==2){ xtheta += (prevy - my) * 360.0f / size().height; ytheta += (prevx - mx) * 360.0f / size().width; if(xtheta<0) xtheta+=360; if(xtheta>360) xtheta-=360; if(ytheta<0) ytheta+=360; if(ytheta>360) ytheta-=360; }else if(movemode==1){ xmove += (mx - prevx)*2 ; zmove -= (my - prevy)*2 ; }else{ xmove += (mx - prevx)*2 ; ymove += (my - prevy)*2 ; } if (painted && p3dmode==false) { painted = false; if(fastmode==1){ paint3(this.getGraphics()) ; }else{ paint2(this.getGraphics()) ; } } prevx = mx; prevy = my; } return true; } public void paint(Graphics g) { if (painted && p3dmode==false) { painted = false; paint2(g); } } public void paint3(Graphics g) { fastmode2=1; paint2(g) ; fastmode2=0; } public void paint2(Graphics g) { int dx1,dx2,dy1,dy2; int sx1,sx2,sy1,sy2, sz1, sz2; int polyx[] = new int[5]; int polyy[] = new int[5]; int polyn = 0; int dx[] = new int[8]; int dy[] = new int[8]; int dz; long ax,ay,az,bx,by,bz,gx,gy,gz,lx,ly,lz; if(width2!=size().width || height2!=size().height){ width2=size().width; height2=size().height; image = this.createImage(width2,height2); off = image.getGraphics(); } if(readed){ if(p3dmode) p3dsetpar(); rotate_all(); } if(readed){ off.setColor(new Color(cr[13][0],cg[13][0],cb[13][0])); }else{ off.setColor(Color.white); } off.fillRect(0,0,size().width,size().height); off.setColor(Color.black); if((faceno>0 || readed) && fastmode2==0){ int faceno2=0; int err=0; if(viewface==1){ for(int i=0;i=0;i--){ int iz=zsort[i][1]; if(zsort[i][2]==0){ byoga++; polyx[0]=x3[face[iz][6]]; polyy[0]=y3[face[iz][6]]; polyx[1]=x3[face[iz][7]]; polyy[1]=y3[face[iz][7]]; polyx[2]=x3[face[iz][8]]; polyy[2]=y3[face[iz][8]]; if(face[iz][0]==3){ polyn=3; polyx[3]=x3[face[iz][6]]; polyy[3]=y3[face[iz][6]]; }else{ polyn=4; polyx[3]=x3[face[iz][9]]; polyy[3]=y3[face[iz][9]]; polyx[4]=x3[face[iz][6]]; polyy[4]=y3[face[iz][6]]; } if(readed){ ax=x2[face[iz][6]]-x2[face[iz][7]]; ay=y2[face[iz][6]]-y2[face[iz][7]]; az=z2[face[iz][6]]-z2[face[iz][7]]; bx=x2[face[iz][8]]-x2[face[iz][7]]; by=y2[face[iz][8]]-y2[face[iz][7]]; bz=z2[face[iz][8]]-z2[face[iz][7]]; gx=(ay*bz-az*by); gy=(az*bx-ax*bz); gz=(ax*by-ay*bx); if(gz>0){ gx=-gx; gy=-gy; gz=-gz; } lx=-10; ly=-10; lz=0; double kakudo=((gx*lx+gy*ly+gz*lz) /((Math.sqrt(gx*gx+gy*gy+gz*gz) *Math.sqrt(lx*lx+ly*ly+lz*lz)))+1)/2; if(kakudo<0) kakudo=0; if(kakudo>1) kakudo=1; int xcr=cr[face[iz][5]][1]; int xcg=cg[face[iz][5]][1]; int xcb=cb[face[iz][5]][1]; xcr+=(int)((cr[face[iz][5]][0]-xcr)*kakudo); xcg+=(int)((cg[face[iz][5]][0]-xcg)*kakudo); xcb+=(int)((cb[face[iz][5]][0]-xcb)*kakudo); off.setColor(new Color(xcr,xcg,xcb)); }else{ off.setColor(Color.white); } off.fillPolygon(polyx,polyy,polyn); if(viewline==1){ for(int j=1;j0){ for(int i=0;i0){ for(int i=1;i-(pers-10)){ off.drawLine(x3[i],y3[i],x3[i],y3[i]); } } } draw_message(); g.drawImage(image,0,0,this); painted = true; } public void drawLine2r(Graphics g,int dlx1,int dly1,int dlz1 ,int dlx2,int dly2,int dlz2,int dotlen,int dot) { if(dotlen>10){ int hx=(dlx1+dlx2)/2; int hy=(dly1+dly2)/2; int hz=(dlz1+dlz2)/2; drawLine2r(g,dlx1,dly1,dlz1,hx,hy,hz,dotlen/2,dot); drawLine2r(g,hx,hy,hz,dlx2,dly2,dlz2,dotlen/2,dot); }else{ float fx3 = (float)dlx1; float fy3 = (float)dly1; float fz3 = (float)dlz1; fx3=(float)(fx3*pers/Math.sqrt(fx3*fx3+fy3*fy3+(pers+fz3) *(pers+fz3))*zoom/100*scale/500+(size().width/2)); fy3=(float)(fy3*pers/Math.sqrt(fx3*fx3+fy3*fy3+(pers+fz3) *(pers+fz3))*zoom/100*scale/500+(size().height/2)); int xxx1 = (int)fx3; int yyy1 = (int)fy3; fx3 = (float)dlx2; fy3 = (float)dly2; fz3 = (float)dlz2; fx3=(float)(fx3*pers/Math.sqrt(fx3*fx3+fy3*fy3+(pers+fz3) *(pers+fz3))*zoom/100*scale/500+(size().width/2)); fy3=(float)(fy3*pers/Math.sqrt(fx3*fx3+fy3*fy3+(pers+fz3) *(pers+fz3))*zoom/100*scale/500+(size().height/2)); int xxx2 = (int)fx3; int yyy2 = (int)fy3; drawLine2(g,xxx1,yyy1,xxx2,yyy2,dot); } } public void drawLine3(Graphics g,int iz) { int dx1,dy1,dx2,dy2; if(viewline==1){ if(readed){ int linecolor = lines[iz][4]; g.setColor(new Color(cr[linecolor][0], cg[linecolor][0], cb[linecolor][0])); }else{ g.setColor(Color.black); } if(lensmode){ dx1=x3[lines[iz][0]]; dy1=y3[lines[iz][0]]; dx2=x3[lines[iz][1]]; dy2=y3[lines[iz][1]]; int dotlen=0; if(dx1>dx2){ dotlen+=(dx1-dx2); }else{ dotlen+=(dx2-dx1); } if(dy1>dy2){ dotlen+=(dy1-dy2); }else{ dotlen+=(dy2-dy1); } if(readed){ if(lines[iz][3]==0){ drawLine2r(g,x2[lines[iz][0]],y2[lines[iz][0]],z2[lines[iz][0]] ,x2[lines[iz][1]],y2[lines[iz][1]],z2[lines[iz][1]],dotlen,lines[iz][5]); } }else{ drawLine2r(g,x2[lines[iz][0]],y2[lines[iz][0]],z2[lines[iz][0]] ,x2[lines[iz][1]],y2[lines[iz][1]],z2[lines[iz][1]],dotlen,1); } }else{ dx1=x3[lines[iz][0]]; dy1=y3[lines[iz][0]]; dx2=x3[lines[iz][1]]; dy2=y3[lines[iz][1]]; if(readed){ if(lines[iz][3]==0){ drawLine2(g,dx1,dy1,dx2,dy2,lines[iz][5]); } }else{ drawLine2(g,dx1,dy1,dx2,dy2,1); } } } } public void drawLine2(Graphics g,int dx1,int dy1,int dx2,int dy2,int dot) { if(dot==1){ g.drawLine(dx1,dy1,dx2,dy2); }else{ int dot2=-(dot/2)+1; if(Math.abs(dx1-dx2) lo0){ mid = zsort[ ( lo0 + hi0 ) / 2 ][0]; while( lo <= hi ){ while((lo < hi0) && (zsort[lo][0] < mid)) ++lo; while((hi > lo0) && (zsort[hi][0] > mid)) --hi; if( lo <= hi ) { T=zsort[lo][0]; zsort[lo][0]=zsort[hi][0]; zsort[hi][0]=T; T=zsort[lo][1]; zsort[lo][1]=zsort[hi][1]; zsort[hi][1]=T; T=zsort[lo][2]; zsort[lo][2]=zsort[hi][2]; zsort[hi][2]=T; ++lo; --hi; } } if( lo0 < hi ) QuickSort( lo0, hi ); if( lo < hi0 ) QuickSort( lo, hi0 ); } } void seta(double rn[][],int keyno3){ double a[] = new double[6]; double y; double df; double t[] = new double[2]; double v[] = new double[2]; for(int i=0;i<4;i++){ df=rn[i][3]-rn[i][2]; t[0]=(rn[i][0]+8*(-rn[i][1]+rn[i][3])-rn[i][4])/12; t[1]=(rn[i][1]+8*(-rn[i][2]+rn[i][4])-rn[i][5])/12; v[0]=(-rn[i][0]+16*rn[i][1]-30*rn[i][2]+16*rn[i][3]-rn[i][4])/24; v[1]=(-rn[i][1]+16*rn[i][2]-30*rn[i][3]+16*rn[i][4]-rn[i][5])/24; a[0]=rn[i][2]; a[1]=t[0]; a[2]=v[0]/2; a[3]=10*df-4*t[1]-6*t[0]+(v[1]-3*v[0])/2; a[4]=-15*df+7*t[1]+8*t[0]-v[1]+3*v[0]/2; a[5]=6*df-3*t[1]-3*t[0]+(v[1]-v[0])/2; y=0; for(int k=5;k>=0;k--) y=y*(keyno3*1.0/100)+a[k]; rn[i][6]=y; } } double seta2(int rotx[],int keyno5,int keystart5,int keyno2,int keyno3){ double a[] = new double[6]; double y=0; int df; double t[] = new double[2]; double v[] = new double[2]; int rn[] = new int[6]; for(int i=0;i<6;i++){ rn[i]=rotx[(keyno2-2+i+keyno5) % keyno5 + keystart5]; } df=rn[3]-rn[2]; t[0]=(double)((double)rn[0]+8*(-rn[1]+rn[3])-rn[4])/12; t[1]=(double)((double)rn[1]+8*(-rn[2]+rn[4])-rn[5])/12; v[0]=(double)(-(double)rn[0]+16*rn[1]-30*rn[2]+16*rn[3]-rn[4])/24; v[1]=(double)(-(double)rn[1]+16*rn[2]-30*rn[3]+16*rn[4]-rn[5])/24; a[0]=rn[2]; a[1]=t[0]; a[2]=v[0]/2; a[3]=10*df-4*t[1]-6*t[0]+(v[1]-3*v[0])/2; a[4]=-15*df+7*t[1]+8*t[0]-v[1]+3*v[0]/2; a[5]=6*df-3*t[1]-3*t[0]+(v[1]-v[0])/2; for(int i=5;i>=0;i--) y=y*(keyno3*1.0/100)+a[i]; return(y); } boolean polycheck(int x[],int y[],int polyn){ boolean flag = false; int sx=0; int sy=0; int maxx=-99999; int maxy=-99999; int minx=99999; int miny=99999; int width3 = width2; int height3 = height2; int tcx[] = new int[3]; int tcy[] = new int[3]; for(int i=0;i=0 && x[i]=0 && y[i]maxx) maxx=x[i]; if(y[i]>maxy) maxy=y[i]; if(x[i]=0 && sx=0 && sy=x[1] && x[0]>=x[2]){ wx[2]=x[0]; wy[2]=y[0]; if(x[1]>x[2]){ wx[1]=x[1]; wy[1]=y[1]; wx[0]=x[2]; wy[0]=y[2]; }else{ wx[0]=x[1]; wy[0]=y[1]; wx[1]=x[2]; wy[1]=y[2]; } }else if(x[0]<=x[1] && x[0]<=x[2]){ wx[0]=x[0]; wy[0]=y[0]; if(x[1]>x[2]){ wx[2]=x[1]; wy[2]=y[1]; wx[1]=x[2]; wy[1]=y[2]; }else{ wx[1]=x[1]; wy[1]=y[1]; wx[2]=x[2]; wy[2]=y[2]; } }else{ wx[1]=x[0]; wy[1]=y[0]; if(x[1]>x[2]){ wx[2]=x[1]; wy[2]=y[1]; wx[0]=x[2]; wy[0]=y[2]; }else{ wx[0]=x[1]; wy[0]=y[1]; wx[2]=x[2]; wy[2]=y[2]; } } if(wx[0]==wx[2]){ }else{ x1=wx[0]; x2=wx[2]; if(x1=0){ if(x1<0) x1=0; if(x2>=width3) x2=width3-1; for(int i=x1;i<=x2;i++){ if(wx[0]==wx[1]){ y1=wy[0]+(wy[2]-wy[0])*(i-wx[0])/(wx[2]-wx[0]); y2=wy[1]+(wy[2]-wy[1])*(i-wx[1])/(wx[2]-wx[1]); }else if(wx[2]==wx[1]){ y1=wy[0]+(wy[1]-wy[0])*(i-wx[0])/(wx[1]-wx[0]); y2=wy[0]+(wy[2]-wy[0])*(i-wx[0])/(wx[2]-wx[0]); }else{ y1=wy[0]+(wy[2]-wy[0])*(i-wx[0])/(wx[2]-wx[0]); if(i>wx[1]){ y2=wy[1]+(wy[2]-wy[1])*(i-wx[1])/(wx[2]-wx[1]); }else{ y2=wy[0]+(wy[1]-wy[0])*(i-wx[0])/(wx[1]-wx[0]); } } if(y1>y2){ y3=y2; y2=y1; y1=y3; } if(y1=0 && y2>y1){ if(y1<0) y1=0; if(y2>height3) y2=height3; for(int j=y1;j=keyno5[movno]) keyno2=0; for(int j=0;j1) off.setColor(Color.yellow); else off.setColor(Color.white); off.fillRect(size().width-18,size().height/2-18,12,12); off.setColor(Color.black); off.drawString(""+movno2,size().width-20,size().height/2+16); off.fillRect(size().width-20,size().height/2+20,16,16); if(movno2