大致代码如下:
Angle:=CalculateVectorAngle(B,A); //初始化角度为目标移动方向
Appr:=PI*0.25;
D:=C+(cos(Angle)*R,sin(Angle)*R); //按照Angle计算弹体单位时间后飞行到的坐标
Result:=CalculateClockwise(B,C,A,D); //计算AD向量在BC向量左手还是右手方向
while(Appr>=PI*0.02) //PI*0.02为误差范围
{
Angle+=Appr;
D:=C+(cos(Angle)*R,sin(Angle)*R); //再次计算新坐标
if(CalculateClockwise(B,C,A,D)!=Result) //比较两次
{
Appr*=-0.5; //如果方向不同,则实际射角就应该在前两个角度之间
Result:=CalculateClockwise(B,C,A,D); //并给Result赋值
}
else
{
Appr:=Result*Abs(Appr); //修改Appr方向使之与计算出的左右手方向一致
}
}
基于直线的快速查找提前发射量算法以后有空搞。:L 那个算法可能执行效率会更高些。
[ 本帖最后由 honeyfox 于 2009-1-5 22:12 编辑 ]