2019牛客暑期多校训练营(第五场)I three points 1(计算几何+思维)

题目链接:

题意:给你三个点,X,Y,Z,  XY = a,  XZ = b, YZ = c让你构造这三个点,满足给出的条件,横坐标在[0, w]  范围内,  纵坐标在[0, h]范围内

思路:先固定一个点,让它在(0, 0) 只有如下两种情况,一种是没有超过h,一种超过了h

这样把三个点的全排列写出来,依次给三角形赋值,分别判断求出来的第三个点  x是否在[0, w] 内,y是否在[0 , h]内

#include <bits/stdc++.h>
const double eps = 1e-9;
using namespace std;
#define P pair
#define MP make_pair
P<double,double> p[3];
double w, h, a, b, c;
bool solve(double a, double b, double c, int X, int Y, int Z) {
    p[X] = MP(0, 0);
    if(a <= h) p[Y] = MP(0, a);
    else p[Y] = MP(sqrt(a * a - h * h), h);
    double D = acos((a * a + b * b - c * c) / 2 / a / b);
    D += atan(p[Y].first / p[Y].second);
    p[Z] = MP(b * sin(D), b * cos(D));
    if(p[Z].first >= 0 - eps && p[Z].first <= w + eps && p[Z].second >= 0 - eps && p[Z].second <= h + eps) {
        printf("%.12f %.12f %.12f %.12f %.12f %.12f\n",p[0].first, p[0].second, p[1].first, p[1].second, p[2].first, p[2].second);
        return true;
    }
    return false;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%lf %lf %lf %lf %lf", &w, &h, &a, &b, &c);
        if(solve(a, b, c, 0, 1, 2)) continue;
        if(solve(a, c, b, 1, 0, 2)) continue;
        if(solve(b, a, c, 0, 2, 1)) continue;
        if(solve(b, c, a, 2, 0, 1)) continue;
        if(solve(c, b, a, 2, 1, 0)) continue;
        if(solve(c, a, b, 1, 2, 0)) continue;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值