본문 바로가기
Computation Geography

7. 두 점(Point)의 교점 구하기

by SimonLee 2023. 9. 13.

두직선의 교점을 구해보자.

다음과 같이 Point A, B로 이루어진 Line A과 Point C, D로 이루어진 Line B가 있다고 가정하자.

여기서 Line은 Line segment가 아닌 양방향으로 무한대로 뻗어나가는 직선입니다.

P라는 교차점 있습니다.

 

P점은 AB Line 위에 존재 합니다. AB라인의 식을 사용해서 P점을 나타내면

P(t) = (B - A) * t + A

 

또한 P점은 CD Line 위에 존재 합니다. CD라인의 식을 사용해서 P점을 나타내면

P(t) = (D - C) * t + C

 

 

여기서 CD의 법선벡터 N이 있다고 가정합니다.

CD 라인과 법선벡터 N은 서로 수직(Perpendicular)이며,

내적(dotproduct)의 성질인 서로 수직인 벡터를 내적하면 0 임을 이용하여 다음과 같은 식을 유도할수 있습니다. 

CP 벡터(빨강색) 와 법선벡터 N을 내적 

- N . ( P(t) - C ) = 0

 

위에서 말씀드린 P(t)를 AB 벡터의 관한식으로 대입을 해보면

- N . ( (B - A) * t + A - C )= 0

 

여기서 t 값을 구한 뒤에

P(t) = (B - A) * t + A 

식에 대입을 하게 되면 P(t)의 x, y 좌표 를 알수 있습니다.

 

CD라인과 수직인 벡터(노멀 or 법선)를 구하기 위해서는

x, y를 위치를 주고 x 값의 부호를 반대로 하면 됩니다.

 

public bool Intersection(Point2d a, Point2d b, Point2d c, Point2d d, out Point2d result)
{
    result = Point2d.zero;
    Vector2f AB = b - a;
    Vector2f CD = d - c;
    Vector2f AC = c - a;
    Vector2f normal = new Vector2f(CD.y, -CD.x);
    float abDotNormal = Vector2f.DotProduct(normal, AB);

    if (abDotNormal != 0)
    {
        float acDotNormal = Vector2f.DotProduct(normal, AC);
        var t = acDotNormal / abDotNormal;
        result.x = (AB.x * t) + a.x;
        result.y = (AB.y * t) + a.y;
        return true;
    }
    return false;
}

'Computation Geography' 카테고리의 다른 글

9. Vector Collinear, Corplaner Check  (0) 2023.09.15
8. Line, Plane간 Angle 구하기  (0) 2023.09.14
6. 면 (Plane)  (0) 2023.09.11
5. 선 (Line), 선과 선의 교차점 체크하기  (0) 2023.09.09
4. 벡터의 Orientation  (2) 2023.09.09