觀察到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));
}
}
這已被要求* *數十次之前。 – 2012-03-05 16:43:57