본문 바로가기
Computation Geography

10. 점과 선 사이의 거리

by SimonLee 2023. 9. 15.

1) 점과 선 사이의 거리를 구해봅니다.

 

2차원의 점과 점사이의 거리, 3차원의 점과 점사이의 거리 입니다.

벡터의 크기를 구하는 공식을 기억 하시나요 ?

(x, y, z) 각 원소를 제곱하고 루트를 씌웁니다. 

(x, y) -> A 벡터, (x1, y1) -> B 벡터라고 한다면

다음 식으로 AB사이의 거리를 구할 수 있습니다.

- (B - A).Magnitude()

 

2) 점과 선(Line)의 거리를 구하는 방법 입니다.

점과 선의 거리를 알기위해서는 먼저 점과 선의 교차점을 구해야 합니다.

점과 선의 교차점은 점을 직선의 방향으로 수선의 발을 그었을때, 접점이 점과 선의 교차점 입니다.

 

X(t) 점을 교차점으로 가정하고, X(t)를 구하는 식은 x(t) = vt + a 입니다.

X(t)점과 Y점을 이은 벡터를 구하고 이 벡터와 AB벡터 (빨강 v) 내적을 하면,

두 벡터는 수직이기 때문에 0 이 나옵니다.

위 식을 사용하여 t를 구합니다. 

 

t를 구하면, V.t + A를 사용하여 교차점 X(t)를 구할수 있게 되고,

X(t) 교차점과 Y 점을 잇는 벡터의 크기가 x(t) 와 y의 최소거리가 됩니다.

내적의 사칙 법칙은 중에 같은 벡터를 내적하면 벡터의 크기의 제곱이 됩니다.

그리고 V 벡터가 단위 벡터이므로 크기는 1이므로 분모는 1이 됩니다.

교차점 t의 대한 최종 공식

t의 범위에 따라 AB 라인 세그먼트에 상대적 x(t)의 위치를 알수 있습니다.

t > 0  : AB 선분 beyond(앞)에 교차점 존재

t < 0 : AB 선분 behind(뒤) 에 교차점 존재

0 <= t <= 1 : AB 선분(라인 세그먼트) 안에 교차점 존재

 

 

내적의 공식은 아래를 참고하세요

https://graphicsimon.tistory.com/28

 

2. 내적 ( Dot Product )

두 벡터의 내적 ( Dot Product )은 다음과 같이 정의합니다. 내적 연산자는 가운데 점 입니다. U, V는 벡터이기 때문에 2차원일수도 있고 3차원일수도 있습니다. | U | | V | 라고 되어있는 부분은 벡터의

graphicsimon.tistory.com

 

t를 알았으니,  x(t) point를 구할수 있습니다.

- x(t) = vt + a 

 

이제 x(t) point, Y point 두 점간의 거리 구하는 공식을 사용해서 거리를 구하면 됩니다.

 

구현 코드 입니다

public float Distance(Line3d l1, Point3d Y)
{
    Vector3f AY = Y - l1.GetPoint();
    float t = Vector3f.DotProduct(l1.GetDirection(), AY);

    Point3d xt = l1.GetPoint() + l1.GetDirection() * t;
    return (xt - Y).Magnitude();
}

Unity에서 구동하는 모습입니다. t (값의 범위 주시)

선과 점의 교차점