2018ICPC-Jiaozuo D(计算几何)

D. Keiichi Tsuchiya the Drift King

题目大意:

给出宽为a,长为b的车,有一半径为r,角度为d的拐弯弯道,求出最小宽度且车的右上角始终为车与圆的相切点

解题思路:
  • 临界情况如下图,此时 θ = a r c t a n ( b / ( a + r ) ) \theta=arctan(b/(a+r)) θ=arctan(b/(a+r)),所以当所需转过的角度大于 θ \theta θ
    时,答案始终为: s q r t ( ( a + r ) 2 + b 2 ) − r sqrt((a+r)^2+b^2)-r sqrt((a+r)2+b2)r
    在这里插入图片描述

  • d < θ d<\theta d<θ时,如下图,只要求出红色线的长度-圆半径即可
    在这里插入图片描述

AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db pi = acos(-1);
db sqr(db x) {return x * x;}
int main() {
    int _;
    cin >> _;
    while (_--) {
        db a, b, r, d;
        cin >> a >> b >> r >> d;
        db theta = d / 180 * pi, alpha = atan(b / (a + r));
        db l = sqrt(sqr(b) + sqr(a + r));
        if (theta >= alpha) {
            cout << fixed << setprecision(8) << l - r << endl;
        }
        else {
            cout << fixed << setprecision(8) << l * cos(alpha - theta) - r << endl;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值