题解 | 【模板】点圆位置关系
【模板】点圆位置关系
https://www.nowcoder.com/practice/022706d8ca8c4bfbb4946de9762635c6?channelPut=tracker3
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
ll oljl(ll x1, ll y1, ll x2, ll y2) {
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cout << fixed << setprecision(12);
ll t;
cin >> t;
while (t--) {
ll xo, yo, r, xa, ya;
cin >> xo >> yo >> r >> xa >> ya;
ll res = oljl(xo, yo, xa, ya);
ll jl = r * r;
if (res == jl) {
cout << '2' << endl;
continue;
} else if (res < jl) {
cout << '1' << endl;
continue;
} else {
double dx = xa - xo;
double dy = ya - yo;
double d2 = res;
double sqrt_val = sqrt(d2 - jl);
// 第一个切点的横坐标
double x1 = xo + (jl * dx - r * dy * sqrt_val) / d2;
// 第二个切点的横坐标
double x2 = xo + (jl * dx + r * dy * sqrt_val) / d2;
// 对应的纵坐标
double y1 = yo + (jl * dy + r * dx * sqrt_val) / d2;
double y2 = yo + (jl * dy - r * dx * sqrt_val) / d2;
cout << "3 " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
}
}
return 0;
}