2012-03-05 2 views
0

그래서 두 라인의 좌표 (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

이이 요청 된 * 수십 * 시간 : 여기

몇 가지 작업 코드입니다. –

답변

1

아이디어는 점 A와 B를 통과하는 선의 방정식을 만드는 것입니다. 방정식을 만들면 P를 통과하고 AB에 수직 인 선 방정식을 구성하게됩니다. 직각에 대한 방정식은 AB- 선에 대한 방정식에서 쉽게 유도되는 계수를가집니다. 방정식이 두 개 있으면이를 해결하면 교차 좌표를 얻을 수 있습니다.

숙제 용입니까?

+0

아니, 그건 숙제가 아니야. 나는 그걸 조금 늙었 어.) 플래시로 물리 게임을 만들고있어. – nastaseion

+2

다음으로 너는 그와 같은 문제를 가장 많이 겪을 것이기 때문에 너는 너 자신에 의해이 일을해야한다. . – zvrba

+0

조언 해 주셔서 감사합니다. 내 생각에 나 할것 같아. 제가 해결해야만했던 문제는 이것보다 훨씬 더 복잡했습니다.하지만이 부분을 생각해 보면 쉽게 볼 수 있지만, 그렇지 않은 것 같습니다. 하지만 당신 말이 맞아요, 난 휴식을 취하고 새로운 눈으로 그것을보고, 다음 스스로 해결하려고 노력해야합니다. 감사합니다 :) – nastaseion

1

ab = A + (B - A) * s 

그래서, AB의 방향이 B - A, 또는 (B.x - A.x, B.y - A.y) 그대로 AB 그냥 표현 될 수 있다는 것을 관찰 도움이 될 것이다. 방향이 (A.y - B.y, B.x - A.x) 인 선은 수직입니다. (우리는 단지와 y는 x를 교환하고 그 중 하나를 부정.)

우리는 특히 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)); 
    } 
}