簡體   English   中英

檢查點是否在兩點之間

[英]Check if a Point is between two Points

我剛剛認出我的數學有點生銹。我想檢查Point C is between Point A and Point B C可以在A和B的線段上,也可以不在。 可能有三種情況,我必須確定所有這些情況:

  • C在A和B之間

      C / \\ A---B 
  • C位於A和B的前面

     C \\ \\ A--B 
  • C位於A和B的后面

      C / / A--B 

最后兩點的“草圖”應該是一個三角形。

我使用dotproduct來檢查C是否介於A和B之間。

if (VectorOf(AB) * VectorOf(BC)) >= 0)

要檢查C是否位於A和B的后面,請使用以下命令:

if (VectorOf(AB) * VectorOf(BC)) < 0)

但是如何識別C是否在A和B的前面呢?

只需使用從B點開始的點積。

if (VectorOf(AC) * VectorOf(AB) < 0) {
    // C is on the left of A
}
else {
    if (VectorOf(BC) * VectorOf(BA) < 0) {
        // C is on the right of B
    }
    else {
        // C is between A and B
    }
}

或者,您可以計算相對於矢量AB的投影距離:

(VectorOf(AC) * VectorOf(AB)) / (VectorOf(AB) * VectorOf(AB))

在三種情況下,結果將是<0,介於0和1之間,或> 1,如下面的數學運算所示:

      C
     /│
    / │
   /  │
──A── H ─────B─────

點積的定義是

AC · AB = AC×AB×cos(Â)= AH×AB(如果C離開A,則簽名:否定,如果C在右邊,則為正)。

AB · AB =AB²(正)

划分的結果是簽署的比率AH / AB:

-   0          1   >1
────A── H ─────B─────

如何使用坐標:

Between: a.x > c.x > b.x || a.x < c.x < b.x
Front: c.x < a.x && b.x
Back: c.x > b.x && a.x

我假設A,B不一定具有相同的Y坐標,即使這是圖表所暗示的。 你會想要使用矢量投影

b = B - Ac = C - A ,則投影為: u = dot(b,c) / |b|

前面: u < 0 ; 介於: 0 <= u <= |b| ; 返回: |b| < u |b| < u

或: u = dot(b,c) / dot(b,b)

前面: u < 0 ; 介於: 0 <= u <= 1 ; 回: 1 < u

似乎根據你的定義,如果角度CAB和ABC都是銳角,則點C在“A”和“B之間”,AB的前面是角度CAB是鈍角,而如果角度ABC是鈍角,則在AB后面。

您可以使用點積來查找角度是銳角還是鈍角:如果XYZ是銳角,則XY·YZ的doc積是負的,如果它是鈍的,則dot積是正的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM