指向线距(2D)和交点坐标

时间:2012-03-05 12:56:48

标签: java c++ math geometry trigonometry

所以我需要知道从一个点到另一个线的距离(在2D空间中),给定两条线的坐标(AB)。

这是我到目前为止所做的:

public double pointToLineDistance(Point A, Point B, Point P)
{
    double normalLength = Math.sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
    return Math.abs((P.x - A.x) * (B.y - A.y) - (P.y - A.y) * (B.x - A.x)) / normalLength;
}

但我还需要得到垂直线与AB线相交的点的坐标(如果它在该段之外,它就没问题。)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

观察AB可以表示为

ab = A + (B - A) * s

因此,AB的方向是B - A(B.x - A.x, B.y - A.y)。方向为(A.y - B.y, B.x - A.x)的线将垂直。 (我们只是交换x和y并否定其中一个。)

我们特别想要一条垂直于AB并且也穿过P的线,所以我们做

perp = P + (A.y - B.y, B.x - A.x) * t;
perp = (P.x + A.y - B.y, P.y + B.x - A.x) * t;

现在只需找到此垂直线与AB之间的交点。你有两个方程(交叉点的x和y分量)和两个未知数(s和t)。一旦找到s和t,将它们插入到任一行的方程中以得到交点。

以下是一些有效的代码:

static Vect2 getIntersection(Vect2 A, Vect2 B, Vect2 P) {
    Vect2 abDir = B.minus(A);
    Vect2 perpDir = new Vect2(-abDir.y, abDir.x);
    Vect2 apDir = P.minus(A);
    double s = (perpDir.y * apDir.x - perpDir.x * apDir.y)
             / (abDir.x * perpDir.y - abDir.y * perpDir.x);
    return A.plus(abDir.scale(s));
}

class Vect2 {
    final double x, y;

    Vect2(double x, double y) {
        this.x = x;
        this.y = y;
    }

    Vect2 scale(double k) {
        return new Vect2(x * k, y * k);
    }

    Vect2 plus(Vect2 that) {
        return new Vect2(x + that.x, y + that.y);
    }

    Vect2 minus(Vect2 that) {
        return this.plus(that.scale(-1));
    }
}

答案 1 :(得分:1)

这个想法是构造一个穿过A点和B点的直线方程。当你构造了这个方程时,你构造了一条穿过P并垂直于AB的直线方程。垂直方程具有很容易从AB线方程导出的系数。一旦你有两个方程,求解它们就会得到交点的坐标。

这是作业吗?

答案 2 :(得分:1)