평면과 평면 사이의 교차하는 선의 방정식을 구해봅시다.
< 위 그림의 파랑색 선은 평면의 노말벡터 방향입니다.>
선의 방정식을 알려면 방향벡터와 점만 알면 됩니다.
1) 먼저 방향벡터를 먼저 알아보지요
빨강색 선에 포함하는 모든 점들은 평면 A, 평면 B에 둘 다 속합니다.
빨강색 선의 방향벡터도 역시 평면 A, 평면 B 둘 다 이루고 있는 점들의 방향 벡터의 일부 입니다.
평면을 이루고 있는 점 2개를 가지고 벡터를 만들면 반드시 평면의 노멀벡터와 수직이기 때문에,
빨강색 선의 방향벡터는 평면A, 평면B의 노멀벡터와 수직 입니다.
두개의 벡터 외적을 시키면, 오른손 법칙에 의하여 두개의 벡터와 수직인 벡터를 얻을 수 있습니다.
정리하면 빨강색 선의 방향벡터는
평면A의 노멀벡터와 평면 B의 노멀벡터의 외적을 통해 구할 수 있습니다.
2) 이제 라인에 포함되는 점을 구해봅시다.
평면의 방정식은 다음과 같습니다.
Ax + Bx + Cz = D
A,B,C는 노멀벡터이고, x, y, z는 point 입니다.
내적 공식으로 변형 하면 다음과 같습니다.
평면이 두개니깐 다음과 같이 두개의 식이 있습니다.
빨강색 라인 위에 있는 점 P(x, y, z)는 A, B 평면의 노멀벡터를 선형 조합으로 구할 수가 있습니다.
식2에 있는 A, B는 상수 입니다.
식 2에 있는 P를 식1 에 대입을 하고 상수 A, B를 구하면 점 P를 알 수 있습니다.
다음과 같은 2개의 연립방정식을 정의할 수 있습니다.
1식) 에서 A를 제거해서 B를 구하면
2식) 에서 B를 제거해서 A를 구하면
상수 A, B를 구했으니 아래 식을 통해서 점 P를 구할 수 있고,
위에서 방향벡터를 구했으니 라인 방정식이 완성이 됩니다.
public bool Intersection(Plane3 planeA, Plane3 planeB, out Line3d line)
{
var n1 = planeA.GetNormal();
var n2 = planeB.GetNormal();
var d1 = planeA.GetD();
var d2 = planeB.GetD();
var direction = Vector3f.CrossProduct3D(n1, n2);
if (direction.Magnitude() == 0)
{
line = null;
return false;
}
var n1n2 = Vector3f.DotProduct(n1, n2);
var n1n2_2 = n1n2 * n1n2;
var a = (d2 * n1n2 - d1) / (n1n2_2 - 1);
var b = (d1 * n1n2 - d2) / (n1n2_2 - 1);
var point = n1 * a + n2 * b;
line = new Line3d(point, direction, 0);
return true;
}
'Computation Geography' 카테고리의 다른 글
12 평면과 선의 교차점 구하기 (0) | 2023.09.20 |
---|---|
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 |