麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)

2019-11-18 13:08:54
字體:
供稿:網(wǎng)友

  導(dǎo)論
  前面我們了解了Robocode中的絕對方向,相對方向及整個方向系統(tǒng)。相信大家對此深有體會了。但是問題又來了,單知道方向似乎不能完全達(dá)到了解敵人的目的。怎樣去探測敵人的距離?怎樣精確的鎖定目標(biāo)呢?對于移動中的目標(biāo)我們又如何處理?在這里我們將利用java.lang 基本類庫中的Math類及一些基本三角函數(shù)方法為你揭開這些迷霧。對于那些快被遺忘的三角幾何知識在本文的最后Skyala.Li有比較具體的講解。
  
  坐標(biāo)基本概念
  首先我們還是來看看Robocode API中的一段文字翻譯
  
  All coordinates are eXPRessed as (x,y).
  
  所有的坐標(biāo)都用x,y來表示
  
  All coordinates are positive.
  
  所有的坐標(biāo)都為正
  
  The origin (0,0) is at the bottom left of the screen.
  
  坐標(biāo)原點(diǎn)(0,0)在屏幕的左下角
  
  Positive x is right. X的右邊為正
  
  Positive y is up. Y的上面為正
  
  圖1顯示了Robocode中的坐標(biāo)系統(tǒng),有關(guān)圖的具體說明請看我們前面介紹的文章“Robocode基本原理之方向剖析”.
  
 Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)(圖一)

  
圖1

  
  “動靜機(jī)器人”測試法
  
  好了,我們知道了Robocode整個坐標(biāo)系統(tǒng),一切問題都好辦了。先讓我們進(jìn)行一些有趣的實(shí)驗(yàn)。我們?nèi)砸浴眲屿o機(jī)器人”的方法進(jìn)行測試。這是個測試機(jī)器人方向,坐標(biāo)參數(shù)的很好辦法。見下說明:
  
  設(shè)計(jì)兩個機(jī)器人,任意取名為Geny和GenyTrack。Geny是個靜止的機(jī)器人,它主要任務(wù)是打印自己的當(dāng)前坐標(biāo),用來驗(yàn)證GenyTrack追蹤它的位置是否正確。GenyTrack顧名思義,它就是我們要研究的追蹤目標(biāo)機(jī)器人了。它在此負(fù)責(zé)鎖定Geny的坐標(biāo),距離并打印出探測到的Geny機(jī)器人的X,Y坐標(biāo)及距離,此處使用了Java.lang類庫中的Math.round方法,四舍五入得到的double類型的數(shù)據(jù),方便對比。最后用表格對比,以此來驗(yàn)證我們使用方法的正確性。
  
  當(dāng)然還有很多有趣的測試方法來等待著你的驗(yàn)證。如測速度,加速度時(shí)我們就可用”龜兔賽跑”的方法;測炮管,雷達(dá)坦克車旋轉(zhuǎn)相互影響度可用”離心重力”的方法。相信從測試方法的名字聰明的你們就知道他的用法了。
  
  在我們開始前,Skyala.Li建議你們下載源碼(resource)先看看GenyTrack的表演。當(dāng)然你也可參考文章內(nèi)附加的輔助說明Robocode坐標(biāo)系統(tǒng)的代碼。
  
  Geny:
  
  package test;
  import robocode.*;
  
  public class Geny extends AdvancedRobot
  
  {
  
  public void run ()
  
  {
  
  while (true)
  
  {
  
  // round 對get到的數(shù)據(jù)進(jìn)行四舍五入處理
  
  out.println("x:"+Math.round(getX()));
  
  out.println("y:"+Math.round(getY()));
  
  }
  
  }
  
  }
  
  GenyTrack:
  
  package test;
  import robocode.*;
  
  public class GenyTrack extends AdvancedRobot
  
  {
  
  public void run ()
  
  {
  
  while (true)
  
  {
  
  turnRadarRight(400);
  
  }
  
  }
  
  public void onScannedRobot(ScannedRobotEvent e)
  
  {
  
  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));
  
  }
  
  }
  
  注重這兩個機(jī)器人我們都使用了AdvancedRobot的類,這可是高級機(jī)器人的說明了。有關(guān)高級機(jī)器人大家可以查找Robocode API的說明,也可看看Sing Li的"Rock 'em, sock 'em Robocode: Round 2".
  
  距離探測
  
  要得到目標(biāo)坐標(biāo)我們首先得知道我們和目標(biāo)之間的距離。這里的距離探測很簡單,只要運(yùn)用GenyTrack機(jī)器人ScannedRobotEvent事件中的getDistance()方法我們就可得到Geny機(jī)器人和你之間的距離差了。只是要注重一點(diǎn),由于機(jī)器人存在著寬和高,可分別用Robocode API 中的getWidth()和getHeigth()方法得到。而兩個機(jī)器人的距離是以雙方的中心點(diǎn)為終點(diǎn)。如圖所示,L才是它們的距離,A的距離是錯誤的。
  
 Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)(圖二)

  
