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

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

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

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

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

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

  
圖5

  
  對比一下上面的數(shù)據(jù),不管目標GenyMove在哪GenyRadar都能得到它精確的坐標。是不是有一種成就感!是的,敵人已經(jīng)完全在我們的把握之中。即使它在移動中也無法擺脫我們雷達的掃描控制。這里只是很簡單舉了一些例子,GenyMove在每一個時間周期(有關(guān)時間周期的說明見的Rock 'em, sock 'em Robocode: Round 2)移動自己的位置并打印出移動后的坐標,而GenyRadar掃描系統(tǒng)不停的掃描目標,并一直追蹤,同時打印出掃描到的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); //角度轉(zhuǎn)為弧度
  
  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的角度求得兩者的角度差也即我們雷達要旋轉(zhuǎn)的角度。最后利用一個小技巧radar_degree = bearing * 1.3 使雷達在目標的范圍左右擺動以擴大雷達掃描區(qū)域.這樣不管目標往哪邊移動都在自己的雷達掃描區(qū)內(nèi)。
  
  在此沒有進行很具體的講解了,我想憑你學到的方向及坐標知識很快能明白個中原理并設(shè)計出自己的高級掃描機器人來。 聰明的你可能會興奮的想,哈,我的炮管用相同的辦法鎖定目標,這樣敵人不就沒辦法跑了,被我追著打。答案是錯誤的,雷達的掃描是條長線能直接定位到目標上 ,它到目標的時間差幾乎為零,并且雷達的掃描范圍比炮管大且精確。而炮管每時間周期只有20度,它定位目標是依靠著子彈,只有子彈打中了目標,才能說炮管的計算坐標是精確的。但是由于子彈 到達目標位置時需要一定的時間差,子彈本身又有速度值(20-3*power),所以要想炮管鎖定目標并讓子彈擊中目標,我們還得經(jīng)過精確的計算,并要猜測目標可能的行動:是直線前進,還是做圓周運動,還是隨機運動等等。 這些都是我們要充分考慮的因素。是不是很有挑戰(zhàn)性!這一切都在Robocode的世界中等待著您的創(chuàng)造!
  
  三角函數(shù)基礎(chǔ)
  下面我們只是很簡單的介紹了一下與Robocode相關(guān)的三角函數(shù)知識,要想了解具體的,大家可從家中高中代數(shù)與幾何書中得到這一切。
  
  1.角的概念
  在平面內(nèi),角可以看作一條射線繞著它的端點旋轉(zhuǎn)而成的圖形。如圖,一條射線由原來的位置OA,繞著它的端點O按逆時方向旋轉(zhuǎn)到另一位置OB,就形成角a.旋轉(zhuǎn)開始時的射線OA叫做角a的始邊,旋轉(zhuǎn)終止時的射線OB叫做角a的終邊,射線的端點O叫做角a的頂點。習慣上,我們把按逆時針方向旋轉(zhuǎn)而成的角叫做正角;按順時針方向旋轉(zhuǎn)而成的角叫做負角.所有與a終邊相同的角包括a在內(nèi),可以用式子表示:a+K*360度,對應(yīng)到Robocode的方向系統(tǒng)中,只要我們以機器人的heading方向做射線,延長到與屏幕交點處的角度就是我們機器人的heading角度。
  
 Java新學法之Robocode基本原理之坐標鎖定(下)(圖三)

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: www国产成人免费观看视频 | 在线观看免费av网 | 中国女人内谢8xxxxxx在 | 九九热九九热 | 毛片免费大全短视频 | 久久这 | 日韩大片在线永久观看视频网站免费 | 成人影片在线免费观看 | 免费观看高清视频网站 | 操操操操操 | 欧美日韩在线播放一区 | 极品大长腿啪啪高潮露脸 | 欧美精品免费一区二区三区 | 国产精品视频免费网站 | 欧美日韩国产成人在线 | 一级做受毛片免费大片 | 久久久噜噜噜久久熟有声小说 | 久久经典| 日本精品黄色 | 九九热精品在线播放 | 一区二区久久电影 | 亚洲精品3 | 亚洲欧美日韩免费 | 国产成人精品一区在线播放 | 日本a v免费观看 | 日美av在线| 亚洲精品动漫在线观看 | 视频一区二区国产 | av电影免费观看 | 在线天堂中文在线资源网 | 蜜桃精品视频在线观看 | av黄色在线免费观看 | 国产女做a爱免费视频 | 国产精品美女久久久久久不卡 | 欧美精品成人一区二区三区四区 | 免费人成年短视频在线观看网站 | 国产精品久久二区 | 国产一区二区三区四区在线 | 亚洲国产精品久久久久久久久久 | av在线等 | 国产一区视频观看 |