射箭

题意:给定一点(x,y)和射箭的初始速度v,求站在(0,0)点的Bob以怎样的角度射击才能击中目标,射击角度为箭与横坐标的夹角。

思路:画一个直角坐标系,建立如下函数 vx=v*cos(m); vy=v*sin(m); t=x/vx;    fy=vy*t-9.8*t*t/2;,用二分法判断是否成立。

感悟:有时候数形结合很重要,我本来想建立一个二次函数,不过用三角函数个简单清晰。

AC代码:

#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
const double PI=3.1415926535497;
double x,y,v,s;
void f ()
{
    double m,l,r,vx,vy,t,fy;
    bool suc=0;
    l=0;  r=PI/2;
    while ( r-l>0.0000000001)
    {
        m=(l+r)/2;
        vx=v*cos(m);
        vy=v*sin(m);
        t=x/vx;
        fy=vy*t-9.8*t*t/2;
        if (fy<y)
        l=m;
        else 
        {
            r=m;
            s=m;suc=1;
        }
    }
    if (suc)
    cout<<fixed<<setprecision(6)<<s<<endl;
    else cout<<"-1"<<endl;
}
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        cin>>x>>y>>v;
        f();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个简单的按下按钮射箭的方法可以分为以下几步: 1. 在场景中创建一个箭和一个按钮,将它们放在合适的位置。 2. 在脚本中定义箭的初始位置和射击力度等属性。 3. 给按钮添加一个OnClick事件,使其调用一个函数。 4. 在函数中实现箭的射击动作,可以使用Rigidbody组件控制箭的运动。 以下是一个示例代码: ```csharp using UnityEngine; public class ShootArrow : MonoBehaviour { public GameObject arrowPrefab; public Transform shootPoint; public float shootForce = 10f; private GameObject currentArrow; private void Start() { currentArrow = Instantiate(arrowPrefab, shootPoint.position, shootPoint.rotation); } public void Shoot() { currentArrow.transform.SetParent(null); Rigidbody rb = currentArrow.GetComponent<Rigidbody>(); rb.isKinematic = false; rb.AddForce(shootPoint.forward * shootForce, ForceMode.Impulse); currentArrow = Instantiate(arrowPrefab, shootPoint.position, shootPoint.rotation); } } ``` 在该代码中,箭的预制体 `arrowPrefab` 和射击点 `shootPoint` 都是通过 Unity 编辑器中的拖拽方式进行赋值的。在 Start 函数中初始化一个箭,然后在 Shoot 函数中将箭发射出去,同时重新生成一个新的箭。 注意,为了使箭在射击时能够受到物理引擎的影响,需要在箭预制体的 Rigidbody 组件中勾选 Use Gravity 和 Is Kinematic 两个选项。同时,箭的预制体应该被放置在一个 Layer 中,该 Layer 不应该与按钮所在的 Layer 相同,以免发生碰撞误判。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值