[Home]History of LinearTargeting/Discussion

Robo Home | Changes | Preferences | AllPages


Revision 2 . . July 28, 2007 22:34 EST by Starrynte [my code]
Revision 1 . . September 27, 2004 23:48 EST by David Alves
  

Difference (from prior major revision) (no other diffs)

Changed: 20c20,96
Yeah, this page is a bit messy. I did look for your contribution... =) -- PEZ
Yeah, this page is a bit messy. I did look for your contribution... =) -- PEZ

Here's my code for it. Uses the trig method then checks for walls.

package ntc;
import robocode.*;
import java.awt.geom.*;
import java.awt.Color;

//run, movement, etc

public void onScannedRobot(ScannedRobotEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
double x=getX() + Math.sin(e.getBearingRadians()+getHeadingRadians())*e.getDistance();
double y=getY() + Math.cos(e.getBearingRadians()+getHeadingRadians())*e.getDistance();
Point2D.Double enemyPosition=new Point2D.Double(x,y);
Point2D.Double myPosition=new Point2D.Double(getX(),getY());

double ang=Math.asin((e.getVelocity()*Math.sin(e.getHeadingRadians()-(e.getBearingRadians()+getHeadingRadians())))/(20-(3*3)));
Line2D.Double enemyMovement=new Line2D.Double(enemyPosition, projectPoint(enemyPosition,e.getHeadingRadians(),1000));
Line2D.Double bulletMovement=new Line2D.Double(myPosition, projectPoint(myPosition,getHeadingRadians() + e.getBearingRadians()+ang,1000));
dist=new Line2D.Double(myPosition, enemyPosition);
eM=enemyMovement;
bM=bulletMovement;
//Tango's lineintersect method
Point2D.Double intersect=new Point2D.Double(0,0);//point you are actually firing at
double num = (enemyMovement.getY2()-enemyMovement.getY1())*(enemyMovement.getX1()-bulletMovement.getX1()) -
(enemyMovement.getX2()-enemyMovement.getX1())*(enemyMovement.getY1()-bulletMovement.getY1());

double denom = (enemyMovement.getY2()-enemyMovement.getY1())*(bulletMovement.getX2()-bulletMovement.getX1()) -
(enemyMovement.getX2()-enemyMovement.getX1())*(bulletMovement.getY2()-bulletMovement.getY1());

intersect.x = bulletMovement.getX1() + (bulletMovement.getX2()-bulletMovement.getX1())*num/denom;
intersect.y = bulletMovement.getY1() + (bulletMovement.getY2()-bulletMovement.getY1())*num/denom;
//nanos iterative lineintersectwithshape method
if(!field.contains(intersect)){ //is where you are firing at in the battlefield?
int TRACE_DEPTH = 8;
Point2D middle;
boolean containsFirst;
if ((containsFirst = field.contains(enemyMovement.getP1())) == field.contains(enemyMovement.getP2())){
}
for (int i = 0; i < TRACE_DEPTH; i++) {
middle = new Point2D.Double((enemyMovement.getX1() + enemyMovement.getX2()) / 2, (enemyMovement.getY1() + enemyMovement.getY2()) / 2);
if (containsFirst != field.contains(middle)){
enemyMovement = new Line2D.Double(enemyMovement.getP1(), middle);
}else{
enemyMovement = new Line2D.Double(middle, enemyMovement.getP2());
}
}
intersect.x=(enemyMovement.getX1() + enemyMovement.getX2()) / 2;
intersect.y=(enemyMovement.getY1() + enemyMovement.getY2()) / 2;
}
point=intersect;
ang=Math.atan2(intersect.getX()-myPosition.getX(),intersect.getY()-myPosition.getY());
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(ang-getGunHeadingRadians()));
setFire(3);
out.println(intersect);
out.println(enemyPosition);
}

public void onPaint(java.awt.Graphics2D g) {
g.setColor(Color.red);
g.fillOval((int)point.getX()-10,(int)(getBattleFieldHeight()-point.getY())-10,10,10);
g.drawLine((int)eM.getP1().getX(),(int)(getBattleFieldHeight()-eM.getP1().getY()),(int)eM.getP2().getX(),(int)(getBattleFieldHeight()-eM.getP2().getY()));
g.setColor(Color.green);
g.drawLine((int)bM.getP1().getX(),(int)(getBattleFieldHeight()-bM.getP1().getY()),(int)bM.getP2().getX(),(int)(getBattleFieldHeight()-bM.getP2().getY()));
g.setColor(Color.cyan);
g.drawLine((int)dist.getP1().getX(),(int)(getBattleFieldHeight()-dist.getP1().getY()),(int)dist.getP2().getX(),(int)(getBattleFieldHeight()-dist.getP2().getY()));
}

Point2D.Double projectPoint(Point2D.Double sourceLocation, double angle, double length) {
return new Point2D.Double(sourceLocation.getX() + Math.sin(angle) * length,
sourceLocation.getY() + Math.cos(angle) * length);
}
}

In the graphics, the red dot is where it's aiming for, the red line is the straight line iteration of the enemy movement, green line is path of bullet (without taking walls into account), and blue line is simply connecting you and the enemy so if you need to test the MEA you can use that...Although this does not use MEA --Starrynte

Robo Home | Changes | Preferences | AllPages
Search: