Quick Comparison
각도·정렬 정도는 내적, 3차원의 수직 방향·면적은 외적을 사용합니다. 내적 결과는 수 하나, 외적 결과는 벡터입니다. 성분 공식은 정규직교 기저를 전제로 하며 외적은 오른손 방향 기준입니다.
| 연산 | 형태 | 바로 읽을 의미 |
|---|---|---|
| 내적 | a·b = axbx + ayby + azbz | ‖a‖‖b‖cosθ |
| 외적 | a×b = (aybz−azby, azbx−axbz, axby−aybx) | 두 입력에 수직, 크기는 평행사변형 넓이 |
| 각도 | cosθ = (a·b)/(‖a‖‖b‖) | 두 입력이 0이 아닐 때 |
| 삼각형 넓이 | ‖a×b‖/2 | 같은 꼭짓점에서 출발한 두 변 |
내적을 숫자로 읽기
a=(1,2,0), b=(2,0,0)이면 내적은 2입니다. 두 벡터가 단위 길이가 아니므로 이 값 자체가 cosθ는 아닙니다.
a·b = 1×2 + 2×0 + 0×0 = 2
‖a‖ = √5, ‖b‖ = 2
cosθ = 2 / (√5 × 2) = 1/√5
θ ≈ 63.435°0이 아닌 두 벡터에서 내적이 양수면 예각, 0이면 수직, 음수면 둔각입니다. a·b는 b·a와 같고 덧셈에 분배됩니다. 제곱 길이 a·a는 0 이상이며, 영벡터도 모든 벡터와 내적이 0이지만 방향 사이 각도는 정의되지 않습니다.
각도를 직접 구할 때는 나눈 cos 값이 반올림 때문에 [-1,1]을 조금 벗어나는 경우를 처리합니다. 앞/뒤 또는 시야 범위 판정만 필요하면 acos로 각도를 만들지 않고 내적과 기준 cos 값을 비교할 수 있습니다.
한 방향으로의 투영
0이 아닌 b가 만드는 직선 위로 a를 수직 투영한 벡터는 다음과 같습니다. b가 단위 벡터이면 분모 b·b가 1이 되어 단순해집니다.
proj_b(a) = ((a·b)/(b·b)) b
a=(1,2,0), b=(2,0,0)
proj_b(a) = (2/4)(2,0,0) = (1,0,0)
남은 성분 = a - proj_b(a) = (0,2,0)투영 길이 (a·b)/‖b‖는 부호 있는 스칼라이고, 투영 벡터는 방향을 포함한 결과입니다. 둘을 같은 타입의 답으로 쓰지 않습니다. 남은 성분이 b에 수직이라는 관계로 계산을 확인할 수 있습니다.
외적의 방향과 면적
같은 두 벡터 a와 b의 외적은 (0,0,-4)입니다. b×a는 반대로 (0,0,4)가 됩니다.
a×b = (2×0−0×0, 0×2−1×0, 1×0−2×2)
= (0,0,-4)
평행사변형 넓이 = ‖a×b‖ = 4
삼각형 넓이 = 2외적은 입력 순서에 따라 부호가 바뀝니다. 평행한 두 벡터의 외적은 영벡터이므로 이를 정규화해 법선을 만들 수 없습니다. 3차원 삼각형에서는 (B−A)×(C−A)로 두 변을 만든 뒤 면적과 법선 방향을 얻습니다.
2차원에서 자주 사용하는 axby−aybx는 두 벡터를 z=0 평면에 놓았을 때 외적의 z 성분입니다. 일반적인 2차원 벡터를 반환하는 연산과 다르며, 3차원 외적 공식을 임의 차원에 그대로 확장하지 않습니다.
그래픽스에 연결
Lambert 조명은 정규화한 법선과 광원 방향의 내적을 0 이상으로 제한합니다. 외적은 삼각형 법선·카메라 기저를 만드는 데 쓰이지만, 라이브러리의 좌표계와 정점 순서를 함께 맞춰야 합니다. 실제 판정 예제는 Graphics의 내적·외적, 셰이더 연결은 OpenGL 법선과 조명에서 확인할 수 있습니다.
한 방향의 투영을 평면·부분공간으로 확장하는 계산은 직교 투영, 수직인 축을 직접 만드는 과정은 Gram–Schmidt에 있습니다.
참고 링크
2 sources