[英]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.