牛客网—小周的曲射炮(公式推导)
题目描述
小周最近在玩一款二战游戏,他因而对曲射炮的轨迹产生了很大的兴趣,但是在尝试计算后,小周发现这个问题并不是那么简单,他因而来请教你这位计算机高手,请你来帮帮他吧。问题大致可描述为,在二维平面的原点(0,0)处有一曲射炮,炮口可沿任意方向发出初速度为v的炮弹,小周想要把炮弹投射到点(x,y)处,现在你需要帮助小周得出炮口与地面夹角的弧度。为使问题简化,我们忽略空气阻力,x轴沿水平方向分布。设重力加速度g=9.8。
输入描述:
第一行为一个整数T,表示输入的数据组数。 每组数据对应一行输入, 依次为三个正整数x,y,v,含义如题面所示。
输出描述:
每组数据输出一行,如果无论如何挑战炮口与地面夹角都无法将炮弹投射这目标处,输出“NO SOLUTION.”(不包括引号),否则从小到大输出所有可能的弧度(均四舍五入至小数点后5位,如果有两个解四舍五入至小数点后5位后相同,只视为一个解),中间用一个空格分隔。
输入
4
45 56 78
32 78 55
33 33 25
12 25 25
输出
0.93196 1.53271
1.24254 1.50973 NO SOLUTION.
1.25456 1.43951
实现思路:一个斜上抛的物理模型,把这个过程模拟出来,分两种情况
①:斜上抛上升过程中经过目标点
②:斜上抛下降过程中经过目标点
推导过程如下:
实现代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double g = 9.8;
double x,y,v,a,b,c;
int main()
{
int T;
cin>>T;
while(T--){
scanf("%lf%lf%lf",&x,&y,&v);
a=g*x*x/(2*v*v);
b=-x;
c=g*x*x/(2*v*v)+y;
if(b*b-4*a*c<0){
printf("NO SOLUTION.\n");
}
else{
double x1=((-b+sqrt(b*b-4*a*c))/(2*a));
double x2=((-b-sqrt(b*b-4*a*c))/(2*a));
double ans=atan(x1);
double bns=atan(x2);
printf("%.5lf %.5lf\n",bns,ans);
}
}
return 0;
}