题目链接:
题意:给你三个点,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;
}