【问题标题】:Point to Line distance (2D) and Coordintates of intersection点到线距离 (2D) 和交点坐标
【发布时间】:2012-03-05 12:56:48
【问题描述】:

所以我需要知道点到线的距离(在二维空间中),给定线的两个坐标 (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线相交点的坐标(如果在这个段之外就可以了)。

有什么想法吗?

【问题讨论】:

  • 这已经被问过 几十次 次了。

标签: java c++ math geometry trigonometry


【解决方案1】:

观察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));
    }
}

【讨论】:

    【解决方案2】:

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

    这是作业吗?

    【讨论】:

    • 不,它不是用来做作业的,我有点老了 ;) 我正在用 Flash 制作物理游戏
    • 那你应该真的自己解决这个问题,因为你很可能会遇到更多这样的问题。
    • 感谢您的建议。我想我会。我必须解决的问题远比这复杂,但后来我想到了这部分,尽管看起来很容易,但似乎并非如此。但你说得对,我只需要休息一下,用新的眼光看待它,然后尝试自己解决它。谢谢:)
    【解决方案3】:

    【讨论】:

    • ...现在它说Hmmmm... Good old Error 404
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2015-02-27
    相关资源
    最近更新 更多