Java 如何判断点位于线段的左侧还是右侧?

Java 如何判断点位于线段的左侧还是右侧?,java,math,processing,line,Java,Math,Processing,Line,如果我们有一个线段(a.x,a.y,B.x,B.y)和一个点(C.x,C.y),我如何判断该点是在线段的左侧还是右侧,还是顶部还是底部?我在以前的文章中尝试过涉及交叉产品的解决方案,但这导致了另一个问题。使用叉积使得A和B的顺序很重要。还有什么其他方法使A和B的顺序不重要 以前职位的解决方案: 使用向量行列式(AB,AM)的符号,其中M(X,Y)是查询点: 位置=符号((Bx-Ax)*(Y-Ay)-(By-Ay)*(X-Ax)) 直线上为0,一侧为+1,另一侧为-1 来源:(我假设笛卡尔坐标系的

如果我们有一个线段
(a.x,a.y,B.x,B.y)
和一个点
(C.x,C.y)
,我如何判断该点是在线段的左侧还是右侧,还是顶部还是底部?我在以前的文章中尝试过涉及交叉产品的解决方案,但这导致了另一个问题。使用叉积使得A和B的顺序很重要。还有什么其他方法使A和B的顺序不重要

以前职位的解决方案:

使用向量行列式(AB,AM)的符号,其中M(X,Y)是查询点:

位置=符号((Bx-Ax)*(Y-Ay)-(By-Ay)*(X-Ax))

直线上为0,一侧为+1,另一侧为-1

来源:

(我假设笛卡尔坐标系的正x和y分别指向右侧和上方)

给定一条穿过点(a,b)、(c,d)的直线,其方程为:

现在你有一个点(e,f)。如果你替换x=e,y=f,它们满足方程,这意味着点在直线上

如果等式的左侧更大,则意味着您的点位于直线的顶部。如果等式的右边更大,那意味着你的点在直线下

为了计算左/右,你也需要考虑梯度。如果梯度为正,低于该线意味着你在它的右边。如果梯度为负,则低于该线意味着您位于该线的左侧。反之亦然

请注意,您需要将垂直线作为特例处理

在爪哇

double lhs = e;
double gradient = (b - d)/(a - c);
if (Double.isInfinite(gradient)) {
    // vertical line, compare only x coordinates
    if (e < a) {
        // on the left
    } else if (e > a) {
        // on the right
    } else {
        // on the line
    }
}
double rhs = (gradient * (e - a)) + b;
if (lhs > rhs) {
    if (gradient > 0) {
        // on the left
    } else if (gradient < 0) {
        // on the right
    } else {
        // on the top
    }
} else if (lhs < rhs) {
    if (gradient > 0) {
        // on the right
    } else if (gradient < 0) {
        // on the left
    } else {
        // below
    }
} else {
    // on the line
}
double lhs=e;
双梯度=(b-d)/(a-c);
if(双isInfinite(梯度)){
//垂直线,仅比较x坐标
if(ea){
//在右边
}否则{
//在线
}
}
双rhs=(梯度*(e-a))+b;
如果(左侧>右侧){
如果(梯度>0){
//在左边
}else if(梯度<0){
//在右边
}否则{
//在顶端
}
}否则如果(左侧<右侧){
如果(梯度>0){
//在右边
}else if(梯度<0){
//在左边
}否则{
//下面
}
}否则{
//在线
}
要证明重新排列点的顺序不会改变结果,非常简单。更改点的顺序会生成此方程式(a更改为c,b更改为d):

如果你展开上面的方程和一开始的方程,你会发现它们实际上是同一个方程,即:


找到直线方程(y=mx+c)并代入x和y,然后比较LHS和RHS,看哪个更大?这听起来有点奇怪。。。左侧和右侧是依赖于方向的构件。如果你旋转180度,你的左变成右。。。因此,不考虑方向(A和B的顺序)的情况下计算某个东西是否在左边听起来是错误的。如果你所说的“左”和“右”在x轴上更远更近,那么你可以简单地使用旧方法,如果B.x