import java.awt.*; import java.applet.Applet; import java.awt.Color; import java.awt.Font; public class msteiner extends Applet implements Runnable{ Thread th; Color col1,col2; double pi; int tim,timlabel,counter2; int N,taka,haba,label,sn,h,er,ni,nj,minj,minNN; int k,i,j,l,orikaeshi,co2,sco,NN,koko,coch,coch2; double di2,di,cp2,cpx,ys,t,lto,xmax,dd2; double tx,ty; double x0,y0,xx,yy,xa1=0,ya1=0,yy2,mind; double di4,di3,cp3,cpx3,ys3,t2,ds,us; double y20,y21,sa0,sa1; int br,br2,u,k2,toutta,steinerlabel; int xz,xz2,yz,yz2; String NS,habaS,takaS; double Nd,takad,habad; Color cl[]=new Color[13]; int ncv[]=new int[200]; int cv[][]=new int[200][200]; double ei[]=new double[20000]; double ej[]=new double[20000]; double ed[]=new double[20000]; double x1[]=new double[200]; double y1[]=new double[200]; double xmin[]=new double[200]; double ymin[]=new double[200]; double w1[]=new double[200]; double x2[]=new double[200]; double y2[]=new double[200]; double aa[]=new double[200]; double bb[]=new double[200]; double aa2[]=new double[200]; double bb2[]=new double[200]; double s[]=new double[200]; int sl[]=new int[200]; int sl2[]=new int[200]; int slmin[]=new int[200]; int e1[]=new int[200]; int e2[]=new int[200]; int e1min[]=new int[200]; int e2min[]=new int[200]; int cn[]=new int[2000]; int cn2[]=new int[200]; int connect[][]=new int[200][10]; String sss[]=new String[200]; public void start(){ if(th==null){ th=new Thread(this); th.start(); } } //compute arc-cos public double arccosaw(double atasw){ double arco; arco=Math.acos(atasw); return arco; } //compute arc-sin public double arcsinaw(double atasw){ double artn1saw; artn1saw=Math.asin(atasw); return artn1saw; } //compute arc-tan public double artnaw(double ataw){ double artn1aw; artn1aw=Math.atan(ataw); return artn1aw; } //convert to double types public double dou(String dous){ double dou1; dou1 = (Double.valueOf(dous)).doubleValue(); return dou1; } //get random variables public double rand(){ double rand1; rand1=Math.random(); return rand1; } public void init(){ col1=Color.black; col2=Color.yellow; cl[0]=Color.white; cl[1]=Color.green; cl[2]=Color.cyan; takaS=getParameter("takap"); habaS=getParameter("habap"); NS=getParameter("Np"); habad=dou(habaS); takad=dou(takaS); Nd=dou(NS); Nd=4+46*rand(); haba=(int)habad;// width of screen taka=(int)takad;// height of screen N=(int)Nd;// number of points(generators) } //compute power ^ public double jou(double a,double b){ double jou1; jou1=Math.pow(a,b); return jou1; } //Euclidean distance public double d(double d1,double d2,double d3,double d4){ double dw; dw=jou(jou(d3-d1,2.0)+jou(d4-d2,2.0),0.5); return dw; } //sort such that te1[0]=1;kk--){ ii=kk; b1=te1[ii-1];b2=te2[ii-1];b3=te3[ii-1]; while(2*ii<=NNh){ jj=2*ii; if(jj+1<=NNh){ if(te1[jj-1]=1;mm--){ c1=te1[mm];c2=te2[mm];c3=te3[mm]; te1[mm]=te1[0];te2[mm]=te2[0];te3[mm]=te3[0]; ii=1; while(2*ii<=mm){ kk=2*ii; if(kk+1<=mm){ if(te1[kk-1]<=te1[kk]){ kk++; } } if(te1[kk-1]<=c1){ break; } te1[ii-1]=te1[kk-1];te2[ii-1]=te2[kk-1];te3[ii-1]=te3[kk-1]; ii=kk; }//wend te1[ii-1]=c1;te2[ii-1]=c2;te3[ii-1]=c3; }//next mm } //compute convex hull public void ch(){ xmax=x1[N-1]; orikaeshi=0; coch=0; coch2=0; lto=0.0; while(lto!=x2[0]){ xx=x1[0]; yy=y1[0]; for(i=1;ixx){ w1[i]=3*pi/2-arcsinaw((y1[i]-yy)/d(x1[i],y1[i],xx,yy)); } w1[i]=w1[i]+pi; if(w1[i]>2*pi){ w1[i]=w1[i]-2*pi; } if(orikaeshi==1){ w1[i]=arcsinaw((y1[i]-yy)/d(x1[i],y1[i],xx,yy))+pi/2; if(x1[i]>xx){ w1[i]=3*pi/2-arcsinaw((y1[i]-yy)/d(x1[i],y1[i],xx,yy)); } if(w1[i]>2*pi){ w1[i]=w1[i]-2*pi; } } }//next i x1[0]=xx; y1[0]=yy; w1[0]=100.0; heapv(w1,x1,y1,N); lto=x1[0]; if(orikaeshi==0){ aa[coch]=(y1[0]-yy)/(x1[0]-xx); bb[coch]=y1[0]-aa[coch]*x1[0]; coch++; } else{ aa2[coch2]=(y1[0]-yy)/(x1[0]-xx); bb2[coch2]=y1[0]-aa2[coch2]*x1[0]; coch2++; } if(x1[0]==xmax){ orikaeshi=1; } }//wend for(k=0;kx1[ij2]){ tx=x1[ij1]+Math.cos(pi/3.0)*xz+Math.sin(pi/3.0)*yz; ty=y1[ij1]-Math.sin(pi/3.0)*xz+Math.cos(pi/3.0)*yz; } if(y1[ij3]>ka*x1[ij3]+se && x1[ij1]ka*x1[ij3]+se && x1[ij1]>x1[ij2]){ tx=x1[ij1]+Math.cos(-pi/3.0)*xz+Math.sin(-pi/3.0)*yz; ty=y1[ij1]-Math.sin(-pi/3.0)*xz+Math.cos(-pi/3.0)*yz; } }//ihoujin void musoubana(int mij1,int mij2,int mij3){ double xc,yc,an,bn,mux,muy,rr; xc=(x1[mij1]+x1[mij2]+tx)/3.0; yc=(y1[mij1]+y1[mij2]+ty)/3.0; rr=d(x1[mij1],y1[mij1],xc,yc); x1[mij1]=x1[mij1]-xc; y1[mij1]=y1[mij1]-yc; x1[mij2]=x1[mij2]-xc; y1[mij2]=y1[mij2]-yc; x1[mij3]=x1[mij3]-xc; y1[mij3]=y1[mij3]-yc; tx=tx-xc; ty=ty-yc; an=(y1[mij3]-ty)/(x1[mij3]-tx); bn=ty-an*tx; if(tx2){ tra2++; ter=1; tase1(it); mst(); hantei(); if(NN>2*N-2){ break; } }//cn[it]==3 }//it for(int it=0;it2*N-2){ break; } }//qw>2.0*pi/3.0 }//cn[it]==2 }//it if(ter==0){ tlabel=1; } }//tlabel if(tra2>0){ bohe(); mst(); hantei(); } }//tuika void mrlonely(){ int qint; double xx2,yy2,qa,qb,qc,qw,maxq,qwe; int tlabel,tra,tra2; tlabel=0; tra=0; tra2=0; while(tlabel==0){ tra++; int ter=0; for(int it1=N;it1maxq){ maxq=qwe; } xx=x1[connect[it1][2]]; yy=y1[connect[it1][2]]; xx2=x1[connect[it1][0]]; yy2=y1[connect[it1][0]]; qa=d(xx,yy,xx2,yy2); qb=d(xx,yy,x1[it1],y1[it1]); qc=d(xx2,yy2,x1[it1],y1[it1]); qw=arccosaw((qb*qb+qc*qc-qa*qa)/(2.0*qb*qc)); qwe=d(qw,0.0,2.0*pi/3.0,0.0); if(qwe>maxq){ maxq=qwe; } if(maxq>pi/180.0){ ter++; ihoujin(connect[it1][0],connect[it1][1],connect[it1][2]); msbn2(it1,connect[it1][0],connect[it1][1],connect[it1][2]); mst(); hantei(); }//maxq>pi/180.0 }//cn[it1]==2 }//it1 if(ter==0){ tlabel=1; } }//tlabel if(tra2>0){ bohe(); mst(); hantei(); } }//mrlonely public void hantei(){ int ih; dd2=moku(); if(dd220){ if(tim % 3==0){ timlabel=1; } } if(N>9 && N<21){ if(tim % 30==0){ timlabel=1; } } if(N<10){ if(tim % 100==0){ timlabel=1; } } if(timlabel==1){ repaint(); } sco=0; NN=N; for(k=0;kaa[h]*x1kouho+bb[h]){ br2=1; } } for(h=0;h