利用向量计算切点坐标。
#include <iostream>
#include<iomanip>
#include<cmath>
using namespace std;
using ll = long long;
static constexpr double EPS = 1e-8;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(10);
int q;
cin >> q;
while (q--) {
ll xo, yo, r, xa, ya;
cin >> xo >> yo >> r >> xa >> ya;
ll dx = xa - xo, dy = ya - yo;
ll len2 = dx * dx + dy * dy;
ll r2 = r * r;
if (len2 < r2) {
cout << "1\n";
} else if (len2 == r2) {
cout << "2\n";
} else {
double d = sqrt(len2);
double t = r2 / d;
double h = sqrt(r2 - t * t);
double ux = dx / d, uy = dy / d;
double vx = -uy, vy = ux;
double p1x = xo + t * ux + h * vx;
double p1y = yo + t * uy + h * vy;
double p2x = xo + t * ux - h * vx;
double p2y = yo + t * uy - h * vy;
cout << "3 " << p1x << ' ' << p1y << ' ' << p2x << ' ' << p2y << '\n';
}
}
return 0;
}

京公网安备 11010502036488号