Robocode根基道理之偏向分解
副标题#e#
许多研究Robocode的 玩家都被个中的偏向及坐标弄糊涂了。下面就随着 Skyala.Li一起来揭开个中的玄妙。
媒介:
许多研究Robocode的 玩家都被个中的偏向及坐标弄糊涂了。下面就随着 Skyala.Li一起来揭开个中的玄妙。
首先我们来看看一段英文的翻译及说明:
heading – absolute angle in degrees with 0 facing up the screen, positive clockwise. 0 <= heading < 360.
bearing – relative angle to some object from your robot’s heading, positive clockwise. -180 < bearing <= 180
heading:是呆板人偏向与屏幕正上方的角度差,偏向在0到360之间.
bearing:是呆板人的某个部件如雷达发明的方针与偏向的角度差,顺时针为 正角度在-180到180之间
看了这段文字各人大概照旧不太大白,整个屏幕哪个是0度角,整个是坐标原 点呢? 顺时针与逆时针的偏向如何区分?
观念与平面图:
在开始说明之前各人先得清楚几个在Robocode中很重要的观念:
坐标系:Robocode整个坐标系都是疆场屏幕以左下角为原点
绝对偏向系:Robocode中不管呆板人在哪个偏向都是以静态疆场屏幕为参照 的绝对角度(也即各人说的Heading),正上方为0度角。也即不管是 Robot,Gun,Radar向北为0,向东为90,向南为180,向西为270。
相对偏向系:相对偏向是Robot,Gun,Radar以呆板人的动态heading角度为参 照的角度差不再以整个静态屏幕为参照了,叫它相对因为呆板人的heading是随 着呆板人移动而不断的在改变,heaing只是个相对物体。
下图很清楚的说明白坐标系统及绝对偏向
#p#副标题#e#
哦好像大白了一些,可脑子中尚有一些不是很清楚。我们来做个测试。测试 要领很简朴,写两个呆板人,一个什么一动不动坐在原点扫扫Gun并打印出本身的 Heading我们叫它Geny;另一个也不移动,只是Gun举办迟钝的动弹同时打印出自 己的Heading,Bearing,和Radar的 Heading,我们叫它GenyTrack1. (注:此处的 数据是double范例,没有举办转化我们近似的认识它为整数,详细的转化要领和 更好测试要领我们会在今后的文章中给出):
代码如下Geny.java
//Geny.java
package wind;
import robocode.*;
import java.io.*;
public class Geny extends Robot
{
public void run() {
ahead(100);
System.out.println("Heading "+getHeading());
while(true) {
turnGunRight(360);
}
}
}
GenyTrack1.java
//GenyTrack1.java
package wind;
import robocode.*;
public class GenyTrack1 extends Robot
{
public void run () {
while (true)
{
turnGunRight(5);
}
}
public void onScannedRobot(ScannedRobotEvent e)
{
System.out.println("getBearing "+e.getBearing ());
System.out.println("heading "+getHeading());
System.out.println("getRadarHeading() "+getRadarHeading());
turnGunRight(e.getBearing());
fire(3);
}
}
要想相识呆板人的各个部件及说明请看文章:Robocode呆板人剖解图
绝对偏向系Heading:
下面是剪切到的Geny和GenyTrack1在差异位置获得的数据图.
图一
图一解:各人调查呆板人GenyTrack1的数据heading:64.421114…~ 64,说明 它正好坐落在屏幕绝对偏向系64度的处所。也就是说GenyTrack1当前的Heading 偏向为64度。
图二
图二解:各人调查呆板人GenyTrack1的数据heading:161.79…,说明它正前方 正好正对屏幕绝对偏向系161度的处所。也就是说GenyTrack1当前的Heading偏向 为161度。而我们的Geny正前方正对35度的处所。
各人比较着偏向系一看我想一切就会大白的。是不是有点成绩感了,不急, 后头尚有。
相对偏向系Bearing:
Bearing,Bearing 活该的Bearing,我想各人头痛的就是它的。在此我们就 以呆板人的雷达(Radar)为例来说明,源措施(GenyTrack1)中我们用到的是事 件:onScannedRobot(ScannedRobotEvent e) ,所以我们要用到的就是Radar的 Heading,其它相关的如Bullet,Gun的要领雷同,有乐趣的伴侣可以本身测试一 下。
我们先把数据近似提出来如下表:
#p#分页标题#e#
呆板人 | Heaing | RadarHeading | Bearing |
Geny | 35 | . | . |
GenyTrack1 | 161 | 275 | 114 |
在此处呆板人和Radar的Heading我想各人比较图上的偏向系及上面的绝对方 向体系说明应该大白了,只是要留意呆板人哪是前哪是后:详见Robocode呆板人 剖解图.
(Geny 的Heading在此处没有用上,只是给各人参考一下)你看我们的 GenyTrack1前面正对着161角,雷达在屏幕276度角的处所发明白Geny呆板人。所 以此处的Geny和GenyTrakc1相差的角度=|276-161|度(取绝对值,正负由动弹方 向抉择),由于此时的Geny呆板人正位于 GenyTrack1顺时针偏向上(GenyTrack1 的0,180之间),所以相对角度Bearing就是顺时针偏向(+114)度,(图上每次数据 有一小点差是由于打印的数据及初级呆板人完成所有代码后才举办处理惩罚事件。不 是即时的。要即时处理惩罚涉及到高级呆板人AdvanceRobot的一些特性)。
下面获得相对角度是为负的图:道理同上。
图三
呆板人 | Heaing | RadarHeading | Bearing |
Geny | 35 | . | . |
GenyTrack1 | 57 | 238 | -173 |
|238-57|,由于Geny处于GenyTrack1背后(-180,0)。为逆时针偏向所觉得负 。
时针略说:
顺时针和逆时针是看另一呆板人是在你的Heading角度的(0,180)照旧(- 180,0)之间。
再这次提醒:Heading是个静态角度,正上方总为0.不管是取Heading,照旧 取偏向
Bearing是个角度差值,是由参照的Heading和发明时的Heading的差值。
好了,偏向的问题就说到这,这是Skyala.Li的领略,接待各人来接头。此处 没有引用坐标系的具体说明。请看: Robocode 根基道理之坐标系分解