如何判断一个点在某方向线的左侧还是右侧

如何判断点在行驶方向的左侧、右侧或者路上?

走在公路上,行驶是有方向的,那么我们可以选公路上相邻两个点,取做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,说明在右侧

posted @ 2019-11-11 21:36  lanwei  阅读(5487)  评论(0编辑  收藏  举报