AcWing 4499. 画圆 (相似三角形)

该博客主要讨论如何在二维平面上根据给定的圆心、半径及一个点,来画一个新的圆,使得这个圆满足特定条件,即没有点同时位于新圆和给定圆的外部,给定点不在新圆内部,并使被给定圆覆盖但不被新圆覆盖的区域面积最小。博主通过考虑点与圆的位置关系,利用几何原理给出了计算新圆圆心坐标和半径的方法。
摘要由CSDN通过智能技术生成

题目链接:4499. 画圆 - AcWing题库

在一个二维平面内,给定一个以 (x1,y1)(x1,y1) 为圆心,半径为 RR 的圆以及一个坐标为 (x2,y2)(x2,y2) 的点。

请你在二维平面上画一个圆,要求:

  1. 平面中不存在点满足既在你画的圆上,又在给定的圆外。
  2. 给定的点不能在你画的圆内(可以在圆上)。
  3. 被给定圆覆盖且不被你画的圆覆盖的区域面积应尽可能小。

请输出你画的圆的圆心坐标以及半径。

输入格式

共一行,包含 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值