所以我需要知道从一个点到另一个线的距离(在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线相交的点的坐标(如果它在该段之外,它就没问题。)
有什么想法吗?
答案 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)