public static double estimateDistanceInFeet(Point p1, Point p2, long maxTimeDeltaInMillisec) {

        //using sythetic Points to estimate physcial distances is numerically unstable
        verifyTimeDeltaIsSmall(p1, p2, maxTimeDeltaInMillisec);

        Instant avgTime = Time.averageTime(p1.time(), p2.time());

        //this metric ignores time and only reflects distance (measured in feet)
        PointDistanceMetric metric = new PointDistanceMetric(0.0, 1.0);

        return metric.distanceBtw(
            projectPointAtNewTime(p1, avgTime),
            projectPointAtNewTime(p2, avgTime)
        );
    }
@Test
    public void testEstimateDistanceInFeet() {

        //1 knot -- due east
        Point testPoint = (new PointBuilder())
            .time(Instant.EPOCH)
            .latLong(0.0, 0.0)
            .altitude(Distance.ofFeet(0.0))
            .speedInKnots(1.0)
            .courseInDegrees(90.0)
            .build();

        //1 knot -- due west (1 second later)
        Point testPoint2 = (new PointBuilder())
            .time(Instant.EPOCH.plusSeconds(1L))
            .latLong(0.0, 0.0)
            .altitude(Distance.ofFeet(77.0)) //I am higher
            .speedInKnots(1.0)
            .courseInDegrees(270.0)
            .build();

        long MAX_TIME_DELTA = 1000L;

        double estimatedDist = Distances.estimateDistanceInFeet(testPoint, testPoint2, MAX_TIME_DELTA);

        assertEquals(
            77.0, estimatedDist, 0.0000001,
            "The Points should be at exactly that same Lat/Long at time = .5 sec"
        );

    }