예제 #1
0
 @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;
 }
예제 #2
0
파일: TestAll.java 프로젝트: stden/volume
  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);
  }