检查点是否在两点之间

时间:2013-08-11 12:21:15

标签: java math point dot-product

我刚刚认出我的数学有点生锈..我想检查一下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的前面?

4 个答案:

答案 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 - Ac = 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积为负,如果是钝的,则积积为正。