#include<stdlib.h>
#include"stdio.h"
#include<time.h>
#include<conio.h>
#include"math.h"
//在区间[c,d]上产生一个等概率分布随机整数
int evenls1(int c,int d)
{
int k,l,m,bb;
k=d-c+1;
l=2;
while(l<k)
l=l+1;
m=4*l;
k=rand();
k=k+k+k+k+k;
k=k%m;
l=k/4+c;
if(l<=d)
bb=l;
return bb;
}
//************产生[a,b]上一个均匀分布随机浮点数********************
double evenxl1(double a, double b)
{
int m;
double s, u, v, r, jy;
s=65536.0;
u=2053.0;
v=13849.0;
r=rand();
r=u*r+v;
m=(int)(r/s);
r=r-m*s;
jy=(r/s)*(b-a)+a;
return(jy);
}
void evenxl(double a,double b,double * r,double p[],int n)
{
//产生均匀分布随机浮点数
int i,m;
double s, u, v;
s=65536.0;
u=2053.0;
v=13849.0;
for(i=0;i<n;i++)
{
*r=u*(*r)+v;
m=(int)(*r/s);
*r=*r-m*s;
p[i]=(*r/s)*(b-a)+a;
}
return;
}
double zts(double*r) //double u, double g,double *r)
{
double mm[2];
double t,w;
w=rand();
evenxl(0.0,1.0,&w,mm,2);
//printf("%f %f\n",mm[0],mm[1]);
t=sqrt(-2*log(mm[1]))*sin(2*3.14*mm[0]);
return(t);
}
//*************产生均值为u,方差为deta的服从正态分布的随机数****************
double ztRand(double u,double deta)
{
double u1,u2,z,zt;
u1=evenxl1(.0,1.0);
u2=evenxl1(.0,1.0);
z=sqrt(-2*log(u1))*sin(8*atan(1)*u2);
zt=u+deta*z;
return(zt);
}
void evenls(int c,int d,int *r,int bb[],int n)
{
//产生等概率分布随机整数
int k,l,m,i;
k=d-c+1;
l=2;
while(l<k)l=l+1;
m=4*l;k=*r;i=0;
while(i<=n-1)
{
k=k+k+k+k+k;
k=k%m;
l=k/4+c;
if(l<=d)
{
bb[i]=l;
i=i+1;
}
}
*r=k;
return ;
}
double max(double a,double b)
{ double max;
if(a>b)
max=a;
else max=b;
return max;
}
//比较所有行的指定列,按他们的升序排列这些行
void paixu(double p[100][20],int n,int m)
{
double temp;
int i,j,t;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(p[i][m]>p[j][m])
for(t=0;t<=m;t++)
{
temp=p[i][t];
p[i][t]=p[j][t];
p[j][t]=temp;
}
}
}
double stabl(double *a,double *b,int N)//a传入形心横,纵及方向角;b为质量
{
int i;
double xh,xz,st;
double *x=new double[2*N];
xh=0.0;
xz=0.0;
for(i=0;i<N;i++)
{
xh+=b[i]*a[3*i];//xh+=b[i]*a[3*i]*cos(a[3*i+1]);
xz+=b[i]*a[3*i+1];//xz+=b[i]*a[3*i]*sin(a[3*i+1]);
}
st=sqrt(xh*xh+xz*xz)/1000;//
return(st);
delete []x;
}
//计算外包络
double waibl(double *c,double *d,int N)//c传入形心横,纵及方向角;d传入半长,半宽
{
int i,k;
double max,wai,x,y,nn,vv;//,mm,uu
max=0.0;
for(i=0;i<N;i++)
{
//mm=cos(c[3*i+1]);
//uu=sin(c[3*i+1]);
nn=cos(c[3*i+2]);
vv=sin(c[3*i+2]);
for(k=1;k<5;k++)
{
if(k==1)
{
x=c[3*i]-d[2*i]*nn+d[2*i+1]*vv;//x=c[3*i]*mm-d[2*i]*nn+d[2*i+1]*vv;
y=c[3*i+1]-d[2*i]*vv-d[2*i+1]*nn;//y=c[3*i]*uu-d[2*i]*vv-d[2*i+1]*nn;(下同)
}
else if(k==2)
{
x=c[3*i]+d[2*i]*nn+d[2*i+1]*vv;
y=c[3*i+1]+d[2*i]*vv-d[2*i+1]*nn;
}
else if(k==3)
{x=c[3*i]+d[2*i]*nn-d[2*i+1]*vv;
y=c[3*i+1]+d[2*i]*vv+d[2*i+1]*nn;
}
else
{
x=c[3*i]-d[2*i]*nn-d[2*i+1]*vv;
y=c[3*i+1]-d[2*i]*vv+d[2*i+1]*nn;
}
wai=sqrt(x*x+y*y);
if(wai>max)max=wai;
}
}
return(max);
}
#include"stdio.h"
#include "math.h"
//计算干涉量
//A subfunction to judge whether two arbitrary tectangular graph elements overla
double interfer(double *f,double *aa,int N)//(double f[][6],int i,int j)
{ //Definition of viarables
int light,k,l,h,flag=0,num;
int rr,ss,i,j;
double v[20][2],n[20][8];//,D[20][20],U[20][20],L[20][20];
double m[20][2],inpn[4][4],xp[20][6],pp[20][8],L,D,U,*zp[20],*temp;//pp[20][8]为顶点
const double alpha=0.001;
//Initialization of viarables
for(rr=0;rr<N;rr++)
for(ss=0;ss<6;ss++)
{
if(ss==0)
xp[rr][ss]=f[3*rr];//横坐标
else if(ss==1)
xp[rr][ss]=f[3*rr+1];//纵坐标
else if(ss==2)
xp[rr][ss]=aa[2*rr];
else if(ss==3)
xp[rr][ss]=aa[2*rr+1];
else if(ss==4)
xp[rr][ss]=cos(f[3*rr+2]);
else if(ss==5)
xp[rr][ss]=sin(f[3*rr+2]);
}
for(i=1;i<=N;i++)
for(j=i+1;j<=N;j++)
{ light=0;
U=sqrt(xp[i-1][2]*xp[i-1][2]+xp[i-1][3]*xp[i-1][3])+sqrt(xp[j-1][2]*xp[j-1][2]+xp[j-1][3]*xp[j-1][3]);
L=xp[i-1][3]+xp[j-1][3];
D=sqrt((xp[i-1][0]-xp[j-1][0])*(xp[i-1][0]-xp[j-1][0])+(xp[i-1][1]-xp[j-1][1])*(xp[i-1][1]-xp[j-1][1]));
if(D>=U)
goto end;
if(D<L)
{
flag+=10;
goto end;
}
else
{
v[i-1][0]=-xp[i-1][5];//计算vi,vj使得<vi,ui>=0,<vj,uj>=0,并且 vi和vj 的范数等于1.
v[i-1][1]= xp[i-1][4];
v[j-1][0]=-xp[j-1][5];
v[j-1][1]= xp[j-1][4];
m[i-1][0]=xp[i-1][2]*xp[i-1][4];//计算图元Fi的顶点
m[i-1][1]=xp[i-1][3]*v[i-1][0];
m[i-1][2]=xp[i-1][2]*xp[i-1][5];
m[i-1][3]=xp[i-1][3]*v[i-1][1];
pp[i-1][0]=xp[i-1][0]-m[i-1][0]-m[i-1][1];
pp[i-1][1]=xp[i-1][1]-m[i-1][2]-m[i-1][3];
n[i-1][0]=-v[i-1][0];
n[i-1][1]=-v[i-1][1];
pp[i-1][2]=xp[i-1][0]+m[i-1][0]-m[i-1][1];
pp[i-1][3]=xp[i-1][1]+m[i-1][2]-m[i-1][3];
n[i-1][2]=xp[i-1][4];
n[i-1][3]=xp[i-1][5];
pp[i-1][4]=xp[i-1][0]+m[i-1][0]+m[i-1][1];
pp[i-1][5]=xp[i-1][1]+m[i-1][2]+m[i-1][3];
n[i-1][4]=v[i-1][0];
n[i-1][5]=v[i-1][1];
pp[i-1][6]=xp[i-1][0]-m[i-1][0]+m[i-1][1];
pp[i-1][7]=xp[i-1][1]-m[i-1][2]+m[i-1][3];
n[i-1][6]=-xp[i-1][4];
n[i-1][7]=-xp[i-1][5];
//计算图元Fj的顶点
m[j-1][0]=xp[j-1][2]*xp[j-1][4];
m[j-1][1]=xp[j-1][3]*v[j-1][0];
m[j-1][2]=xp[j-1][2]*xp[j-1][5];
m[j-1][3]=xp[j-1][3]*v[j-1][1];
pp[j-1][0]= xp[j-1][0]-m[j-1][0]-m[j-1][1];
pp[j-1][1]= xp[j-1][1]-m[j-1][2]-m[j-1][3];
pp[j-1][2]= xp[j-1][0]+m[j-1][0]-m[j-1][1];
pp[j-1][3]= xp[j-1][1]+m[j-1][2]-m[j-1][3];
pp[j-1][4]= xp[j-1][0]+m[j-1][0]+m[j-1][1];
pp[j-1][5]= xp[j-1][1]+m[j-1][2]+m[j-1][3];
pp[j-1][6]= xp[j-1][0]-m[j-1][0]+m[j-1][1];
pp[j-1][7]= xp[j-1][1]-m[j-1][2]+m[j-1][3];
for(h=0;h<N;h++)
zp[h]=pp[h];
Label01: for(k=1;k<=4;k++)
for(l=1;l<=4;l++)
inpn[k-1][l-1]=(-*(zp[i-1]+2*k-2)+*(zp[j-1]+2*l-2))*n[i-1][2*k-2]+(-*(zp[i-1]+2*k-1)+*(zp[j-1]+2*l-1))*n[i-1][2*k-1];
k=1;
l=1;
Label00: if(inpn[k-1][l-1]<0)
{
k=k+1;
if(k<=4)
{
l=1;
goto Label00;
}
else
{
if(light>0)
{
flag+=10;
goto end;
}
else
{ num=0;
light++;
//swap graph elements i and j
temp=zp[i-1];
zp[i-1]=zp[j-1];
zp[j-1]=temp;
n[i-1][0]=-v[j-1][0];
n[i-1][1]=-v[j-1][1];
n[i-1][2]=xp[j-1][4];
n[i-1][3]=xp[j-1][5];
n[i-1][4]= v[j-1][0];
n[i-1][5]= v[j-1][1];
n[i-1][6]=-xp[j-1][4];
n[i-1][7]=-xp[j-1][5];
num=1;
goto Label01;
}
}