题意
t组样例,每组样例输入w, h, a, b, c.在坐标系中,0 <= x <= w, 0<=y<=h,
求出三个点X, Y, Z, 并且|XY| = a, |XZ| = b, |YZ| = c,求这三点坐标并依次输出
题解
依次枚举三个点在原点位置,交换其余两个点的位置 ,保证在范围内
点和线的位置要对应
注意:
在几何问题中,能用三角函数,不用勾股定理,减少误差,
浮点数里面不能判断相等,应该判断误差
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
double w, h;
struct node{
double x, y;
}no[3];
bool check(double a, double b, double c, int x, int y, int z){
no[x].x = 0.0;
no[x].y = 0.0;
if(a <= w){
no[y].x = a;
no[y].y = 0.0;
}
else{
no[y].x = w;
no[y].y = sqrt(a*a - w*w);
}
double ang = acos((a*a + b*b - c*c )*1.0/ (2*a*b));
ang = ang + atan(no[y].y*1.0 / no[y].x);
no[z].x = b * cos(ang);
no[z].y = b * sin(ang);
if(no[z].x >= -eps && no[z].x <= w+eps && no[z].y >= -eps && no[z].y <= h+eps){
printf("%.12lf %.12lf %.12lf %.12lf %.12lf %.12lf\n", no[0].x, no[0].y, no[1].x, no[1].y, no[2].x, no[2].y);
return true;
}
return false;
}
int main(){
int t;
cin >> t;
while(t--){
double a, b, c;
scanf("%lf%lf%lf%lf%lf", &w, &h, &a, &b, &c);
if(check(a, b, c, 0, 1, 2)) continue;
if(check(a, c, b, 1, 0, 2)) continue;
if(check(b, a, c, 0, 2, 1)) continue;
if(check(b, c, a, 2, 0, 1)) continue;
if(check(c, a, b, 1, 2, 0)) continue;
if(check(c, b, a, 2, 1, 0)) continue;
}
return 0;
}