砸向敌人的炮弹:已知初速度让抛物线过任意点
来源:互联网 发布:知乎离线 编辑:程序博客网 时间:2024/06/02 20:58
转载自http://bbs.9ria.com/thread-171055-1-1.html
这个问题大家做游戏的时候可能都遇到过,最近手上一个项目正好用到,昨天推导了一下适用于程序的公式,不敢藏私分享给大家。
问题:如何使初速度恒定的炮弹,以合适的角度击中射程内的任意点,画图表示的话就是这样:已知炮弹初速度,求发射角度使抛物线过某点 p(就是小蘑菇同学了)。这在一些需要计算提前量的射击游戏中很有用。
推导过程比较繁琐,简单说下:
1 假设角度α
2 获得初始速度的横纵向两个分量
3 列出其到达指定点p 的加速度公式和速度公式(纵向为恒加速的直线运动,横向为匀直运动)
4 最后利用三角函数公式将前式子归纳为一个关于 Math.tan(a)的一元二次方程
5 利用一元二次方程求解公式获得 Math.tan(α)的值(此处会获得两个值,可以直接取绝对值较小最小的那个)
6 利用反三角函数获得 角度α。
好了不废话了 直接给出公式如下,需要的同学自取即可,注意加速度应为负数:
//speed:初始速度//g :重力加速度//bp: 初始点//tp: 目标点public function getAngleToPoint(speed:Number,g:Number,bp:Point,tp:Point):Number{ //获得坐标差 var dx:Number=tp.x-bp.x; var dy:Number=tp.y-bp.y; //tempV: 便于简化计算的一个临时变量 var tempV:Number=g*dx/(2*speed*speed) //根据一元二次方程会有两个解,对应一个角度较高和一个较低的两条抛物线,均可到达指定点 //这里为了便于应用两个角度的解都给出,一般只计算减法解即可 var ta1:Number=(1+Math.sqrt(1-4*tempV*(tempV+dy/dx)))/(2*tempV); var ta2:Number=(1-Math.sqrt(1-4*tempV*(tempV+dy/dx)))/(2*tempV); //超出射程范围时无解,故需要判断(这里只取了减法解) if(!ta2){ return NaN }else{ //由于是用原始的反正切函数,所以需要判断一下象限,注意所得到的为弧度 return Math.atan(ta2) } }
- 砸向敌人的炮弹:已知初速度让抛物线过任意点
- 已知矩形的任意三个点,求第四个点
- unity3d 抛物线(炮弹轨迹)
- Unity中炮弹抛物线运动
- C++练习:已知三点,求过这三点的圆
- 过抛物线2交点的直线方程
- 已知有向图任意两点的最短距离,求最小边数
- 已知起点和终点求炮弹轨迹
- Unity敌人生成点的代码
- Android动画效果(一) 任意两点间的抛物线动画
- 关于手机游戏中的炮弹轨迹——抛物线
- 让自己过好点
- 趣题:构造多边形使得过边界上某一点的任意直线均能等分面积
- 判断一个点是否在旋转过任意角度的矩形内
- 给定初速度 判断球能否到达某个点
- 抛物线算法(已知起点、终点、高度)
- 用抛物线的点实现HTC Vive瞬移系统
- 用抛物线的点实现HTC Vive瞬移系统
- LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
- install Java in ubuntu
- Tomcat6集成JOTM实现JTA事务管理
- Java虚拟机之垃圾回收
- 新浪微博API中返回的中文表情转成相应图片的PHP代码
- 砸向敌人的炮弹:已知初速度让抛物线过任意点
- 树莓派(raspberry pi)播放flash 远程登录 视频播放
- 集群服务器--LVS/tun
- awk模拟数据库做数据统计
- IOS 测心跳的实现原理
- 轻试Nginx的负载均衡
- HTML学习笔记
- curl
- 什么是内核线程和用户线程