/**
*
*/
package rampancy.standard;
import java.util.Comparator;
import java.util.*;
import rampancy.util.*;
import rampancy.util.data.kdTree.KDPoint;
/**
* @author Matthew Chun-Lum
*
*/
public class RDefaultKDPoint extends KDPoint {
public static final int WRONG_POINT_TYPE = 1000000;
public RRobotState enemyState;
public double guessFactor;
public RDefaultKDPoint(RRobotState state, double guessFactor) {
enemyState = state.getCopy();
this.guessFactor = guessFactor;
}
/* (non-Javadoc)
* @see rampancy.util.data.kdTree.KDPoint#distanceTo(rampancy.util.data.kdTree.KDPoint)
*/
@Override
public double distanceTo(KDPoint target) {
if(target instanceof RDefaultKDPoint) {
RDefaultKDPoint t = (RDefaultKDPoint) target;
RRobotState state = t.enemyState;
double dist = RUtil.square(enemyState.lateralVelocity - state.lateralVelocity);
dist += RUtil.square(enemyState.advancingVelocity - state.advancingVelocity);
dist += RUtil.square(enemyState.deltaH - state.deltaH);
dist += RUtil.square(enemyState.velocity - state.velocity);
dist += RUtil.square(enemyState.distanceFromWallCategory * 2 - state.distanceFromWallCategory * 2);
dist += RUtil.square(enemyState.timeSinceDirectionChange - state.timeSinceDirectionChange);
return dist;
}
return WRONG_POINT_TYPE;
}
// ------------ Comparison Functions -------------- //
public static List<Comparator<RDefaultKDPoint> > getComparators() {
ArrayList<Comparator<RDefaultKDPoint> > comparators = new ArrayList<Comparator<RDefaultKDPoint> >();
comparators.add(VELOCITY_COMPARE);
comparators.add(LATERAL_VEL_COMPARE);
comparators.add(DELTA_H_COMPARE);
comparators.add(DISTANCE_FROM_WALL_COMPARE);
comparators.add(TIME_SINCE_DIRECTION_CHANGE_COMPARE);
comparators.add(ADV_VEL_COMPARE);
return comparators;
}
public static final Comparator<RDefaultKDPoint> VELOCITY_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.velocity - s2.enemyState.velocity;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> LATERAL_VEL_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.lateralVelocity - s2.enemyState.lateralVelocity;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> ADV_VEL_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.advancingVelocity - s2.enemyState.advancingVelocity;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> DELTA_V_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.deltaV - s2.enemyState.deltaV;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> HEADING_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.heading - s2.enemyState.heading;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> DELTA_H_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.deltaH - s2.enemyState.deltaH;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> TIME_SINCE_STOP_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.timeSinceStop - s2.enemyState.timeSinceStop;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> TIME_SINCE_DIRECTION_CHANGE_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.timeSinceDirectionChange - s2.enemyState.timeSinceDirectionChange;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> TIME_SINCE_VELOCITY_CHANGE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.timeSinceVelocityChange - s2.enemyState.timeSinceVelocityChange;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> DISTANCE_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.distance - s2.enemyState.distance;
return RUtil.sign(res);
}
};
public static final Comparator<RDefaultKDPoint> DISTANCE_FROM_WALL_COMPARE = new Comparator<RDefaultKDPoint>() {
public int compare(RDefaultKDPoint s1, RDefaultKDPoint s2) {
double res = s1.enemyState.distanceFromWall - s2.enemyState.distanceFromWall;
return RUtil.sign(res);
}
};
}