圖2

  
  坐標(biāo)探測
  
  知道了對方的距離,知道了整個坐標(biāo)系統(tǒng)。我們就來鎖定我們的目標(biāo)Geny.我們先來看看圖3所示:
  
 Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)(圖三)

  
 Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)(圖四)

  
圖3

  
  列表1:
  
  Geny GenyTrack
  X:303 genyX:303
  Y:128 genyY:128
  
  列表1就是我們用”動靜機(jī)器人”測試法得出的數(shù)據(jù)。你將會驚喜若狂,不錯,我們成功的探測到了我們可憐的Geny的坐標(biāo)。驚喜過后你就會不明白了:我們是怎樣實(shí)現(xiàn)這一切的?為什么代碼中使用到了非Robocode中的類庫Math,還似乎用到了正余弦求解,還有弧度?不錯,這就是Robocode:處處都讓我們驚異,處處都讓我們學(xué)習(xí)新的知識。假如你對中學(xué)時(shí)代的數(shù)學(xué)三角幾何解法已經(jīng)生疏,沒關(guān)系,你將在我們本文最后的三角函數(shù)基礎(chǔ)中將學(xué)習(xí)到這些。它將勾起你中學(xué)時(shí)代的記憶。
  
  現(xiàn)在讓我們來分析分析我們GenyTrack到底做了些什么:
  
  在GenyTrack的ScanndeRobotEvent事件中我們首先得到Geny的絕對角度bearing,也即相對屏幕的角度。并從ScannedRobotEvent掃描事件中得到的大量信息分析中提煉出Geny和GenyTrack的距離為distance。有了Geny的角度,有了Geny的距離我們再根據(jù)三角學(xué)基礎(chǔ)(詳見文三角函數(shù)基礎(chǔ))就可求出Geny的精確坐標(biāo)了。
  
  又由于Java類庫中的正弦函數(shù)sin余弦函數(shù)cos是以弧度制(詳見文三角函數(shù)基礎(chǔ))為角度的參數(shù)。所以我們利用了Math.toRadians方法把Geny的絕對角度轉(zhuǎn)化為弧度。見列表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));
  
  注重三角函數(shù)的基礎(chǔ)中:對邊長=sina *斜邊長,側(cè)邊長=cosa*斜邊長,但要記住Robocode中三角坐標(biāo)系統(tǒng)中的sin和cos和我們數(shù)學(xué)中的三角坐標(biāo)系統(tǒng)有一定差別,也即上面的sina和cosa要對換,對邊長=cosa*斜邊長。圖4畫出了Geny和GenyTrack之間角度和距離的關(guān)系以及Robocode所采用的三角坐標(biāo)系統(tǒng)。
  
Java新學(xué)法之Robocode基本原理之坐標(biāo)鎖定(上)(圖五)

  
圖4

  
  黑線條為GenyTrack的X,Y坐標(biāo),藍(lán)線條以Geny的距離distance和絕對角度bear求得的X,Y坐標(biāo),兩者相加得到的就是Geny的X和Y坐標(biāo)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品久久久久一区二区 | 国产呦在线观看视频 | 精品一区二区三区在线观看视频 | 万圣街在线观看免费完整版 | 久色成人 | 成人一级黄色大片 | 老司机免费福利午夜入口ae58 | 伦一区二区三区中文字幕v亚洲 | 久久久久久久久久久国产精品 | 欧美精品18videos性欧美 | 国产精品一区二区三区在线播放 | 亚洲成人免费影视 | 日本黄色不卡视频 | 香蕉久久久精品 | 99在线热播精品免费 | 99爱视频在线观看 | 欧美在线观看视频网站 | 国产精品久久久久久婷婷天堂 | 激情小说色 | 黄污污网站 | 自拍亚洲伦理 | 成人一级毛片 | 免费一级毛片在线播放不收费 | 精品免费国产一区二区三区 | 中文字幕精品一区久久久久 | 91 免费视频 | 久久蜜桃香蕉精品一区二区三区 | 免费a级黄色片 | 久久国产精品久久精品国产演员表 | 日韩av手机在线免费观看 | av在线播放地址 | 无遮挡一级毛片视频 | 亚洲午夜一区二区三区 | 国产午夜精品一区二区三区嫩草 | 黄色高清免费网站 | 亚洲自拍第二页 | 欧美亚洲黄色片 | 午夜精品久久久久久久久久久久久蜜桃 | 老司机一级毛片 | 欧美一级爱爱 | av之家在线观看 |