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

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

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

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

  至于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
  
  Cos函數返回三角的余弦函數,參數a是一個以double類型的弧度表示的角值,返回類型為double.
  
  有人會問為什么不使用ScanndeRobot事件中的getRadarHeadingRadians()方法直接得到弧度。哦,你來看看Robocode中華聯盟iiley的一段說明:
  
  public void onScannedRobot(ScannedRobotEvent event) {
  enemyX=Math.sin(Util.standardMathDirRadians(getRadarHeadingRadians()))*event.getDistance();
  enemyY=Math.cos(Util.standardMathDirRadians(getRadarHeadingRadians()))*event.getDistance();
  }
  
  看起來似乎正確的,但是你實踐一下會發現他很不準確,為什么呢?原因在于getRadarHeadingRadians()函數,當你調用此函數的時候實際上雷達已經不在剛剛掃描到敵人的那個角度了,他已經轉過了十幾度甚至更多。雷達默認轉動速度是45度/robocode單位時間,實際上一般來說你用getRadarHeadingRadians()得到的值總是45度的整數倍。(一些情況除外,比如說你用了turnRadarLeft(11)類似的語句以后)。
  
  Robocode也遵循數學應用中的基本法則用兩種方法來表示方向的角度:角度制和弧度制,本文的代碼及以前文章中的代碼我們一直用的是角度制。另外一種方法就是利用ScannedRobotEvent.getBearingRadians()+robot.getHeadingRadians()得到敵人以弧度表示的方向,這個方法在本文章中沒有說明了,有愛好的朋友可以自己試試用Java.util 類庫來實現. 也可參考文檔"精確計算敵人的坐標"。大家也可比較兩種方法各自特點,這將是個很有意思的過程。
  
  移動鎖定
  當然,即使是最簡單的機器人也不會坐在那一動不動等著你來消滅。它會躲避你的進攻以及掃描,當你向它原來坐標處開火,說不定它已經跑得老遠了,當然這一切都不是我們所希望看到的。 我們的目的是要消滅它:不管他是移動或靜止的。下面我們就結合方向系統與坐標系統,來鎖定我們移動的目標。創造一個我們自己的高級掃描機器人。建議你在此處下載源代碼(resource)并看看演示效果再回到我們的文章中來。顯示如圖5:
  
 Java新學法之Robocode基本原理之坐標鎖定(下)(圖一)

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

  
圖5

  
  對比一下上面的數據,不管目標GenyMove在哪GenyRadar都能得到它精確的坐標。是不是有一種成就感!是的,敵人已經完全在我們的把握之中。即使它在移動中也無法擺脫我們雷達的掃描控制。這里只是很簡單舉了一些例子,GenyMove在每一個時間周期(有關時間周期的說明見的Rock 'em, sock 'em Robocode: Round 2)移動自己的位置并打印出移動后的坐標,而GenyRadar掃描系統不停的掃描目標,并一直追蹤,同時打印出掃描到的GenyMove方位。要害部分在我們的ScannedRobotEvent事件如列表3
  
  列表3:
  
  public void onScannedRobot( ScannedRobotEvent e )
  {
  
  double heading = e.getBearing() +getHeading();
  
  double distance = e.getDistance(); //求得距離
  
  double ager_bearing = Math.toRadians(heading % 360); //角度轉為弧度
  
  double genyX = getX() + Math.sin(ager_bearing) * distance;
  
  double genyY = getY() + Math.cos(ager_bearing) * distance;
  
  out.  
  out.println("genyY:"+ Math.round(genyY));
  
  if( heading >= 360 )
  
  heading = heading - 360;
  
  if( heading < 0 )
  
  heading = heading +360;
  
  double bearing = getRadarHeading() - heading;
  
  double radar_degree;
  
  boolean radar_direction;
  
  if( 0 <= bearing && bearing <= 180 )
  
  {
  
  radar_direction = LEFT;
  
  }
  
  else if( bearing <= -180 )
  
  {
  
  radar_direction = LEFT;
  
  bearing = ( 360 + bearing );
  
  }
  
  else if( bearing < 0 )
  
  {
  
  radar_direction = RIGHT;
  
  bearing =( -bearing );
  
  }
  
  else
  
  {
  
  radar_direction = RIGHT;
  
  bearing = (360 - bearing);
  
  }
  
  radar_degree = bearing * 1.3 ; //加大每一時間周期(tick)的掃描范圍
  
  if( radar_direction == RIGHT )
  
  {
  
  setTurnRadarRight( radar_degree );
  
  execute();
  
  }
  
  else
  
  {
  
  setTurnRadarLeft( radar_degree );
  
  execute();
  
  }
  
  我們在代碼中首先求得GenyMove的絕對角度,然后用掃描時雷達的絕對角度減去目標GenyMove的角度求得兩者的角度差也即我們雷達要旋轉的角度。最后利用一個小技巧radar_degree = bearing * 1.3 使雷達在目標的范圍左右擺動以擴大雷達掃描區域.這樣不管目標往哪邊移動都在自己的雷達掃描區內。
  
  在此沒有進行很具體的講解了,我想憑你學到的方向及坐標知識很快能明白個中原理并設計出自己的高級掃描機器人來。 聰明的你可能會興奮的想,哈,我的炮管用相同的辦法鎖定目標,這樣敵人不就沒辦法跑了,被我追著打。答案是錯誤的,雷達的掃描是條長線能直接定位到目標上 ,它到目標的時間差幾乎為零,并且雷達的掃描范圍比炮管大且精確。而炮管每時間周期只有20度,它定位目標是依靠著子彈,只有子彈打中了目標,才能說炮管的計算坐標是精確的。但是由于子彈 到達目標位置時需要一定的時間差,子彈本身又有速度值(20-3*power),所以要想炮管鎖定目標并讓子彈擊中目標,我們還得經過精確的計算,并要猜測目標可能的行動:是直線前進,還是做圓周運動,還是隨機運動等等。 這些都是我們要充分考慮的因素。是不是很有挑戰性!這一切都在Robocode的世界中等待著您的創造!
  
  三角函數基礎
  下面我們只是很簡單的介紹了一下與Robocode相關的三角函數知識,要想了解具體的,大家可從家中高中代數與幾何書中得到這一切。
  
  1.角的概念
  在平面內,角可以看作一條射線繞著它的端點旋轉而成的圖形。如圖,一條射線由原來的位置OA,繞著它的端點O按逆時方向旋轉到另一位置OB,就形成角a.旋轉開始時的射線OA叫做角a的始邊,旋轉終止時的射線OB叫做角a的終邊,射線的端點O叫做角a的頂點。習慣上,我們把按逆時針方向旋轉而成的角叫做正角;按順時針方向旋轉而成的角叫做負角.所有與a終邊相同的角包括a在內,可以用式子表示:a+K*360度,對應到Robocode的方向系統中,只要我們以機器人的heading方向做射線,延長到與屏幕交點處的角度就是我們機器人的heading角度。
  
 Java新學法之Robocode基本原理之坐標鎖定(下)(圖三)

  2.直角三角函數
  在△ABC中,∠a為直角,我們把銳角A的對邊與斜邊的比叫做∠A的正弦,記作sina;銳角a的鄰邊與斜邊的比叫做∠a的余弦,記作cosa,即
  
  sina=對邊BC/斜邊AB
  
  cosa=鄰邊AC/斜邊AB
  
Java新學法之Robocode基本原理之坐標鎖定(下)(圖四)

  3.單位圓和三角函數線
  半徑為1的圓叫做單位圓。設單位圓的圓心與坐標原點重合,則單位圓與x軸的交點分為別為A(1,0)、A′(-1,0),與y軸的交點分別為B(0,1)、B′(0,-1)。設角a的頂點在圓心O,始點與x軸的正半軸重合,終邊與單位圓相交于點P,過點P作PM垂直x軸于M,則由直角三角函數的定義可知:OM=cosa,MP=sina ,點P的坐標為(cosa,sina),即P(cosa,sina)。其中cosa=OM*1,sina=MP*1。Robocode中所有有關的坐標都可用這種方法求得。
  
  4.弧度制
  用度做單位來度量角的制度叫做角度制。數學和其他科學研究中常用另一種度量角的制度—弧度制。以角的頂點為圓心,以任意長的半徑作圓把這個角所對的弧長與半徑的比來衡量角的制度叫做弧度制.長度等于半徑的弧長叫1弧度。這段弧所對的圓心角的大小也是1弧度。通常單位“弧度”省略不寫。例:弧長為1.3325。單位就是弧度。由角度和弧度兩種單位之間的關系得到:2π弧度=360度,2/3π弧度=270度,π弧度=180度,1/2π弧度=90度,并可推出1弧度 = 360度/2π = 57°即 1弧度=角度*1

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永平县| 日喀则市| 永胜县| 元谋县| 科技| 普格县| 历史| 苍南县| 全椒县| 新化县| 吉首市| 大余县| 绍兴市| 连南| 凌源市| 健康| 鄄城县| 聂荣县| 赣榆县| 洪江市| 贡山| 大悟县| 潞西市| 广安市| 石棉县| 惠来县| 镇平县| 鹤峰县| 海城市| 涿鹿县| 灵丘县| 南开区| 阳原县| 凤翔县| 名山县| 高雄县| 尖扎县| 卓尼县| 包头市| 宁安市| 峡江县|