最近在写一个手机游戏,其中涉及到一个跟踪弹的算法,成果如下:
/*子弹到目标的向量分量*/
int vx=target.getPosition().x-this.position.x;
int vy=target.getPosition().y-this.position.y;
/*使用内积判断向量的夹角[0,180]*/
double dot=Util.dot(dx,dy,vx,vy);//dx,dy为速度向量分量
double cos=dot/velocity*Util.modulus(vx,vy);//velocity为速度标量
double angle=Math.acos(cos);//两向量的夹角
/*使用外积判断向量的夹角是顺时针还是逆时针*/
double cross=Util.cross(dx,dy,vx,vy);
if(angle!=0&&Math.abs(cross)>0.00001)
{
/*参考偏转角界限进行调整*/
Point2D result=new Point2D();
if(angle<deflectionAngleLimit)//deflectionAngleLimit为子弹最大偏转角,即从一帧跳到下一帧最大的旋转角度
{
if(cross>0)
{
//逆时针旋转
direction+=angle;
Util.rotate(dx,dy, angle, result);
Log.d("TrackingBullet","ccw angle:"+angle+",direction:"+direction);
}
else if(cross<0)
{
//顺时针旋转
direction-=angle;
Util.rotate(dx,dy, -angle, result);
Log.d("TrackingBullet","cw angle:"+angle+",direction:"+direction);
}
}
else
{
if(cross>0)
{
//逆时针旋转
direction+=deflectionAngleLimit;
Util.rotate(dx,dy, deflectionAngleLimit, result);
Log.d("TrackingBullet","ccw limit:"+deflectionAngleLimit+",direction:"+direction);
}
else if(cross<0)
{
//顺时针旋转
direction-=deflectionAngleLimit;
Util.rotate(dx,dy, -deflectionAngleLimit, result);
Log.d("TrackingBullet","cw limit:"+deflectionAngleLimit+",direction:"+direction);
}
}
Log.d("TrackingBullet","dx:"+dx+",dy:"+dy+"--result:"+result.x+","+result.y);
this.dx=result.x;//新的速度分量
this.dy=result.y;
}
然而其间遇到了一个问题,就是在数学中坐标系统Y分量的正方向是向上的,而手机的坐标系统Y分量的正方向是向下的,根据经验是可能使用y'=-y来转换的,不过在这里还不知道怎么转换,有机会我会再做进一步的研究,也希望有同道中人一起交流^_^
分享到:
相关推荐
基于Unity导弹自动追踪算法源代码,相关介绍:https://blog.csdn.net/sdhexu/article/details/77962134
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 ...
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 ...
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 8.1.5实例...
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 ...
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 ...
7.5 2D图形 7.6颜色 7.7为文本设定特殊字体 7.8图像 第8章事件处理 8.1、事件处理基础 8.1.1实例:处理按钮点击事件 8.1. 2建议使用内部类 8.1. 3将组件变成事件监听器 8.1.4实例:改变观感 ...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...
它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义...