您当前位置: 圣才学习网首页 >> IT类 >> Java程序设计

Robocode坐标锁定的实现(4)

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
   
来源:网络 作者:未知
 
列表1:
 
Geny
GenyTrack
X:303
genyX:303
Y:128
genyY:128
 
列表1就是我们用动静机器人测试法得出的数据。你将会惊喜若狂,不错,我们成功的探测到了我们可怜的Geny的坐标。惊喜过后你就会不明白了:我们是怎样实现这一切的?为什么代码中使用到了非Robocode中的类库Math,还似乎用到了正余弦求解,还有弧度?不错,这就是Robocode:处处都让我们惊奇,处处都让我们学习新的知识。如果你对中学时代的数学三角几何解法已经陌生,没关系,你将在我们本文最后的三角函数基础中将学习到这些。它将勾起你中学时代的记忆。
 
  现在让我们来分析分析我们GenyTrack到底做了些什么:
 
  在 GenyTrackScanndeRobotEvent事件中我们首先得到Geny的绝对角度 bearing,也即相对屏幕的角度。并从 ScannedRobotEvent扫描事件中得到的大量信息分析中提炼出GenyGenyTrack的距离为distance。有了Geny的角度,Geny的距离我们再根据三角学基础(详见文三角函数基础)就可求出Geny精确坐标了。
 
  又由于Java类库中的正弦函数sin余弦函数cos是以弧度制(详见文三角函数基础)为角度的参数。所以我们利用了Math.toRadians方法把Geny的绝对角度转化为弧度。见列表2
 
  列表2:
 
  double bearing = (getHeading() + e.getBearing ()) % 360;
 
  double distance = e.getDistance();
 
  bearing = Math.toRadians(bearing);
 
  double genyX = getX() + Math.sin(bearing) *  distance;
 
  double genyY = getY() + Math.cos(bearing) *  distance;
 
  out.println("genyX:"+ Math.round(genyX));
 
  out.println("genyY:"+ Math.round(genyY));
 
  注意三角函数的基础中:对边长=sina *斜边长,侧边长=cosa*斜边长,但要记住Robocode中三角坐标系统中的sincos和我们数学中的三角坐标系统有一定差别,也即上面的 sinacosa要对换,对边长=cosa*斜边长。图4画出了Geny GenyTrack之间角度和距离的关系以及Robocode所采用的三角坐标系统。
 
4
 
 
 
  黑线条为GenyTrackXY坐标,蓝线条以Geny的距离distance和绝对角度 bear求得的XY坐标,两者相加得到的就是GenyXY坐标。
 
  至于Math类库的使用,我们就不详细说明了。读者也可从下面的IBM Java区链接中找到很多有关的知识,也可参考一些Java类库书籍说明。当你设计高级 Robocode机器人时你会发现,Math类库是你不可缺少的一部分知识。此处我们只简单的介绍正弦函数及余弦函数的使用。
 
  Sin
 
  public static double sin(double a)
 
  Returns the trigonometric sine of an angle.
 
  Parameters:
 
  a - an angle, in radians.
 
  Returns:
 
  the sine of the argument
 
  Sin函数返回三角的正弦函数,参数a是一个以double类型以弧度表示的角度值,返回类型为double.
 
  cos
 
  public static double cos(double a)
 
  Returns the trigonometric cosine of an angle.
 
  Parameters:
 
  a - an angle, in radians.
 
  Returns:
 
  the cosine of the argument
 
相关阅读
 
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句