[英]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 - A
, c = 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.