Difference between revisions of "User:Chase-san/MovSim"
Jump to navigation
Jump to search
(Created page with 'This is the move simulator I created, for use in Precise Prediction, it was influenced by Albert's Precise Prediction code. Unlike his it doesn't handle di…') |
(forgot wall handling) |
||
Line 75: | Line 75: | ||
x += velocity * Math.sin(heading); | x += velocity * Math.sin(heading); | ||
y += velocity * Math.cos(heading); | y += velocity * Math.cos(heading); | ||
+ | |||
+ | if (x < 18 || y < 18 || x > fieldW - 18 || y > fieldH - 18) { | ||
+ | angleToTurn = 0; | ||
+ | velocity = 0; | ||
+ | x = Math.max(18, Math.min(fieldW - 18, x)); | ||
+ | y = Math.max(18, Math.min(fieldH - 18, y)); | ||
+ | } | ||
} | } | ||
return new MovSim2Stat(x,y,velocity,heading,Utils.normalRelativeAngle(heading - lastHeading)); | return new MovSim2Stat(x,y,velocity,heading,Utils.normalRelativeAngle(heading - lastHeading)); |
Revision as of 08:49, 4 July 2010
This is the move simulator I created, for use in Precise Prediction, it was influenced by Albert's Precise Prediction code. Unlike his it doesn't handle distance, but that is a very complicated set of code (which I might add later if there is a need).
package chase.na.semove;
import robocode.Rules;
import robocode.util.Utils;
public class MovSim2 {
//New DeAccel Rule, cannot go from -1 to 1, would go from -1 to 0.5
public static final boolean useNewDeaccelRule = false;
//For Dead Code
@SuppressWarnings("all")
public static final MovSim2Stat step(double x, double y, double velocity, double maxVelocity,
int direction, double heading, double angleToTurn, double fieldW, double fieldH) {
////////////////
//Heading
double lastHeading = heading;
double turnRate = Rules.getTurnRateRadians(velocity);
if(Math.abs(angleToTurn) < turnRate) heading += angleToTurn;
else heading += turnRate * Math.signum(angleToTurn);
heading = Utils.normalAbsoluteAngle(heading);
////////////////
//Movement
if(direction != 0 || velocity != 0.0) {
////////////////
//Acceleration
double acceleration = 0;
double absVelocity = Math.abs(velocity);
//Check if we are stopping!
if(direction == 0) {
//Slow to a stop!
acceleration = Rules.DECELERATION;
if(absVelocity < acceleration)
acceleration = -velocity;
} else {
if(velocity == 0.0) {
//We can only speed up from here
acceleration = Rules.ACCELERATION;
if(acceleration > maxVelocity)
acceleration = maxVelocity;
} else {
//Check if we are speeding up
if(Math.signum(velocity) == direction
&& absVelocity < maxVelocity) {
acceleration = Rules.ACCELERATION;
if(absVelocity + acceleration > maxVelocity)
acceleration = maxVelocity - absVelocity;
} else {
//We are slowing down, this is more complicated
if(absVelocity < Rules.DECELERATION && useNewDeaccelRule) {
double beyondZero = Math.abs(absVelocity - Rules.DECELERATION);
acceleration = -((absVelocity - beyondZero) + beyondZero / 2.0);
} else {
acceleration = -Rules.DECELERATION;
//If we are slowing down in the same direction
if(Math.signum(velocity) == direction)
acceleration = maxVelocity - absVelocity;
}
}
}
}
acceleration *= direction;
////////////////
//Velocity
velocity = Math.min(Math.max(-Rules.MAX_VELOCITY,
velocity + acceleration), Rules.MAX_VELOCITY);
////////////////
//Position
x += velocity * Math.sin(heading);
y += velocity * Math.cos(heading);
if (x < 18 || y < 18 || x > fieldW - 18 || y > fieldH - 18) {
angleToTurn = 0;
velocity = 0;
x = Math.max(18, Math.min(fieldW - 18, x));
y = Math.max(18, Math.min(fieldH - 18, y));
}
}
return new MovSim2Stat(x,y,velocity,heading,Utils.normalRelativeAngle(heading - lastHeading));
}
}
class MovSim2Stat {
public double x, y;
public double v, h, w; //w = heading change
public MovSim2Stat(double x, double y, double v, double h, double w) {
this.x = x;
this.y = y;
this.v = v;
this.h = h;
this.w = w;
}
}