2012-03-05 65 views
0

所以我需要知道從點到線(在2D空間中)的距離,給定線(AB)的兩個座標。點對點距離(2D)和交點座標

這是我到目前爲止有:

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線(這是確定如果它是這個段外)相交的點的座標。

任何想法?

+1

這已被要求* *數十次之前。 – 2012-03-05 16:43:57

回答

1

這個想法是建立一條穿過點A和B的直線的方程。當你構造了這個方程時,你構造了一條經過P並垂直於AB的直線的方程。垂線方程式的係數很容易從AB線的公式中推導出來。一旦你有兩個方程,解決它們會給你交點的座標。

這是作業嗎?

+0

不,這不是作業,我有點老了;)我在Flash中製作物理遊戲 – nastaseion 2012-03-05 13:06:44

+2

然後,你應該*真的*自己來解決這個問題,因爲你很可能會遇到更多這樣的問題。 – zvrba 2012-03-05 13:25:47

+0

感謝您的建議。我想我會。我必須解決的問題比這個要複雜得多,但是接下來我想到了這個部分,雖然看起來很簡單,但似乎並非如此。但是你是對的,我只需要休息一下,用新的眼睛看到它,然後嘗試自己解決它。謝謝:) – nastaseion 2012-03-05 13:33:04

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