解析几何,利用直角三角形asin函数求出角来,然后根据y就可以算出x了
最后把点排序一下,入点+1,出点-1,由0变为1则是入点,由1变为0时则是出点
#include<stdio.h> #include<math.h> #include<algorithm> #include<string.h> using namespace std; struct Circle{ double x,y,r; }; struct Node{ double x; int flag; }; int n; Circle c[505]; Node l[1005]; double x,y; double dist(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int cmp(Node a,Node b){ return a.x<b.x; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE while(scanf("%d",&n),n){ scanf("%lf%lf",&x,&y); for(int i=0;i<n;i++) scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r); int k=0; for(int i=0;i<n;i++) { double d=dist(x,y,c[i].x,c[i].y); double a,b; a=asin(c[i].r/d); b=asin((x-c[i].x)/d); l[i*2].x=x-y*tan(a+b); l[i*2].flag=1; l[i*2+1].x=x-y*tan(b-a); l[i*2+1].flag=-1; } sort(l,l+2*n,cmp); int s=0; for(int i=0;i<2*n;i++){ if(s==0 && l[i].flag==1) printf("%.2f ",l[i].x); if(s==1 && l[i].flag==-1) printf("%.2f\n",l[i].x); s+=l[i].flag; } printf("\n"); } return 0; }
时间: 2024-10-08 02:26:05