Java 检查点是否位于两点之间

Java 检查点是否位于两点之间,java,math,point,dot-product,Java,Math,Point,Dot Product,我刚认识到我的数学有点生疏。。我想检查点C是否在点A和点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 C / / A--B 最后两点中的“草图”应为三角形 我使用dotproduct检查C是

我刚认识到我的数学有点生疏。。我想检查点C是否在点A和点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
    
           C  
       /  /
      A--B 
    
最后两点中的“草图”应为三角形

我使用dotproduct检查C是否在A和B之间

if (VectorOf(AB) * VectorOf(BC)) >= 0)
要检查C是否在A和B的后面,我使用以下方法:

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

但是如何识别C是否在A和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.x>c.x>b.x | | a.xb.x&&a.x

只需从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
    }
}
在三种情况下,结果将是<0,介于0和1之间,或>1,如下所示:

      C
     /│
    / │
   /  │
──A── H ─────B─────
点积的定义是

AC·AB=AC×AB×cos(有符号:如果C位于A的左侧,则为负;如果C位于A的右侧,则为正)

AB·AB=AB²(正)

除法的结果是符号比率AH/AB:

-   0          1   >1
────A── H ─────B─────

我假设A,B不一定有相同的Y坐标,即使这是图表所建议的。你会想用

b=b-A
c=c-A
,则投影为:
u=dot(b,c)/| b


正面:
u<0
;介于:
0根据您的定义,如果角CAB和ABC都是锐角,则点C在A和B之间;如果角ABC是钝角,则点A-B的前面是角CAB,后面是角ABC

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