package baseRobot; import robocode.*; import java.util.*; /** * ロボットツールクラス * * @author Fumi Iseki * @version 1.0 */ public class RoboTool { private BaseRobot myRobo; /** * コンストラクタ */ public RoboTool(BaseRobot robo) { myRobo = robo; } /** * ロボットのサイズを取得する. */ public double getRoboSize() { double hei = myRobo.getHeight(); double wid = myRobo.getWidth(); return Math.sqrt(hei*hei+wid*wid); } /** * 現地点から、ポイント(x, y)への(右回りの)相対角度を返す.返す角度は -180〜180 */ public double getRelAngle(double x, double y, double hd) { double kd = 90 - Math.atan2(y-myRobo.getY(), x-myRobo.getX())/Math.PI*180; if (kd<0) kd = kd + 360; return getRelAngle(kd, hd); } /** * 絶対角度 hdから gdへの(右回りの)相対角度を返す.返す角度は -180〜180 */ public static double getRelAngle(double gd, double hd) { double kd = gd - hd; if (kd<-180) return kd + 360; else if (kd>180) return kd - 360; return kd; } /** * 現地点から、ポイント(x, y)への距離を返す. */ public double getRelDistance(double x, double y) { double xx = x - myRobo.getX(); double yy = y - myRobo.getY(); return Math.sqrt(xx*xx + yy*yy); } /** * 相対(自機中心)極座標系(r, kd)を絶対デカルト座標系(x, y)に変換する. * kdは上が0度の右回り0〜360度形式. */ public Vector getAbsDescart(double rr, double kd) { Vector vt = new Vector(); double th = (0.5 - kd/180)*Math.PI; vt.x = rr*Math.cos(th) + myRobo.getX(); vt.y = rr*Math.sin(th) + myRobo.getY(); return vt; } /** * 絶対デカルト座標系(x, y)を相対(時機中心)極座標系(r, kd)に変換する. * 返す角度は 0〜360度.ただし,上が0度の右回り. */ public Vector getRelPolar(double x, double y) { Vector vt = new Vector(); double xx = x - myRobo.getX(); double yy = y - myRobo.getY(); double kd = 90 - Math.atan2(yy, xx)/Math.PI*180; if (kd<0) kd = kd + 360; vt.x = Math.sqrt(xx*xx + yy*yy); vt.y = kd; return vt; } /** * ゼロ(もしくはゼロと同等)かどうかをチェックする。 */ public static boolean isZero(double a) { if (Math.abs(a)