题目大意:给出一个光源,给出一些圆,求投影区间。
如图,先可以求出角a,通过半径与PQ距离,而角b也可以求出。那么就可以求出两条切线与Y轴的夹角,分别为a+b,b-a。
之后利用角度求出各投影线段的左右顶点,排序判断即可。
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; struct Point { double x,y; }p,q; struct Node { double l,r; }line[505]; double dist(Point p1,Point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } bool cmp(Node n1,Node n2) { return n1.l<n2.l; } int main() { int n; double r; while(scanf("%d",&n)!=EOF&&n) { scanf("%lf%lf",&p.x,&p.y); for(int i=0;i<n;i++) { scanf("%lf%lf%lf",&q.x,&q.y,&r); double d=dist(p,q); double a=asin(r/d),b=asin((p.x-q.x)/d); double ang1=a+b,ang2=b-a; line[i].l=p.x-p.y*tan(ang1); line[i].r=p.x-p.y*tan(ang2); } sort(line,line+n,cmp); double L=line[0].l,R=line[0].r; for(int i=1;i<n;i++) { if(line[i].l>R) { printf("%.2f %.2f\n",L,R); L=line[i].l;R=line[i].r; } else R=max(line[i].r,R); } printf("%.2f %.2f\n\n",L,R); } return 0; }
时间: 2024-10-14 12:52:17