test3.cpp
上传用户:vipking888
上传日期:2015-02-03
资源大小:93k
文件大小:8k
源码类别:

3G开发

开发平台:

Visual C++

  1. #include<iostream>
  2. #include<cmath>
  3. #include<time.h>
  4. #include<stdlib.h>
  5. using namespace std;
  6. const double pi=3.1415926;
  7. //struct node{double x,y,wucha;bool ok;}a[111],a1[111];
  8. struct node{double x,y,wucha,w;int ok;}a[111],a1[111];
  9. struct node2{int n1,n2,n3;double w;}d[3333],o;
  10. double e[111][111],totw;
  11. bool c[111][111];
  12. int i,j,n,m,s,p,q,k,l,v,chang,kuan;
  13. double totwc,wucha;
  14. double (*r)[2];//矩阵指针
  15. double maxvalue(double x,double y);
  16. double minvalue(double x,double y);
  17. double maxvalue(double x,double y)
  18. {
  19. return (x>y?x:y);
  20. }
  21. double minvalue(double x,double y)
  22. {
  23. return (x>y?y:x);
  24. }
  25. int jiefangcheng(int i0,int i1,int i2,int i3){
  26.   double d1,d2,d3,y1,y2,x1,x2,t1,t2,t3,t4,o,x,y,a11,a12,a21,a22,zhi,p,q,b11,b12,b21,b22;
  27.   if(e[i1][i2]+e[i2][i0]<e[i1][i0])return 0;
  28.   p=2*(a[i2].x-a[i1].x);
  29.   q=2*(a[i2].y-a[i1].y);
  30.   o=e[i0][i1]*e[i0][i1]-e[i0][i2]*e[i0][i2]-a[i1].x*a[i1].x+a[i2].x*a[i2].x-a[i1].y*a[i1].y+a[i2].y*a[i2].y;
  31.   if(abs(p)<1e-6){
  32.     y2=y1=o/q;
  33.     t1=1;
  34.     t2=-2*a[i1].x;
  35.     t3=a[i1].x*a[i1].x-e[i0][i1]*e[i0][i1]+(y1-a[i1].y)*(y1-a[i1].y);
  36.     if(t2*t2-4*t1*t3<-1e-6)return 0;
  37.     x1=(-t2+sqrt(t2*t2-4*t1*t3))/2/t1;
  38.     x2=(-t2-sqrt(t2*t2-4*t1*t3))/2/t1;
  39.     }else{
  40.     t1=q*q/p/p+1;
  41.     t2=-2*o*q/p/p+2*a[i1].x*q/p-2*a[i1].y;
  42.     t3=o*o/p/p+a[i1].x*a[i1].x-2*a[i1].x*o/p+a[i1].y*a[i1].y-e[i0][i1]*e[i0][i1];
  43.     if(t2*t2-4*t1*t3<-1e-6)return 0;
  44.     y1=(-t2+sqrt(t2*t2-4*t1*t3))/2/t1;
  45.     y2=(-t2-sqrt(t2*t2-4*t1*t3))/2/t1;
  46.     x1=(o-q*y1)/p;
  47.     x2=(o-q*y2)/p;
  48.     }
  49.   d1=(x1-a[i3].x)*(x1-a[i3].x)+(y1-a[i3].y)*(y1-a[i3].y);
  50.   d2=(x2-a[i3].x)*(x2-a[i3].x)+(y2-a[i3].y)*(y2-a[i3].y);
  51.   d3=e[i0][i3]*e[i0][i3];
  52.   if(abs(d1-d3)<abs(d2-d3)){x=x1;y=y1;}else{x=x2;y=y2;}
  53.   a1[i0].x=x;
  54.   a1[i0].y=y;
  55.   a1[i0].ok=1;
  56.   return 1;
  57. }
  58. int jiefangcheng1(int i0,int i1,int i2,int i3,double w){
  59.   double d1,d2,d3,y1,y2,x1,x2,t1,t2,t3,t4,o,x,y,a11,a12,a21,a22,zhi,p,q,b11,b12,b21,b22;
  60.   if(e[i1][i2]+e[i2][i0]<e[i1][i0])return 0;
  61.   p=2*(a[i2].x-a[i1].x);
  62.   q=2*(a[i2].y-a[i1].y);
  63.   o=e[i0][i1]*e[i0][i1]-e[i0][i2]*e[i0][i2]-a[i1].x*a[i1].x+a[i2].x*a[i2].x-a[i1].y*a[i1].y+a[i2].y*a[i2].y;
  64.   if(abs(p)<1e-6){
  65.     y2=y1=o/q;
  66.     t1=1;
  67.     t2=-2*a[i1].x;
  68.     t3=a[i1].x*a[i1].x-e[i0][i1]*e[i0][i1]+(y1-a[i1].y)*(y1-a[i1].y);
  69.     if(t2*t2-4*t1*t3<-1e-6)return 0;
  70.     x1=(-t2+sqrt(t2*t2-4*t1*t3))/2/t1;
  71.     x2=(-t2-sqrt(t2*t2-4*t1*t3))/2/t1;
  72.     }else{
  73.     t1=q*q/p/p+1;
  74.     t2=-2*o*q/p/p+2*a[i1].x*q/p-2*a[i1].y;
  75.     t3=o*o/p/p+a[i1].x*a[i1].x-2*a[i1].x*o/p+a[i1].y*a[i1].y-e[i0][i1]*e[i0][i1];
  76.     if(t2*t2-4*t1*t3<-1e-6)return 0;
  77.     y1=(-t2+sqrt(t2*t2-4*t1*t3))/2/t1;
  78.     y2=(-t2-sqrt(t2*t2-4*t1*t3))/2/t1;
  79.     x1=(o-q*y1)/p;
  80.     x2=(o-q*y2)/p;
  81.     }
  82.   d1=(x1-a[i3].x)*(x1-a[i3].x)+(y1-a[i3].y)*(y1-a[i3].y);
  83.   d2=(x2-a[i3].x)*(x2-a[i3].x)+(y2-a[i3].y)*(y2-a[i3].y);
  84.   d3=e[i0][i3]*e[i0][i3];
  85.   if(abs(d1-d3)<abs(d2-d3)){x=x1;y=y1;}else{x=x2;y=y2;}
  86.   a1[i0].x+=w*x;
  87.   a1[i0].y+=w*y;
  88.   a1[i0].w+=w;
  89.   ++a1[i0].ok;
  90.   return 1;
  91. }
  92. void calw(){
  93.   int i,j,k;
  94.   double p,a1,a2,a3,dis1,dis2,dis3,mn,mx;
  95.   for(i=1;i<=m-2;i++)
  96.     for(j=i+1;j<=m-1;j++)
  97.       for(k=j+1;k<=m;k++){
  98.         ++l;
  99.         d[l].n1=i;d[l].n2=j;d[l].n3=k;
  100.         dis1=e[i][j];
  101.         dis2=e[i][k];
  102.         dis3=e[j][k];
  103.         a1=acos((dis1*dis1-dis2*dis2-dis3*dis3)/2/dis2/dis3);
  104.         a2=acos((dis2*dis2-dis1*dis1-dis3*dis3)/2/dis1/dis3);
  105.         a3=acos((dis3*dis3-dis2*dis2-dis1*dis1)/2/dis2/dis1);
  106.         mn=minvalue(minvalue(a1,a2),a3);
  107.         mx=maxvalue(maxvalue(a1,a2),a3);
  108.         d[l].w=1-(mx-mn)/pi;
  109.         }
  110.         
  111.   for(i=1;i<=l;i++)
  112.     for(j=i+1;j<=l;j++)if(d[i].w<d[j].w){o=d[i];d[i]=d[j];d[j]=o;}
  113.   if(20>l)v=l;else v=20;
  114.   totw=0;
  115.   for(i=1;i<=v;i++){
  116.     if(d[i].w>1e-3){
  117.       totw+=d[i].w;
  118.     }else 
  119.     --v;
  120.     }
  121. }
  122. void cal(int k){
  123.   int i,j,p,b[5],tmp=0;
  124.   bool c[111],hasans=0;
  125.   while(1){
  126.     ++tmp;
  127.     memset(c,0,sizeof(c));
  128.     for(i=1;i<=3;i++){
  129.       while(1){p=rand()%m+1;if(c[p]==0){c[p]=1;break;}}    
  130.       b[i]=p;
  131.       }
  132.     for(i=1;i<=3;i++)for(j=i+1;j<=3;j++)if(e[b[i]][k]<e[b[j]][k]){p=b[i];b[i]=b[j];b[j]=p;}
  133.     if(jiefangcheng(k,b[1],b[2],b[3])){hasans=1;break;}else 
  134.     if(jiefangcheng(k,b[1],b[3],b[2])){hasans=1;break;}else 
  135.     if(jiefangcheng(k,b[2],b[3],b[1])){hasans=1;break;}
  136.     if(tmp>10)break; 
  137.   }
  138.   
  139. }
  140. void cal1(int k){
  141.   int i,j,l,tmp;
  142.   for(i=1;i<=v;i++){
  143.     if(e[d[i].n1][k]<e[d[i].n2][k])swap(d[i].n1,d[i].n2);
  144.     if(e[d[i].n2][k]<e[d[i].n3][k])swap(d[i].n2,d[i].n3);
  145.     if(e[d[i].n1][k]<e[d[i].n2][k])swap(d[i].n1,d[i].n2);
  146.     //n1,n2,n3按与k的距离从大到小排序 
  147.     
  148.     if(jiefangcheng1(k,d[i].n1,d[i].n2,d[i].n3,d[i].w));else 
  149.     if(jiefangcheng1(k,d[i].n1,d[i].n3,d[i].n2,d[i].w));else 
  150.     if(jiefangcheng1(k,d[i].n2,d[i].n3,d[i].n1,d[i].w));
  151.     
  152. //    jiefangcheng(k,d[i].n1,d[i].n2,d[i].n3);
  153.     }
  154.   
  155.    a1[k].x=a1[k].x/a1[k].w;
  156.    a1[k].y=a1[k].y/a1[k].w;
  157.    //a1[k].x=a1[k].x/v;
  158.    //a1[k].y=a1[k].y/v;
  159.   //解得未知点为a1[k]   
  160. }
  161. //极大释然法
  162. void lateration()
  163. {
  164. }
  165. //初始矩阵
  166. void matrix_init()
  167. {
  168. //分配一个指针数组,其首地址保存在pMatrix中
  169.     double **pMatrix = new double*[m];
  170.     //为指针数组的每个元素分配一个数组
  171.     for (int i = 0; i < m; i++)
  172.     {
  173. pMatrix[i] = new double[2];
  174. }
  175.  for (int k = 0; k < m; k++)
  176.     {
  177. *(*(pMatrix+0))=2*(a[k].x -a[m].x);
  178. *(*(pMatrix+1))=2*(a[k].y -a[m].y);
  179. printf("%fn",*(*(pMatrix+1)));
  180. pMatrix++;
  181.     }
  182.     //以上是分配,以下是释放
  183.     for (int j = 0; j < m; j++)
  184.         delete [2] pMatrix[j];
  185.     delete [m] pMatrix;
  186. /*
  187. double (*p)[2]=new double[m][2]; 
  188.   //r=p;
  189.   for(i=0;i<m;i++)
  190.   {
  191.   }
  192.   for(i=0;i<m;i++)
  193.   {
  194. //   printf("%f,%fn",*(*(r+i)),*(*(r+i)+1));
  195.   }
  196.   delete[] p;
  197.  */
  198. }
  199.         
  200. /// 矩阵的转置
  201.         void MatrixInver(double (*a)[2], double (*b)[2])
  202.         {
  203.             for (int i = 0; i < m; i++)
  204. {
  205. *(*(b+i)) = *(*(a+i));
  206. *(*(b+i)+1) = *(*(a+i)+1);
  207. }
  208.         }
  209. int main(){
  210.   
  211.   srand(time(0));
  212.   printf("请输入总节点个数,基站个数,误差值:");
  213.   cin>>n>>m>>wucha;//m为基站个数 
  214.   printf("请输入网络区域的长、宽:");
  215.   cin>>chang>>kuan;
  216.   ++chang;++kuan;
  217.   
  218. //m=10;wucha=0.3;
  219.   for(i=1;i<=n;i++){
  220.     while(1){
  221.       p=rand()%chang;
  222.       q=rand()%kuan;
  223.       if(c[p][q]==0){
  224.         c[p][q]=1;
  225.         break;
  226.         }
  227.       }
  228.     a[i].x=p;
  229.     a[i].y=q;  
  230.     }
  231.     
  232. //a[1].x=41;a[1].y=85;a[2].x=72;a[2].y=38;a[3].x=80;a[3].y=69;a[4].x=96;a[4].y=22;
  233.   for(i=1;i<=n;i++)
  234.     for(j=1;j<=n;j++)
  235.       e[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))+wucha*10;
  236.   
  237.    
  238.   for(i=m+1;i<=n;i++)cal(i);
  239.   
  240.   for(i=m+1;i<=n;i++)if(a1[i].ok)a1[i].wucha=sqrt((a1[i].x-a[i].x)*(a1[i].x-a[i].x)+(a1[i].y-a[i].y)*(a1[i].y-a[i].y));
  241.   for(i=m+1;i<=n;i++)if(a1[i].ok)totwc+=a1[i].wucha;
  242.   
  243.   freopen("output1.txt","w",stdout);
  244.   printf("总误差:      "); 
  245.   cout<<totwc<<endl;
  246.   for(i=1;i<=m;i++)
  247.   a1[i].ok=1;
  248.  // for(i=m+1;i<=n;i++)if(a1[i].ok){
  249.   for(i=1;i<=n;i++)if(a1[i].ok){
  250.     //printf("第%d个点的原始坐标:          ",i);
  251.     cout<<a[i].x<<' '<<a[i].y<<' '<<a1[i].x<<' '<<a1[i].y<<' '<<a1[i].wucha<<endl;
  252.     //printf("算出的第%d个点的坐标和误差:  ",i);
  253.     //cout<<a1[i].x<<' '<<a1[i].y<<' '<<a1[i].wucha<<endl;
  254.     }else cout<<"Cannot Find."<<endl;
  255.  
  256. for(i=0;i<=110;i++)
  257. {
  258. a1[i].x=0;
  259. a1[i].y=0;
  260. a1[i].wucha=0;
  261. }
  262. totwc=0;
  263.  matrix_init();
  264.  freopen("output3.txt","w",stdout);
  265.  calw();
  266.  for(i=m+1;i<=n;i++)cal1(i);
  267.   for(i=m+1;i<=n;i++)if(a1[i].ok>0)a1[i].wucha=sqrt((a1[i].x-a[i].x)*(a1[i].x-a[i].x)+(a1[i].y-a[i].y)*(a1[i].y-a[i].y));
  268.   for(i=m+1;i<=n;i++)if(a1[i].ok>0)totwc+=a1[i].wucha;
  269.   
  270.   printf("总误差:      "); 
  271.   cout<<totwc<<endl;
  272.    for(i=1;i<=m;i++)
  273.   a1[i].ok=1;
  274.  // for(i=m+1;i<=n;i++)if(a1[i].ok){
  275.    for(i=1;i<=n;i++)if(a1[i].ok){
  276.     //printf("第%d个点的原始坐标:          ",i);
  277.     cout<<a[i].x<<' '<<a[i].y<<' '<<a1[i].x<<' '<<a1[i].y<<' '<<a1[i].wucha<<endl;
  278.     //printf("算出的第%d个点的坐标和误差:  ",i);
  279.     //cout<<a1[i].x<<' '<<a1[i].y<<' '<<a1[i].wucha<<endl;
  280.     }else cout<<"Cannot Find."<<endl;
  281.   
  282.   return(0); 
  283. }