2019牛客多校第五场 I. three points 1(三角形)

题意

   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;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值