static Point projectPointAtNewTime(Point point, Instant newTime) {

        //skip projection when data doesn't support it
        if (point.speed() == null || point.course() == null) {
            return new PointBuilder(point).time(newTime).build();
        }

        Duration timeDelta = Duration.between(point.time(), newTime);

        //can be negative....but that's ok..
        double distanceInNM = distTraveledInNM(point.speed().inKnots(), timeDelta);

        LatLong startPoint = point.latLong();
        LatLong endPoint = startPoint.projectOut(point.course().inDegrees(), distanceInNM);

        return new PointBuilder(point)
            .latLong(endPoint)
            .time(newTime)
            .build();
    }
@Test
    public void testProjectPointAtNewTime() {

        Point testPoint = (new PointBuilder())
            .time(Instant.EPOCH)
            .latLong(0.0, 0.0)
            .altitude(Distance.ofFeet(0.0))
            .build();

        Instant newTime = Instant.EPOCH.plusSeconds(1L);

        Point projection = Distances.projectPointAtNewTime(testPoint, newTime);

        assertTrue(projection.time().equals(newTime));
        assertTrue(projection != testPoint);
        assertTrue(projection.latLong().latitude() == 0.0);
        assertTrue(projection.latLong().longitude() == 0.0);
        assertTrue(projection.altitude().inFeet() == 0.0);
    }