}
}
}
public Collision getCollision(Polygon relStatic, Polygon relDynamic, Vector relVelocity) {
Vector backVelocity = new Vector(relVelocity).flip().normalise();
List<Collision> frontFaces = new LinkedList<Collision>();
List<Collision> backFaces = new LinkedList<Collision>();
List<Collision> zeroFaces = new LinkedList<Collision>();
Vector n = new Vector();
final int size1 = relStatic.getSize();
for (int i = 0; i < size1; i++) {
n = relStatic.getNormal(i);
double nDistance = relStatic.getMaxProjection(i) - Physics.minProjection(relDynamic, n);
double nVelocity = relVelocity.dot(n);
double nTime = nDistance / nVelocity;
if (Rough.equal(nDistance, 0) && Rough.equal(nVelocity, 0)) {
// Sliding along this face
zeroFaces.add(new Collision(Double.NaN, new Vector(n), backVelocity));
} else if (Double.compare(nVelocity, 0) < 0) { // -0.0 and below
// This is a front face
frontFaces.add(new Collision(nTime, new Vector(n), backVelocity));
} else if (Double.compare(nVelocity, 0) >= 0) { // +0.0 and above
// This is a back face
backFaces.add(new Collision(nTime, new Vector(n), backVelocity));
}
}
final int size2 = relDynamic.getSize();
for (int i = 0; i < size2; i++) {
n = relDynamic.getNormal(i);
double nDistance = relDynamic.getMaxProjection(i) - Physics.minProjection(relStatic, n);
n.flip();
double nVelocity = relVelocity.dot(n);
double nTime = nDistance / nVelocity;
if (Rough.equal(nDistance, 0) && Rough.equal(nVelocity, 0)) {
// Sliding along this face
zeroFaces.add(new Collision(Double.NaN, new Vector(n), backVelocity));
} else if (Double.compare(nVelocity, 0) < 0) { // -0.0 and below
// This is a front face
frontFaces.add(new Collision(nTime, new Vector(n), backVelocity));
} else if (Double.compare(nVelocity, 0) >= 0) { // +0.0 and above
// This is a back face
backFaces.add(new Collision(nTime, new Vector(n), backVelocity));
}
}
// Find the last entry normal
double lastEntry = Double.NEGATIVE_INFINITY;