动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.判断鼠标双击.
.java设计模式之Command(菜单命令).
.CGLib实现变化字段探测的供能.
.用 Java 保存位图文件(转).
.Java 学习集中营 各种问题的分析.
.用Java SE 6.0实现高质量桌面集成.
.Java 在Client/Server 网络中的应.
.科学计算器.
.实战 Groovy: 用 Groovy 减少代码.
.JAVA编码问题的一些理解.
.EJB设计模式(3).
.利用Socket进行Java网络编程(三.
.Sun否认九月开源 还需“十几.
.Netscape服务器端编程技术.
.Pattens In Java(中文).
.10年回顾:世界各地开发高手谈Java.
.provision接口.
.Jscript 保留字.
.提高EJB性能的十大技巧.
.什么是 Enterprise JavaBeans 组.

Java新学法之Robocode基本原理之坐标锁定(下)

发表日期:2008-1-5 |



  至于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.println("genyX:"+ Math.round(genyX));
  
  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
上一篇:用 One-JAR 简化应用程序交付 人气:484
下一篇:对 Robocode 的创始人 Mat Nelson 的一次采访 人气:452
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号