평면과 선의 교차점을 구해봅시다.
아래 그림처럼 평면이 있고 평면을 가로지르는 선이 있습니다.
선과 평면의 방정식 입니다.
선의 방정식은 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를 대입해서 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;
}
'Computation Geography' 카테고리의 다른 글
13. 평면과 평면 사이의 교차 선의 방정식 구하기 (0) | 2023.09.21 |
---|---|
11. 점과 평면 사이의 거리 (0) | 2023.09.19 |
10. 점과 선 사이의 거리 (0) | 2023.09.15 |
9. Vector Collinear, Corplaner Check (0) | 2023.09.15 |
8. Line, Plane간 Angle 구하기 (0) | 2023.09.14 |