如何判断点在行驶方向的左侧、右侧或者路上?
走在公路上,行驶是有方向的,那么我们可以选公路上相邻两个点,取做OA,OA两个点不能重合,否则就没法判断了,油站的点S以及S1,如下图:
其实可以明显看出油站方向,如果油站少,我们可以人工标记,但是由于数量的问题,通过人力来处理就浪费了大量人力,财力。
那么如何通过程序判断?
假设
这里首先需要做一部分假设,假设公路的上取得两个点与给的油站得点在同一个平面内,主要是地球大,取得公路两点与油站的点,可以忽略是曲面。
高中、大学的代数知识
其实要解决这个问题,会用到高中或者大学大一我们学过的关于向量矩阵那块的知识。现在有点久了,好多都忘记了。大学高等代数只不过涉及的纬度比多,我们这里牵涉2维,所以使用高中代数就可以解决。
高中数学里有个向量积的知识点:如下公式,注意i,j分别是x轴,y轴的单位向量,a(x, y),b(x,y)
其实也是右手定则。大伙可以查下右手定则,就可以判断方向了。
解决
现在OA可以看作是O到A的向量,OS看作是O到S的向量,如果由于我们要看S是在公路的那一侧,那么我们就是要看OAXOS的出的结果。
代码如下:
public class DirectionTest {
public static void main(String[] args) {
Point startPoint = Point.builder().x(104.069544).y(30.530316).build();
Point endPoint = Point.builder().x(104.069603).y(30.528352).build();
Point vectorRoad = getVector(startPoint, endPoint);
Point gasStationPoint = Point.builder().x(104.068835).y(30.528935).build();
Point vectorGasStation = getVector(startPoint, gasStationPoint);
Double direction = vectorRoad.getX() * vectorGasStation.getY() - vectorRoad.getY() * vectorGasStation.getX();
if (direction < 0) {
System.out.println("在公路右侧");
} else if (direction == 0) {
System.out.println("在公路上");
} else {
System.out.println("在公路左侧");
}
}
private static Point getVector(Point startPoint, Point endPoint) {
return Point.builder().x(endPoint.getX() - startPoint.getX()).y(endPoint.getY() - startPoint.getY()).build();
}
@Data
@Builder
@AllArgsConstructor
static class Point {
private double x;
private double y;
}
}
根据右手定则结论:
如果结果大于0,说明在行驶方左侧,
如果等于0,说明就在线上,
如果小于0,说明在右侧