본문 바로가기
Computation Geography

12 평면과 선의 교차점 구하기

by SimonLee 2023. 9. 20.

평면과 선의 교차점을 구해봅시다.

 

아래 그림처럼 평면이 있고 평면을 가로지르는 선이 있습니다.

 

선과 평면의 방정식 입니다.

선의 방정식은 Q(t) = dt  + a

평면의 방정식은 Ax + By + Cz = D 

 

여기서 선과 평면이 만나는 지점을 Q(t) 라고 한다면 

우리는 Q(t) 점에 대해서 x, y  z를 선의 방정식에 대입을 한뒤 ,

x, y, z를 평면의 방정식에 대입을 하면 

t에 대해서 다음과 같이 정리할 수 있습니다.

 

여기서 변수들을 정리를 하면

A, B, C  : 평면의 방정식의 노말 벡터의 각 원소 입니다.

n : 평면의 노멀 벡터 입니다.

D : 평면의 방정식의 상수 D 값 입니다.

P : 직선의 시작점 입니다.

d : 직선에 방향 벡터 입니다.

 

분모의 경우, 평면의 노멀벡터(n)와 직선의 방향벡터(d)의 내적으로 변환할 수 있고,

분자의 경우, - 평면의 노멀벡터(n)와 직선의 시작점(n)의 내적 +  평면방정식 D로 변환할 수 있습니다.

 

t에 대해서 다시 정리를 하면 다음과 같습니다.

평면과 직선의 교차점의 t를 구할때 사용하는 방정식

이제 t를 구했으니, 직선의 방정식에 t를 대입해서 Q(t)를 구하면 됩니다.

 

하나 짚고 넘어 가야 할 것이 있는데,

위 식에서 분모가 0이 되면 exception이 발생합니다.

분모가 0이 되는 경우는, 평면의 노멀벡터와 직선의 방향벡터가 수직이라는 의미 입니다.

이때는 접점이 생기지 않습니다.

 

이해를 돕기위해 문제를 하나 풀어 봅니다.

 

ex)

평면의 방정식 3x + 5y + 2z = -4가 있습니다. 평면을 가로지르는 직선이 있을때, 

직선과 평면의 교차점을 구하시오, 이때 직선은 A(2, 1, 1), B(3, 5, 5) 를 가로지릅니다.

 

 

실행 화면 입니다.

평면과 직선의 교차점 테스트

 

소스 코드입니다.

public bool Intersection(Line3d line, Plane3 plane, out Point3d point)
{
    var n = plane.GetNormal();
    var D = plane.GetD();
    var d = line.GetDirection();
    var p = line.GetPoint();

    var nd = Vector3f.DotProduct(n, d);
    if (!(nd == 0))
    {
        var t = (-1 * Vector3f.DotProduct(n, p) + D) / nd;
        point = new Point3d(p.x + t * d.x, p.y + t * d.y, p.z + t * d.z);
        return true;
    }
    point = null;
    return false;
}