我刚刚认出我的数学有点生锈..我想检查一下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的前面?
答案 0 :(得分:3)
只需使用从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))
结果将是&lt; 0,介于0和1之间,或>在你的三个案例中有1个,如下面的数学所示:
C
/│
/ │
/ │
──A── H ─────B─────
点积的定义是
AC · AB = AC×AB×cos(Â)= AH×AB(签名:如果C离开A则为负数,如果C为C则为正数右)。
AB · AB =AB²(正面)
除法的结果是签署的比率AH / AB:
- 0 1 >1
────A── H ─────B─────
答案 1 :(得分:0)
如何使用坐标:
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
答案 2 :(得分:0)
我假设A,B不一定具有相同的Y坐标,即使这是图表所暗示的。您可能希望使用vector projection。
让b = B - A
,c = C - A
,然后投影为:u = dot(b,c) / |b|
,
前线:u < 0
;之间:0 <= u <= |b|
;返回:|b| < u
。
或:u = dot(b,c) / dot(b,b)
,
前线:u < 0
;之间:0 <= u <= 1
;返回:1 < u
答案 3 :(得分:0)
似乎根据你的定义,如果角度CAB和ABC都是锐角,则点C在“A和B之间”,AB的前面是角度CAB是钝角,而如果角度ABC是钝角,则在AB后面。
您可以使用点积来查找角度是锐角还是钝角:如果XYZ是锐角的,则XY·YZ的doc积为负,如果是钝的,则积积为正。