解析几何,利用角度之间的关系推出公式。
#include <cstdio>
#include <algorithm>
#include <utility>
#include <cmath>
using namespace std;
const double eps = 1e-3;
const int maxn = 550;
int n;
double bx, by, cx[maxn], cy[maxn], r[maxn];
typedef struct Range{
double lf, rt;
bool operator<(const Range &b)const {
return lf < b.lf;
}
}Range;
Range rang[maxn];
int sgn(double x) { return (x < -eps) ? -1 : (x > eps);}
int main()
{
while (~scanf("%d", &n) && n) {
scanf("%lf%lf", &bx, &by);
for (int i = 0; i < n; i++) {
scanf("%lf%lf%lf", &cx[i], &cy[i], &r[i]);
double d = sqrt((bx-cx[i])*(bx-cx[i]) + (by-cy[i])*(by-cy[i]));
double a = asin(r[i]/d), b = asin((bx-cx[i])/d);
double ang1 = a+b, ang2 = b-a;
rang[i].lf = bx-by*tan(ang1);
rang[i].rt = bx-by*tan(ang2);
}
sort(rang, rang+n);
for (int i = 0, j; i < n;) {
for (j = i+1; j < n; j++) {
if (sgn(rang[j].lf - rang[i].rt) > 0)
break;
else
rang[i].rt = max(rang[i].rt, rang[j].rt);
}
printf("%.2lf %.2lf\n", rang[i].lf, rang[i].rt);
i = j;
}
printf("\n");
}
return 0;
}