1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
package tim.prune.function;
import tim.prune.data.*;
/** General utility methods for creating new DataPoint objects */
public abstract class PointUtils
{
/**
* Project the given data point and create a new one in the calculated position
*/
public static DataPoint projectPoint(DataPoint inPoint, double inBearingRadians, double inDistanceRadians)
{
final double origLatRads = Math.toRadians(inPoint.getLatitude().getDouble());
final double origLonRads = Math.toRadians(inPoint.getLongitude().getDouble());
double lat2 = Math.asin(Math.sin(origLatRads) * Math.cos(inDistanceRadians)
+ Math.cos(origLatRads) * Math.sin(inDistanceRadians) * Math.cos(inBearingRadians));
double lon2 = origLonRads + Math.atan2(Math.sin(inBearingRadians) * Math.sin(inDistanceRadians) * Math.cos(origLatRads),
Math.cos(inDistanceRadians) - Math.sin(origLatRads) * Math.sin(lat2));
return new DataPoint(Math.toDegrees(lat2), Math.toDegrees(lon2));
}
/**
* Interpolate between the two given points
* @param inStartPoint start point
* @param inEndPoint end point
* @param inFrac fractional distance from first point (0.0 to 1.0)
* @return new DataPoint object between two given ones
*/
public static DataPoint interpolate(DataPoint inStartPoint, DataPoint inEndPoint, double inFrac)
{
if (inStartPoint == null || inEndPoint == null) {
return null;
}
DataPoint result = new DataPoint(
Latitude.interpolate(inStartPoint.getLatitude(), inEndPoint.getLatitude(), inFrac),
Longitude.interpolate(inStartPoint.getLongitude(), inEndPoint.getLongitude(), inFrac),
Altitude.interpolate(inStartPoint.getAltitude(), inEndPoint.getAltitude(), inFrac)
);
if (inStartPoint.hasTimestamp() && inEndPoint.hasTimestamp())
{
String value = TimestampUtc.interpolate(inStartPoint.getTimestamp(), inEndPoint.getTimestamp(), inFrac);
result.setFieldValue(Field.TIMESTAMP, value, false);
}
return result;
}
/**
* Interpolate a point between two points given an index and number of points
* @param inEndPoint end point of interpolation
* @param inIndex the index of this interpolation (0 to inNumPoints-1)
* @param inNumPoints number of points to generate
* @return the interpolated DataPoint
*/
public static DataPoint interpolate(DataPoint inStartPoint, DataPoint inEndPoint, int inIndex, int inNumPoints)
{
final double frac = 1.0 * (inIndex+1) / (inNumPoints + 1);
return interpolate(inStartPoint, inEndPoint, frac);
}
}
|