//includeawt(s) import java.awt.Graphics; import java.applet.Applet; import java.awt.Color; //main public class man extends java.applet.Applet{ //declare variables Color col1,col2,col3; int N,taka,haba; int k,i,j,l; double di,di2,di3,cp2,cpx;//,ys,t; double x1max,x1min,y1max,y1min; double yen,yst,yst2,yen2,yst3,yen3; double xst,xen,xst2,xen2,xst3,xen3,ymin,ymax; double ds,us,xx,yy2; double a,b,ak,bk; double dik,di2k,di3k,cp2k,cpxk; double x1maxk,x1mink,y1maxk,y1mink,x1x1,y1y1; double yenk,ystk,yst2k,yen2k,yst3k,yen3k; double xstk,xenk,xst2k,xen2k,xst3k,xen3k; int br,br2,u,k2; int xz,xz2,yz,yz2; String NS,habaS,takaS; double Nd,takad,habad; Color cl[]=new Color[13]; double kx[]=new double[100]; double ky[]=new double[100]; double kz[]=new double[100]; //function to convert to double type public double dou(String dous){ double dou1; dou1 = (Double.valueOf(dous)).doubleValue(); return dou1; } //function to generate random variables public double rand(){ double rand1; rand1=Math.random(); return rand1; } //function to make initial screen public void init(){ col1=Color.black; col2=Color.green; col3=Color.blue; cl[0]=Color.yellow; cl[1]=Color.green; cl[2]=Color.yellow; //taka is hight, haba is width takaS=getParameter("takap"); habaS=getParameter("habap"); NS=getParameter("Np"); habad=dou(habaS); takad=dou(takaS); Nd=dou(NS); // if(Nd==8){ Nd=4+16*rand(); // } //taka is hight, haba is width haba=(int)habad; taka=(int)takad; //N is number of the generators N=(int)Nd; } //(x1,y1) is coordinates of generators double x1[]=new double[100]; double y1[]=new double[100]; int x[]=new int[100]; int y[]=new int[100]; double s[]=new double[100]; String sss[]=new String[100]; // jou is function of power public double jou(double aj,double bj){ double jou1; jou1=Math.pow(aj,bj); return jou1; } //absolute value public double abso(double ab1){ double abab; if(ab1>0){ abab=ab1; } else{ abab=-ab1; } return abab; } //function of Euclidean distance // distance between (ad,bd) and (ad2,bd2) public double dis(double ad,double bd,double ad2,double bd2){ double dis1; dis1=abso(ad-ad2)+abso(bd-bd2); return dis1; } //kouten is the point of intersection of two lines //x-coordinate of intersection of two lines y=as x+bs and y= ask x+bsk public double koutenx(double as,double bs,double ask,double bsk){ double aaa1; aaa1=(bsk-bs)/(as-ask); return aaa1; } //y-coordinate of intersection of two lines y=as x+bs and y= ask x+bsk public double kouteny(double as2,double bs2,double ask2,double bsk2){ double aaa2; aaa2=(bs2/as2-bsk2/ask2)/(1.0/as2-1.0/ask2); return aaa2; } //subroutine of sort // reorder te1[],te2[],te3[] such that te1[0]=1;kk--){ ii=kk; b1=te1[ii-1];b2=te2[ii-1];b3=te3[ii-1]; while(2*ii<=NN){ jj=2*ii; if(jj+1<=NN){ 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 } //painting subroutine public void paint(java.awt.Graphics g){ g.setColor(col1); g.fillRect(1,1,haba,taka); g.setColor(col3); //decide the location of the generators by using random variables for(k=0;k0 if((x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0){//yの方が大きく、2つの母点は右上がり di=-1.0+rand()/1000.0; yst=di*(x1min-cpx)+cp2; yen=di*(x1max-cpx)+cp2; l=1; kx[l-1]=x1min; ky[l-1]=di*(kx[l-1]-cpx)+cp2; l++; kx[l-1]=x1max; ky[l-1]=di*(kx[l-1]-cpx)+cp2; a=di; b=-di*cpx+cp2; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0 if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; di2k=-rand()/800.0; ak=di2k; bk=-di2k*x1mink+ystk; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk //if the differences of y-coordinate is larger than the differences of x-coordinate //and if (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk //if the differences of x-coordinate is larger than the differences of y-coordinate // the code continue until every cases are done. else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/800.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; di2k=-800.0+rand()/800.0; ak=di2k; bk=-di2k*xstk+y1mink; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if(k!=i && k!=j }//k di2=-rand()/800.0; yst2=di2*(0.0-x1min)+yst; yen2=di2*(x1min-x1min)+yst; l++; kx[l-1]=0.0; ky[l-1]=di2*(kx[l-1]-x1min)+yst; a=di2; b=-di2*x1min+yst; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=i && k!=j }//k di3=-rand()/800.0; yst3=di3*(x1max-x1max)+yen; yen3=di3*(haba-x1max)+yen; l++; kx[l-1]=haba; ky[l-1]=di3*(kx[l-1]-x1max)+yen; a=di3; b=-di3*x1max+yen; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k }//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yの方が大きく、2つの母点は右上がり else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく、2つの母点は右下がり di=1.0+rand()/1000.0; yst=di*(x1min-cpx)+cp2; yen=di*(x1max-cpx)+cp2; l=1; kx[l-1]=x1min; ky[l-1]=di*(kx[l-1]-cpx)+cp2; l++; kx[l-1]=x1max; ky[l-1]=di*(kx[l-1]-cpx)+cp2; a=di; b=-di*cpx+cp2; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; di2k=rand()/800.0; ak=di2k; bk=-di2k*x1mink+ystk; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; di2k=800.0+rand()/800.0; ak=di2k; bk=-di2k*xstk+y1mink; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k di2=rand()/800.0; l++; kx[l-1]=0.0; ky[l-1]=di2*(kx[l-1]-x1min)+yst; a=di2; b=-di2*x1min+yst; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k di3=rand()/800.0; l++; kx[l-1]=haba; ky[l-1]=di3*(kx[l-1]-x1max)+yen; a=di3; b=-di3*x1max+yen; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k }//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yの方が大きく、2つの母点は右下がり for(u=1;u<=l;u++){ kz[u-1]=0; } heapv(kx,ky,kz,l); for(k=1;k<=l-1;k++){ k2=k+1; xx=(kx[k-1]+kx[k2-1])/2.0; yy2=(ky[k-1]+ky[k2-1])/2.0;//di*(xx-xx)+cp2; ds=dis(xx,yy2,x1[i-1],y1[i-1]); br2=0; for(u=1;u<=N;u++){ if(u!=i && u!=j){ us=dis(xx,yy2,x1[u-1],y1[u-1]); if(us0){//yの方が大きく、2つの母点は右上がり di=-1.0+rand()/1000.0; yst=di*(x1min-cpx)+cp2; yen=di*(x1max-cpx)+cp2; l=1; kx[l-1]=x1min; ky[l-1]=di*(kx[l-1]-cpx)+cp2; l++; kx[l-1]=x1max; ky[l-1]=di*(kx[l-1]-cpx)+cp2; a=di; b=-di*cpx+cp2; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; di2k=-rand()/800.0; ak=di2k; bk=-di2k*x1mink+ystk; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/800.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; di2k=-800.0+rand()/800.0; ak=di2k; bk=-di2k*xstk+y1mink; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if(k!=i && k!=j }//k di2=-rand()/800.0; yst2=di2*(0.0-x1min)+yst; yen2=di2*(x1min-x1min)+yst; l++; kx[l-1]=0.0; ky[l-1]=di2*(kx[l-1]-x1min)+yst; a=di2; b=-di2*x1min+yst; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=i && k!=j }//k di3=-rand()/800.0; yst3=di3*(x1max-x1max)+yen; yen3=di3*(haba-x1max)+yen; l++; kx[l-1]=haba; ky[l-1]=di3*(kx[l-1]-x1max)+yen; a=di3; b=-di3*x1max+yen; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k }//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yの方が大きく、2つの母点は右上がり else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく、2つの母点は右下がり di=1.0+rand()/1000.0; yst=di*(x1min-cpx)+cp2; yen=di*(x1max-cpx)+cp2; l=1; kx[l-1]=x1min; ky[l-1]=di*(kx[l-1]-cpx)+cp2; l++; kx[l-1]=x1max; ky[l-1]=di*(kx[l-1]-cpx)+cp2; a=di; b=-di*cpx+cp2; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; di2k=rand()/800.0; ak=di2k; bk=-di2k*x1mink+ystk; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; di2k=800.0+rand()/800.0; ak=di2k; bk=-di2k*xstk+y1mink; if(koutenx(a,b,ak,bk)>x1min && koutenx(a,b,ak,bk)x1min && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k di2=rand()/800.0; l++; kx[l-1]=0.0; ky[l-1]=di2*(kx[l-1]-x1min)+yst; a=di2; b=-di2*x1min+yst; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k di3=rand()/800.0; l++; kx[l-1]=haba; ky[l-1]=di3*(kx[l-1]-x1max)+yen; a=di3; b=-di3*x1max+yen; for(k=1;k<=N;k++){ if(k!=i && k!=j){ x1maxk=x1[i-1]; x1mink=x1[k-1]; if(x1[i-1]0){//yの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; ystk=dik*(x1mink-cpxk)+cp2k; yenk=dik*(x1maxk-cpxk)+cp2k; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)0 yの方が大きく2つの母点は右下がりk }//yの方が大きいk else{//xの方が大きいk if((x1[i-1]-x1[k-1])*(y1[i-1]-y1[k-1])>0){//xの方が大きく2つの母点は右上がりk dik=-1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右上がりk else{//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 xの方が大きく2つの母点は右下がりk dik=1.0+rand()/1000.0; xstk=(y1mink-cp2k)/dik+cpxk; xenk=(y1maxk-cp2k)/dik+cpxk; ak=dik; bk=-dik*cpxk+cp2k; if(koutenx(a,b,ak,bk)>x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)x1max && koutenx(a,b,ak,bk)0 xの方が大きく2つの母点は右下がりk }//xの方が大きいk }//if k!=j }//k }//(x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yの方が大きく、2つの母点は右下がり for(u=1;u<=l;u++){ kz[u-1]=0; } heapv(kx,ky,kz,l); for(k=1;k<=l-1;k++){ k2=k+1; xx=(kx[k-1]+kx[k2-1])/2.0; yy2=(ky[k-1]+ky[k2-1])/2.0;//di*(xx-xx)+cp2; ds=dis(xx,yy2,x1[i-1],y1[i-1]); br2=0; for(u=1;u<=N;u++){ if(u!=i && u!=j){ us=dis(xx,yy2,x1[u-1],y1[u-1]); if(us