ps:이론:3차원_계산_기하
3차원 계산 기하
- 2차원에서 풀었던 계산기하 문제들은, 대부분 3차원이나 고차원으로 확장이 가능하고, 거기에 대응되는 알고리즘들도 무궁무진하다
- 하지만 다행히도 PS에 등장하는 기하 문제들은, 3차원 이상의 차원을 대상으로는 그렇게 고난이도의 지식까지 요구하는 경우는 드문것 같다
- 문제를 풀다가 접했던 기본적인 내용들만 정리해보겠다.
기본
- 3차원에서도 2차원과 마찬가지로 점 두개가 주어지면 직선을 유일하게 정의할 수 있다.
- 그리고 3차원에서는 점 세개가 주어지면 평면을 유일하게 정의할 수 있다.
벡터의 활용
벡터곱
- 원래 벡터곱은 3차원 벡터간에 정확하게 정의되는 연산이다.
- $ {\mathbf {a}}\times {\mathbf {b}}={\hat {{\mathbf n}}}\left|{\mathbf {a}}\right|\left|{\mathbf {b}}\right|\sin \theta =[a_{2}b_{3}-a_{3}b_{2},a_{3}b_{1}-a_{1}b_{3},a_{1}b_{2}-a_{2}b_{1}] $
- a와 b의 벡터곱의 크기는 a와 b로 만들어지는 평행사변형의 넓이이고
- a와 b의 벡터곱의 방향은 a와 b에 대해 모두 수직인 방향이다.
- 사실 수직인 방향이 두가지인데, 일반적으로 쓰이는 위의 공식은 오른손 좌표계 방향을 따르도록 계산하는 방식이다.
def cross_product(u, v): ux, uy, uz = u vx, vy, vz = v return (uy * vz - vy * uz, uz * vx - vz * ux, ux * vy - vx * uy)
스칼라곱
- 스칼라곱은 2차원 벡터의 경우와 똑같다.
- 다음과 같이 계산된다.
- $ {\displaystyle \mathbf {a} \cdot \mathbf {b} =a_{1}b_{1}+a_{2}b_{2}+\cdots +a_{n}b_{n}} $
- 이는 두 벡터의 길이와 사이각의 cos값을 곱한 것과 같다
- $ {\displaystyle \mathbf {a} \cdot \mathbf {b} ={\begin{cases}\Vert \mathbf {a} \Vert \Vert \mathbf {b} \Vert \cos \measuredangle (\mathbf {a} ,\mathbf {b} )&\mathbf {a} \neq \mathbf {0} \land \mathbf {b} \neq \mathbf {0} \\0&\mathbf {a} =\mathbf {0} \lor \mathbf {b} =\mathbf {0} \end{cases}}} $
def dot_product(u, v): ux, uy, uz = u vx, vy, vz = v return ux * vx + uy + vy + uz + vz
평면의 법선
- 평면이 평면 위의 세 점으로 정의되는 경우에 벡터를 구하는 문제.
- P,Q,R 을 포함하는 평면과 수직인 벡터는, 벡터PQ와 벡터PR과도 모두 수직이다
- 그러므로 PQ와 PR의 벡터곱을 구해주면 평면의 법선벡터가 된다.
def normal_vector(p, q, r): u = (p[0] - q[0], p[1] - q[1], p[2] - q[2]) v = (p[0] - r[0], p[1] - r[1], p[2] - r[2]) return cross_product(u, v)
평면을 기준으로 점의 방향성 구하기
- 2차원에서 세점의 방향성을 구하는 것의 확장이다.
- 2차원에서 P,Q,R의 방향성을 구하는 것은, 결국 PQ를 연결하는 직선이 평면을 둘로 나눴을때, R이 어느쪽에 속하는지를 찾는 문제였다
- 3차원에서는 P,Q,R을 포함하는 평면이 3차원 공간을 둘로 나눴을때, X가 어느쪽에 속하는지를 찾는 문제가 된다.
- 이것을 구하는 간단한 방법은, 평면에서 X를 향하는 벡터와 평면의 법선벡터와의 각도를 구해서, 그 각도가 180보다 작은지 큰지를 확인하는 것이다.
-
- 스칼라곱에는 각도의 cos값이 곱해지므로, 각도가 180도 미만이면 양수, 180도 초과면 음수가 된다.
- 스칼라곱이 +면 법선방향, -면 법선 반대 방향, 0이면 평면 위에 있는 것이다.
ps/이론/3차원_계산_기하.txt · 마지막으로 수정됨: 2023/04/25 06:23 저자 teferi
토론