题目链接:4499. 画圆 - AcWing题库
在一个二维平面内,给定一个以 (x1,y1)(x1,y1) 为圆心,半径为 RR 的圆以及一个坐标为 (x2,y2)(x2,y2) 的点。
请你在二维平面上画一个圆,要求:
- 平面中不存在点满足既在你画的圆上,又在给定的圆外。
- 给定的点不能在你画的圆内(可以在圆上)。
- 被给定圆覆盖且不被你画的圆覆盖的区域面积应尽可能小。
请输出你画的圆的圆心坐标以及半径。
输入格式
共一行,包含 55 个整数 R,x1,y1,x2,y2R,x1,y1,x2,y2。
输出格式
三个实数 xans,yans,rxans,yans,r,其中 (xans,yans)(xans,yans) 是你画的圆的圆心坐标,rr 是你画的圆的半径。
结果保留六位小数。
数据范围
所有测试点满足 1≤R≤1051≤R≤105,|x1|,|y1|,|x2|,|y2|≤105|x1|,|y1|,|x2|,|y2|≤105。
输入样例1:
5 3 3 1 1
输出样例1:
3.767767 3.767767 3.914214
输入样例2:
10 5 5 5 15
输出样例2:
5.000000 5.000000 10.000000
代码:
#include<bits/stdc++.h> // 相似三角形
using namespace std;
#define endl "\n"
int main() {
ios::sync_with_stdio(false);
cout.tie(0);
double r, x1, x2, y1, y2;
cin >> r >> x1 >> y1 >> x2 >> y2;
if(sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) >= r) { // 在圆外
cout << fixed << setprecision(6) << x1 << " " << y1 << " " << r;
} else { // 在圆内
if(x1 == x2 && y1 == y2) { // 重合时
double rr = r / 2.0;
x2 += rr;
cout << fixed << setprecision(6) << x2 << " " << y2 << " " << rr;
}
else { // 不重合时
double len = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
double rr = len + r;
rr /= 2.0;
x2 += rr * (x1 - x2) / len; // (x1 - x2) / len = cos
y2 += rr * (y1 - y2) / len; // (y1 - y2) / len = sin
cout << fixed << setprecision(6) << x2 << " " << y2 << " " << rr;
}
}
return 0;
}