第三章所用程序【PTS-DETEC 检测程序】

来源:互联网 发布:html表白源码下载 编辑:程序博客网 时间:2024/06/02 16:17
 
#include "queue.h"#include <windows.h>void  PTS_detec(long double x, long double y, long double rx, long double ry,vector<int> self_intersect);bool intersect(QueueElementType a, self_str b);bool intersect(QueueElementType a, square_A b);bool inter(QueueElementType a, self_str b) ;long double area_nonself(QueueElementType a[]);long double distanse_dx(QueueElementType a,vector<int>s);long double distanse_dy(QueueElementType a,vector<int>s);int n_r;int n_time;long double s_all=0;long double sum=0;SeqQueue Q;SeqQueue *p1;long double rs,r0;self_str self[NS];square_A test[NT];extern vector <struct QueueElementType> detector;void  PTS_detec(long double x, long double y, long double rx, long double ry,vector<int> self_intersect)//  vector<int> self_intersect  {QueueElementType w0;w0.x=x;w0.y=y;w0.rx=rx;w0.ry=ry;w0.self_intersect=self_intersect;if(rx<2*r0&&ry<2*r0)return ;else{sum+=4;int flag1=0;      int flag2=0;vector<int> self_1;vector<int> self_2;vector<int> self_3;vector<int> self_4;QueueElementType w1,w2,w3,w4;bool s1,s2,s3,s4;                   //             Judge whether the candidate intersects with the self sets1=s2=s3=s4=false;bool in_s1,in_s2,in_s3,in_s4;       //             Judge whether the candidate is in the inter of one self individualin_s1=in_s2=in_s3=in_s4=false;int time=0;int inter_time=0;for(int k2=0;k2<=1;k2++)for(int k1=1;k1<=2;k1++){      time++;QueueElementType w;if(time>=3)                         //             Clockwise sequence             w.x=x+pow(-1.0,k1+1)*rx/2;elsew.x=x+pow(-1.0,k1)*rx/2;w.y=y+pow(-1.0,k2)*ry/2;w.rx=rx/2;w.ry=ry/2;flag1=0;     flag2=0;for(unsigned int i=0;i<self_intersect.size();i++){if(intersect(w,self[self_intersect.at(i)])){flag1=1;switch(time){case 1:  self_1.push_back(self_intersect.at(i));break;case 2:  self_2.push_back(self_intersect.at(i));break;case 3:  self_3.push_back(self_intersect.at(i));break;case 4:  self_4.push_back(self_intersect.at(i));break;}if(inter(w,self[i])){switch(time){case 1:  self_1.clear(); in_s1=true; break;case 2:  self_2.clear(); in_s2=true; break;case 3:  self_3.clear(); in_s3=true; break;case 4:  self_4.clear(); in_s4=true;  break;}flag2=1;break;}}}if(flag1==0){switch(time){case 1: w1=w;break;case 2: w2=w;break;case 3: w3=w;break;case 4: w4=w;break;}                  }else{ inter_time++;                                 //  The number of the candidates that intersect with the self set    switch(time){  case 1: s1=true;break;  case 2: s2=true;break;  case 3: s3=true;break;  case 4: s4=true;break;}                                 if(0==flag2)      {switch(time){case 1: w.self_intersect=self_1; w1=w;break;case 2: w.self_intersect=self_2; w2=w;break;case 3: w.self_intersect=self_3; w3=w;break;case 4: w.self_intersect=self_4; w4=w;break;}//   EnQueue(p1,w);}}}long double dx,dy;long double t_dx,t_dy;if(inter_time==0){detector.push_back(w0);s_all+=4*w0.rx*w0.ry;return;}switch(inter_time)  {case 1:if(s1){dy=distanse_dy(w4,self_1);dx=distanse_dx(w2,self_1);w1.y=w1.y+dy/2;w1.ry=w1.ry-dy/2;w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w3.y=w3.y+w3.ry;w3.ry=2*w3.ry;w3.x=w2.x-dx/2;w3.rx=w3.rx+dx/2;w4.y=w4.y+dy/2;w4.ry=w4.ry+dy/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w1);}      elseif (s2){dy=distanse_dy(w3,self_2);dx=distanse_dx(w1,self_2);w2.y=w2.y+dy/2;w2.ry=w2.ry-dy/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;w3.y=w3.y+dy/2;w3.ry=w3.ry+dy/2;w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;w4.y=w4.y+w4.ry;w4.ry=2*w4.ry;w4.x=w4.x+dx/2;w4.rx=w4.rx+dx/2;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w2);}else if (s3){dy=distanse_dy(w2,self_3);dx=distanse_dx(w4,self_3);w4.y=w4.y+w4.ry;w4.ry=2*w4.ry;w4.x=w4.x+dx/2;w4.rx=w4.rx+dx/2;w2.y=w2.y-dy/2;w2.ry=w2.ry+dy/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;w3.y=w3.y-dy/2;w3.ry=w3.ry-dy/2;w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;detector.push_back(w2);s_all+=4*w2.rx*w2.ry;detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w3);}else if (s4){dy=distanse_dy(w1,self_4);dx=distanse_dx(w3,self_4);w1.y=w1.y-dy/2;w1.ry=w1.ry+dy/2;w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w3.y=w3.y+w3.ry;w3.ry=2*w3.ry;w3.x=w3.x-dx/2;w3.rx=w3.rx+dx/2;w4.y=w4.y-dy/2;w4.ry=w4.ry-dy/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;detector.push_back(w1);s_all+=4*w1.rx*w1.ry;EnQueue(p1,w4);}break;case 2:if(s2&&s3){dx=distanse_dx(w1,self_2);t_dx=distanse_dx(w4,self_3);if(t_dx<dx)dx=t_dx;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;w4.x=w4.x+dx/2;w4.y=w4.y+w4.ry;w4.rx=w4.rx+dx/2;w4.ry=w4.ry*2;detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w2);EnQueue(p1,w3);}elseif(s3&&s4){dy=distanse_dy(w2,self_3);t_dy=distanse_dy(w1,self_4);if(t_dy<dy)dy=t_dy;w2.x=w2.x-w2.rx;w2.y=w2.y-dy/2;w2.rx=2*w2.rx;w2.ry=w2.ry+dy/2;w3.y=w3.y-dy/2;w3.ry=w3.ry-dy/2;w4.y=w4.y-dy/2;w4.ry=w4.ry-dy/2;detector.push_back(w2);s_all+=4*w2.rx*w2.ry;EnQueue(p1,w3);EnQueue(p1,w4);}else     if(s1&&s4){dx=distanse_dx(w2,self_1);t_dx=distanse_dx(w3,self_4);if(t_dx<dx)dx=t_dx;w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;w3.x=w3.x-dx/2;w3.y=w3.y+w3.ry;w3.rx=w3.rx+dx/2;w3.ry=w3.ry*2;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;EnQueue(p1,w1);EnQueue(p1,w4);}elseif(s1&&s2){dy=distanse_dy(w3,self_2);t_dy=distanse_dy(w4,self_1);if(t_dy<dy)dy=t_dy;w3.x=w3.x-w3.rx;w3.y=w3.y+dy/2;w3.rx=2*w3.rx;w3.ry=w3.ry+dy/2;w1.y=w1.y+dy/2;w1.ry=w1.ry-dy/2;w2.y=w2.y+dy/2;w2.ry=w2.ry-dy/2;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;EnQueue(p1,w1);EnQueue(p1,w2);}elseif(s1&&s3){dx=distanse_dx(w2,self_1);w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w2.x=w2.x-dx/2;w2.rx=w2.rx+dx/2;dx=distanse_dx(w4,self_3);w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;w4.x=w4.x+dx/2;w4.rx=w4.rx+dx/2;detector.push_back(w2);s_all+=4*w2.rx*w2.ry;detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w1);EnQueue(p1,w3);}elseif(s2&&s4){dx=distanse_dx(w1,self_2);w1.x=w1.x+dx/2;w1.rx=w1.rx+dx/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;dx=distanse_dx(w3,self_4);w3.x=w3.x-dx/2;w3.rx=w3.rx+dx/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;detector.push_back(w1);s_all+=4*w1.rx*w1.ry;detector.push_back(w3);s_all+=4*w3.rx*w3.ry;EnQueue(p1,w2);EnQueue(p1,w4);}break;case 3:if(!s1){long double s1_x,s1_y,s2_x,s2_y;dx=distanse_dx(w1,self_2);s1_x=dx;dy=distanse_dy(w1,self_4);s1_y=dy;if(dy!=0&&dx!=0){QueueElementType e;QueueElementType w0=w1;e.x=w3.x-w3.rx+dx/2;e.y=w3.y;e.rx=dx/2;e.ry=w3.ry;for(unsigned int w33=0;w33<w3.self_intersect.size();w33++)if(intersect(e,self[w3.self_intersect.at(w33)]))e.self_intersect.push_back(w3.self_intersect.at(w33));w0.x=w0.x+dx/2;w0.rx=w0.rx+dx/2;t_dy=distanse_dy(w0,e.self_intersect);            if(t_dy<dy)dy=t_dy;s2_y=dy;QueueElementType e0;w0=w1;e0.x=w3.x;e0.y=w3.y+w3.ry-s1_y/2;e0.rx=w3.rx;e0.ry=s1_y/2;for(unsigned int w33=0;w33<w3.self_intersect.size();w33++)if(intersect(e0,self[w3.self_intersect.at(w33)]))e0.self_intersect.push_back(w3.self_intersect.at(w33));w0.y=w0.y-s1_y/2;w0.ry=w0.ry+s1_y/2;t_dx=distanse_dx(w1,e0.self_intersect); if(t_dx<dx)dx=t_dx;s2_x=dx;if((w1.rx+s1_x/2)*(w1.ry+s2_y/2)>(w1.ry+s1_y/2)*(w1.rx+s2_x/2)){dx=s1_x;dy=s2_y;}else{dx=s2_x;dy=s1_y;}w1.x=w1.x+dx/2;w1.rx=w1.rx+dx/2;w1.y=w1.y-dy/2;w1.ry=w1.ry+dy/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;w4.x=w4.x+dx/2;w4.y=w4.y-dy/2;w4.rx=w4.rx+dx/2;w4.ry=w4.ry-dy/2;}elseif(dx==0){w1.y=w1.y-dy/2;w1.ry=w1.ry+dy/2;w4.y=w4.y-dy/2;w4.ry=w4.ry-dy/2;}else if(dy==0){w1.x=w1.x+dx/2;w1.rx=w1.rx+dx/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;}detector.push_back(w1);s_all+=4*w1.rx*w1.ry;EnQueue(p1,w2);EnQueue(p1,w3);EnQueue(p1,w4);}elseif(!s2){long double s1_x,s1_y,s2_x,s2_y;dx=distanse_dx(w2,self_1);s1_x=dx;              dy=distanse_dy(w2,self_3);s1_y=dy;if(dy!=0&&dx!=0){QueueElementType e;QueueElementType w0=w2;e.x=w4.x+w4.rx-dx/2;e.y=w4.y;e.rx=dx/2;e.ry=w4.ry;for(unsigned int w33=0;w33<w4.self_intersect.size();w33++)if(intersect(e,self[w4.self_intersect.at(w33)]))e.self_intersect.push_back(w4.self_intersect.at(w33));w0.x=w0.x-dx/2;w0.rx=w0.rx+dx/2;t_dy=distanse_dy(w0,e.self_intersect);if(t_dy<dy)dy=t_dy;s2_y=dy;w0=w2;e.x=w4.x;e.y=w4.y+w4.ry-s1_y/2;e.rx=w4.rx;e.ry=s1_y/2;e.self_intersect.clear();for(unsigned int w33=0;w33<w4.self_intersect.size();w33++)if(intersect(e,self[w4.self_intersect.at(w33)]))e.self_intersect.push_back(w4.self_intersect.at(w33));w0.y=w0.y-s1_y/2;w0.ry=w0.ry+s1_y/2;t_dx=distanse_dx(w0,e.self_intersect);if(t_dx<dx)dx=t_dx;s2_x=dx;if((w2.rx+s1_x/2)*(w2.ry+s2_y/2)>(w2.ry+s1_y/2)*(w2.rx+s2_x/2)){dx=s1_x;dy=s2_y;}else{dx=s2_x;dy=s1_y;}w2.x=w2.x-dx/2;w2.rx=w2.rx+dx/2;w2.y=w2.y-dy/2;w2.ry=w2.ry+dy/2;w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w3.x=w3.x-dx/2;w3.rx=w3.rx+dx/2;w3.y=w3.y-dy/2;w3.ry=w3.ry-dy/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;}elseif(dx==0){w2.y=w2.y-dy/2;w2.ry=w2.ry+dy/2;w3.y=w3.y-dy/2;w3.ry=w3.ry-dy/2;}else if(dy==0){w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w2.x=w2.x-dx/2;w2.rx=w2.rx+dx/2;}detector.push_back(w2);s_all+=4*w2.rx*w2.ry;EnQueue(p1,w1);EnQueue(p1,w3);EnQueue(p1,w4);}elseif(!s3){long double s1_x,s1_y,s2_x,s2_y;dx=distanse_dx(w3,self_4);s1_x=dx;                         dy=distanse_dy(w3,self_2);s1_y=dy;         if(dy!=0&&dx!=0){QueueElementType e;QueueElementType w0=w3;e.x=w1.x+w1.rx-dx/2;e.y=w1.y;e.rx=dx/2;e.ry=w1.ry;for(unsigned int w33=0;w33<w1.self_intersect.size();w33++)if(intersect(e,self[w1.self_intersect.at(w33)]))e.self_intersect.push_back(w1.self_intersect.at(w33));w0.x=w0.x-dx/2;w0.rx=w0.rx+dx/2;t_dy=distanse_dy(w3,e.self_intersect);if(t_dy<dy)dy=t_dy;s2_y=dy;w0=w3;e.x=w1.x;e.y=w1.y-w1.ry+s1_y/2;e.rx=w1.x;e.ry=s1_y/2;e.self_intersect.clear();for(unsigned int w33=0;w33<w1.self_intersect.size();w33++)if(intersect(e,self[w1.self_intersect.at(w33)]))e.self_intersect.push_back(w1.self_intersect.at(w33));w0.y=w0.y+s1_y/2;w0.ry=w0.ry+s1_y/2;t_dx=distanse_dx(w0,e.self_intersect);if(t_dx<dx)dx=t_dx;s2_x=dx;if((w3.rx+s1_x/2)*(w3.ry+s2_y/2)>(w3.ry+s1_y/2)*(w3.rx+s2_x/2)){dx=s1_x;dy=s2_y;}else{dx=s2_x;dy=s1_y;}w3.x=w3.x-dx/2;w3.rx=w3.rx+dx/2;w3.y=w3.y+dy/2;w3.ry=w3.ry+dy/2;w1.x=w1.x-dx/2;w1.rx=w1.rx-dx/2;w2.x=w2.x-dx/2;w2.rx=w2.rx+dx/2;w2.y=w2.y+dy/2;w2.ry=w2.ry-dy/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;}elseif(dx==0){w2.y=w2.y+dy/2;w2.ry=w2.ry-dy/2;w3.y=w3.y+dy/2;w3.ry=w3.ry+dy/2;}else if(dy==0){w3.x=w3.x-dx/2;w3.rx=w3.rx+dx/2;w4.x=w4.x-dx/2;w4.rx=w4.rx-dx/2;}detector.push_back(w3);s_all+=4*w3.rx*w3.ry;EnQueue(p1,w1);EnQueue(p1,w2);EnQueue(p1,w4);}elseif(!s4){long double s1_x,s1_y,s2_x,s2_y;dx=distanse_dx(w4,self_3);s1_x=dx;dy=distanse_dy(w4,self_1);s1_y=dy;if(dy!=0&&dx!=0){QueueElementType e;QueueElementType w0=w4;e.x=w2.x-w2.rx+dx/2;e.y=w2.y;e.rx=dx/2;e.ry=w2.ry;for(unsigned int w33=0;w33<w2.self_intersect.size();w33++)if(intersect(e,self[w2.self_intersect.at(w33)]))e.self_intersect.push_back(w2.self_intersect.at(w33));w0.x=w0.x+dx/2;w0.rx=w0.rx+dx/2;t_dy=distanse_dy(w0,e.self_intersect);if(t_dy<dy)dy=t_dy;s2_y=dy;w0=w4;e.x=w2.x;e.y=w2.y-w2.ry+s1_y/2;e.rx=w2.rx;e.ry=s1_y/2;e.self_intersect.clear();for(unsigned int w33=0;w33<w2.self_intersect.size();w33++)if(intersect(e,self[w2.self_intersect.at(w33)]))e.self_intersect.push_back(w2.self_intersect.at(w33));w0.y=w0.y+s1_y/2;w0.ry=w0.ry+s1_y/2;t_dx=distanse_dx(w0,e.self_intersect);if(t_dx<dx)dx=t_dx;s2_x=dx;if((w4.rx+s1_x/2)*(w4.ry+s2_y/2)>(w4.ry+s1_y/2)*(w4.rx+s2_x/2)){dx=s1_x;dy=s2_y;}else{dx=s2_x;dy=s1_y;}w4.x=w4.x+dx/2;w4.rx=w4.rx+dx/2;w4.y=w4.y+dy/2;w4.ry=w4.ry+dy/2;w1.x=w1.x+dx/2;w1.rx=w1.rx+dx/2;w1.y=w1.y+dy/2;w1.ry=w1.ry-dy/2;w2.x=w2.x+dx/2;w2.rx=w2.rx-dx/2;w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;}elseif(dx==0){w1.y=w1.y+dy/2;w1.ry=w1.ry-dy/2;w4.y=w4.y+dy/2;w4.ry=w4.ry+dy/2;}else if(dy==0){w3.x=w3.x+dx/2;w3.rx=w3.rx-dx/2;w4.x=w4.x+dx/2;w4.rx=w4.rx+dx/2;}detector.push_back(w4);s_all+=4*w4.rx*w4.ry;EnQueue(p1,w1);EnQueue(p1,w2);EnQueue(p1,w3);}break;case 4:       if(!in_s1)  EnQueue(p1,w1);if(!in_s2)EnQueue(p1,w2);if(!in_s3)EnQueue(p1,w3);if(!in_s4)EnQueue(p1,w4);break;}}  }long double distanse_dx(QueueElementType a,vector<int>s)      //{long double dx=1;long double t_dx;long double r=0;if(s.size()==0)         return dx;  r=self[s.at(0)].r;for(unsigned int i=0;i<s.size();i++){t_dx=a.x-self[s.at(i)].x;if(t_dx<0)t_dx=-t_dx;if(t_dx<dx)dx=t_dx;}if(dx-a.rx-r<0)return 0;else return dx-a.rx-r;}long double distanse_dy(QueueElementType a,vector<int>s){long double dy=1;long double t_dy;long double r=0;if(s.size()==0)return dy;  r=self[s.at(0)].r;for(unsigned int i=0;i<s.size();i++){t_dy=a.y-self[s.at(i)].y;if(t_dy<0)t_dy=-t_dy;if(t_dy<dy)dy=t_dy;}if(dy-a.ry-r<0)return 0;else return dy-a.ry-r;}bool intersect(QueueElementType a, self_str b){               if((a.x-a.rx)>=(b.x+b.r)||(a.x+a.rx)<=(b.x-b.r))  return false;  else  if((a.y-a.ry)>(b.y+b.r)||(a.y+a.ry)<(b.y-b.r))  return false;  else  if((b.x<a.x+a.rx)&&(b.x>a.x-a.rx))  { if(fabs(b.y-a.y)<=b.r+a.ry)  return true;  else return false;   }  else  if((b.y<a.y+a.ry)&&(b.y>a.y-a.ry))  { if(fabs(b.x-a.x)<=b.r+a.rx)  return true;  else return false;  }  else  {     if(b.x<a.x)    a.x=a.x-a.rx;  else    a.x=a.x+a.rx;  if(b.y<a.y)    a.y=a.y-a.ry;  else    a.y=a.y+a.ry;  if(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))>=b.r)    return false;  else    return true; }}bool intersect(QueueElementType a, square_A b){      if((a.x-a.rx)>b.x||(a.x+a.rx)<b.x)  return false;  else  if((a.y-a.ry)>b.y||(a.y+a.ry)<b.y)  return false;  else return true;}bool inter(QueueElementType a, self_str b)  //b is self data{long double d;long double r;d=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));r=a.rx>a.ry?a.rx:a.ry;if((b.r-d)>=(r*sqrt(2.0)))           return true;elsereturn false;}long double area_nonself(self_str a[]){long double x;long double y;long double r;int t=0;int   s_num=0;while(t<100000){t++;x=rand()/(double)(RAND_MAX+1);y=rand()/(double)(RAND_MAX+1);for(int i=0;i<NS;i++){r=sqrt((a[i].x-x)*(a[i].x-x)+(a[i].y-y)*(a[i].y-y));if(r<a[i].r){s_num++;break;}}}return (100000-s_num)/(double)100000;}long double _max(long double data[]){double _max = 0;for(int i=0; i<n_time; i++)if(data[i]>_max)_max = data[i];return _max;}long double _min(long double data[]){double _min = data[0];for(int i=0; i<n_time; i++)if(data[i]<_min)_min = data[i];return _min;}long double mean(long double data[]){double _mean = 0;for(int i=0; i<n_time; i++)_mean += data[i];return _mean/n_time;}long double sd(long double data[],long double mean){double sd = 0;double tmp;for(int i=0; i<n_time; i++) {tmp = data[i]-mean;sd += tmp*tmp;}return sqrt(sd/n_time);}