国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java新學法之Robocode基本原理之坐標鎖定(上)

2019-11-18 13:08:54
字體:
來源:轉載
供稿:網友

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

  
圖1

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

  
圖2

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

  
 Java新學法之Robocode基本原理之坐標鎖定(上)(圖四)

  
圖3

  
  列表1:
  
  Geny GenyTrack
  X:303 genyX:303
  Y:128 genyY:128
  
  列表1就是我們用”動靜機器人”測試法得出的數據。你將會驚喜若狂,不錯,我們成功的探測到了我們可憐的Geny的坐標。驚喜過后你就會不明白了:我們是怎樣實現這一切的?為什么代碼中使用到了非Robocode中的類庫Math,還似乎用到了正余弦求解,還有弧度?不錯,這就是Robocode:處處都讓我們驚異,處處都讓我們學習新的知識。假如你對中學時代的數學三角幾何解法已經生疏,沒關系,你將在我們本文最后的三角函數基礎中將學習到這些。它將勾起你中學時代的記憶。
  
  現在讓我們來分析分析我們GenyTrack到底做了些什么:
  
  在GenyTrack的ScanndeRobotEvent事件中我們首先得到Geny的絕對角度bearing,也即相對屏幕的角度。并從ScannedRobotEvent掃描事件中得到的大量信息分析中提煉出Geny和GenyTrack的距離為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中三角坐標系統中的sin和cos和我們數學中的三角坐標系統有一定差別,也即上面的sina和cosa要對換,對邊長=cosa*斜邊長。圖4畫出了Geny和GenyTrack之間角度和距離的關系以及Robocode所采用的三角坐標系統。
  
Java新學法之Robocode基本原理之坐標鎖定(上)(圖五)

  
圖4

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁明县| 镇平县| 高碑店市| 西乌珠穆沁旗| 九龙城区| 西贡区| 翁牛特旗| 普宁市| 库伦旗| 奉新县| 株洲市| 七台河市| 勃利县| 贵港市| 兴山县| 来凤县| 新蔡县| 叶城县| 澳门| 仁化县| 徐州市| 临洮县| 安平县| 衡南县| 乡城县| 荃湾区| 阿克陶县| 上饶市| 怀集县| 津市市| 东山县| 买车| 贵阳市| 汉阴县| 鹰潭市| 巧家县| 三河市| 泌阳县| 建德市| 瑞丽市| 广河县|