1

我刚刚意识到我的数学有点生疏了。我想检查一下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 
    

最后两点的“草图”应该是一个三角形。

我使用点积来检查 C 是否在 A 和 B 之间。

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

要检查 C 是否在 A 和 B 的后面,我使用以下命令:

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

但是如何识别C是否在A和B前面呢?

4

4 回答 4

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))

结果将是 < 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─────
于 2013-08-11T12:32:49.730 回答
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
于 2013-08-11T12:25:55.033 回答
0

我假设 A,B 不一定具有相同的 Y 坐标,即使这是图表所暗示的。你会想使用矢量投影

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

于 2013-08-11T12:34:38.847 回答
0

似乎根据您的定义,如果角 CAB 和 ABC 都是锐角,那么点 C 在 A 和 B“之间”,AB 的前面是角 CAB 是钝角,如果角 ABC 是钝角,则在 AB 的后面。

您可以使用点积来确定角度是锐角还是钝角:如果 XYZ 是锐角,则 XY·YZ 的 doc 积为负,如果是钝角,则点积为正。

于 2013-08-11T12:35:01.123 回答