繁体   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