如何判斷一個點在某方向線的左側還是右側


如何判斷點在行駛方向的左側、右側或者路上?

走在公路上,行駛是有方向的,那么我們可以選公路上相鄰兩個點,取做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,說明在右側


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM