@Override public double getRange(double distance, double phi) throws Exception { double sc[] = new double[3]; for (int x_deg = 0; x_deg <= 2; x_deg++) { sc[x_deg] = 0; double yy = 1; for (int y_deg = 0; y_deg <= 2; y_deg++, yy *= distance) sc[x_deg] += c[x_deg][y_deg] * distance; } double R = Double.POSITIVE_INFINITY; for (double x : ParabolicSurface.findRoots(sc[2], sc[1] - Math.tan(phi), sc[0])) R = Math.min(R, Math.abs(x / Math.cos(phi))); return R; }
public void testParabolicSurface() throws Exception { double C = 10.0; double leftwall = -16.0, rightwall = 16.1, floor = 12.0; ParabolicSurfaceParams[] P = new ParabolicSurfaceParams[1]; P[0] = new ParabolicSurfaceParams(); P[0].A = 0; P[0].B = 0; P[0].C = C; P[0].W = 100; ParabolicSurface surface = new ParabolicSurface(P, leftwall, rightwall, floor); assertEquals(-16.0, surface.leftwall); assertEquals(16.1, surface.rightwall); assertEquals(12.0, surface.floor); double eps = 0.00001; // testLeftWall assertEquals(Math.abs(surface.leftwall), surface.testWallsFloor(Math.PI / 2), eps); assertEquals(Math.abs(surface.leftwall), surface.getRange(0, Math.PI / 2)); // testRightWall assertEquals(Math.abs(surface.rightwall), surface.testWallsFloor(-Math.PI / 2), eps); assertEquals(Math.abs(surface.rightwall), surface.getRange(0, -Math.PI / 2)); // testFloor assertEquals(Double.POSITIVE_INFINITY, surface.testWallsFloor(0), eps); assertEquals(surface.floor, surface.testWallsFloor(Math.PI), eps); assertEquals(surface.floor * Math.sqrt(2), surface.testWallsFloor(Math.PI - Math.PI / 4), eps); assertEquals(surface.floor * Math.sqrt(2), surface.testWallsFloor(Math.PI + Math.PI / 4), eps); assertEquals(C * Math.sqrt(2), surface.getRange(0, Math.PI / 4), eps); double save = surface.floor; surface.floor = 9.12; assertEquals(surface.floor, surface.testWallsFloor(Math.PI)); assertEquals(surface.floor, surface.getRange(0, Math.PI)); surface.floor = save; assertEquals(C, surface.getRange(0, 0)); assertEquals( surface.floor * Math.sqrt(2), surface.testWallsFloor(Math.PI / 2 + Math.PI / 4), eps); assertEquals(C * Math.sqrt(2), surface.getRange(0, -Math.PI / 4), eps); for (double phi = -Math.PI / 4 + Math.PI; phi < Math.PI / 4 + Math.PI; phi += 0.1) assertEquals(C, surface.getRange(0, phi) * -Math.cos(phi), eps); }