题解 | 【模板】点圆位置关系

【模板】点圆位置关系

https://www.nowcoder.com/practice/022706d8ca8c4bfbb4946de9762635c6

利用向量计算切点坐标。

#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;
}

全部评论

相关推荐

求个付费实习岗位:这种就是吃满时代红利又没啥技术水平,只能靠压力学生彰显优越感的老登,别太在意了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务