Merge branch 'straight_to'

This commit is contained in:
Victor Shcherb 2020-02-18 19:25:19 +01:00
commit 90faab2e62
3 changed files with 39 additions and 66 deletions

View file

@ -697,39 +697,10 @@ public class MapUtils {
return new LatLon(Math.toDegrees(phi2), Math.toDegrees(lambda2)); return new LatLon(Math.toDegrees(phi2), Math.toDegrees(lambda2));
} }
public static double getVectorMagnitude(int startX, int startY, int endX, int endY) { public static double getSqrtDistance(int startX, int startY, int endX, int endY) {
return Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0)); return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY));
} }
//angle of vector
public static double getAngleForRadiusVector(int startX, int startY, int endX, int endY) {
return 2 * Math.atan((endY - startY) / (endX - startX
+ Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0))));
}
//returns coordinates of point on circle
public static double[] getCoordinatesFromRadiusAndAngle(double centerX, double centerY, double radius, double angle) {
double x = centerX + radius * Math.cos(angle);
double y = centerY + radius * Math.sin(angle);
return new double[]{x,y};
}
//returns signed angle between vectors in radians
public static double getAngleBetweenVectors(int vectorAStartX, int vectorAStartY, int vectorAEndX, int vectorAEndY,
int vectorBStartX, int vectorBStartY, int vectorBEndX, int vectorBEndY) {
int[] vectorA = new int[] {getVectorAxisValue(vectorAStartX, vectorAEndX), getVectorAxisValue(vectorAStartY, vectorAEndY)};
int[] vectorB = new int[] {getVectorAxisValue(vectorBStartX, vectorBEndX), getVectorAxisValue(vectorBStartY, vectorBEndY)};
return Math.atan2(vectorA[0] * vectorB[1] - vectorA[1] * vectorB [0], vectorA[0] * vectorB[0] + vectorA[1] * vectorB[1]);
}
//calculates vector value for axis
public static int getVectorAxisValue(int axisStart, int axisEnd) {
if (axisEnd < axisStart) {
return Math.abs(axisEnd) - Math.abs(axisStart);
} else {
return Math.abs(axisStart) - Math.abs(axisEnd);
}
}
} }

View file

@ -1154,6 +1154,13 @@ public class RouteCalculationResult {
return 0; return 0;
} }
public int getDistanceFromPoint(int locationIndex) {
if(listDistance != null && locationIndex < listDistance.length) {
return listDistance[locationIndex];
}
return 0;
}
public boolean isPointPassed(int locationIndex) { public boolean isPointPassed(int locationIndex) {
return locationIndex <= currentRoute; return locationIndex <= currentRoute;
} }

View file

@ -1148,44 +1148,39 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont
} }
private double[] calculateProjectionOnRoutePoint(List<Location> routeNodes, RoutingHelper helper, RotatedTileBox box) { private double[] calculateProjectionOnRoutePoint(List<Location> routeNodes, RoutingHelper helper, RotatedTileBox box) {
double[] projectionXY; double[] projectionXY = null;
boolean visible;
Location nextInRoute = null;
// TODO simplifiy all culation!
Location ll = helper.getLastFixedLocation(); Location ll = helper.getLastFixedLocation();
Location previousInRoute = routeNodes.get(helper.getRoute().getCurrentRoute() > 0 ? helper.getRoute().getCurrentRoute() - 1 : 0); RouteCalculationResult route = helper.getRoute();
if (helper.getRoute().getIntermediatePointsToPass() > 0) { List<Location> locs = route.getImmutableAllLocations();
for (int i = 1; i < routeNodes.size(); i++) { int cr = route.getCurrentRoute();
LatLon routePoint = new LatLon(routeNodes.get(i).getLatitude(), routeNodes.get(i).getLongitude()); int locIndex = locs.size() - 1;
if (routePoint.equals(helper.getIntermediatePoints().get(0))) { if(route.getIntermediatePointsToPass() > 0) {
nextInRoute = routeNodes.get(i); locIndex = route.getIndexOfIntermediate(route.getIntermediatePointsToPass() - 1);
}
if(ll != null && cr > 0 && cr < locs.size() && locIndex >= 0 && locIndex < locs.size()) {
Location loc1 = locs.get(cr - 1);
Location loc2 = locs.get(cr);
double distLeft = route.getDistanceFromPoint(cr) - route.getDistanceFromPoint(locIndex);
double baDist = route.getDistanceFromPoint(cr - 1) - route.getDistanceFromPoint(cr);
Location target = locs.get(locIndex);
double dTarget = ll.distanceTo(target);
final int aX = box.getPixXFromLonNoRot(loc1.getLongitude());
final int aY = box.getPixYFromLatNoRot(loc1.getLatitude());
final int bX = box.getPixXFromLonNoRot(loc2.getLongitude());
final int bY = box.getPixYFromLatNoRot(loc2.getLatitude());
if(baDist != 0) {
double CF = (dTarget - distLeft) / baDist;
double rX = bX - CF * (bX - aX);
double rY = bY - CF * (bY - aY);
projectionXY = new double[] {rX, rY};
} }
} }
} else { if(projectionXY != null) {
nextInRoute = routeNodes.get(routeNodes.size()-1);
}
if (nextInRoute != null && previousInRoute != null) { double distanceLoc2Proj = MapUtils.getSqrtDistance((int)projectionXY[0], (int) projectionXY[1],
box.getPixXFromLonNoRot(ll.getLongitude()), box.getPixYFromLatNoRot(ll.getLatitude()));
// double Ri = MapUtils.getDistance(nextInRoute, ll); boolean visible = box.containsPoint((float) projectionXY[0], (float) projectionXY[1], 20.0f)
// && distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0;
final int aX = box.getPixXFromLonNoRot(ll.getLongitude());
final int aY = box.getPixYFromLatNoRot(ll.getLatitude());
final int centerX = box.getPixXFromLonNoRot(nextInRoute.getLongitude());
final int centerY = box.getPixYFromLatNoRot(nextInRoute.getLatitude());
final int bX = box.getPixXFromLonNoRot(previousInRoute.getLongitude());
final int bY = box.getPixYFromLatNoRot(previousInRoute.getLatitude());
double radius = MapUtils.getVectorMagnitude(centerX, centerY, aX, aY);
double angle2 = MapUtils.getAngleForRadiusVector(centerX, centerY, bX, bY);
projectionXY = MapUtils.getCoordinatesFromRadiusAndAngle(centerX, centerY, radius, angle2);
double distanceLoc2Proj = MapUtils.getVectorMagnitude(aX, aY, (int)projectionXY[0], (int)projectionXY[1]);
boolean isProjectionOnSegment = MapUtils.getVectorMagnitude(centerX ,centerY, (int) projectionXY[0], (int) projectionXY[1])
< MapUtils.getVectorMagnitude(centerX, centerY, bX, bY);
visible = box.containsPoint((float)projectionXY[0], (float)projectionXY[1], 20.0f)
&& Math.abs(Math.toDegrees(MapUtils.getAngleBetweenVectors(centerX, centerY, aX, aY, centerX, centerY, bX, bY))) < 90
&& distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0
&& isProjectionOnSegment;
if (visible) { if (visible) {
return projectionXY; return projectionXY;
} }