본문 바로가기
Computation Geography

2. 내적 ( Dot Product )

by SimonLee 2023. 8. 31.

두 벡터의 내적 ( Dot Product )은 다음과 같이 정의합니다.

내적 연산자는 가운데 점 입니다.

U, V는 벡터이기 때문에 2차원일수도 있고 3차원일수도 있습니다.

| U | | V |  라고 되어있는 부분은 벡터의 크기를 의미하며, 세타 값은 두 벡터 사이의 각도 입니다.

 

내적의 연산 법칙은 다음과 같습니다.

1) 교환 법칙이 성립합니다.

2) 분배 법칙이 성립합니다.

3) 결합 법칙이 성립합니다.

- 단 내적이 연이어서 나올수 없습니다.

4) 같은 벡터를 내적하면 벡터의 크기의 제곱이 됩니다.

 

내적을 계산하는 방법은 다음과 같습니다.

1) 벡터의 원소끼리 쌍쌍이 곱한값을 더한다.

2) 벡터 사이 각도를 알고 있으면, 다음 식으로 구한다.

 B Point 에서 A Point로 정사영한 Point의 크기에 A 벡터의 크기를 곱한 의미이다.

 

참고로  벡터의 크기를 구하는 법은 다음과 같습니다.

그래서 크기(Magnitude) 값은 스칼라 값이 되고, 스칼라 * 스칼라 * cos 세타 계산의 결과도 역시 스칼라 값입니다.

그래서 종종 셰이더에서 연산을 할때 차원을 줄여주는 용도로도 사용합니다.

 

 

이해를 돕기 위해 문제를 하나 풀어보지요

VectorA(1, 1, 1) , VectorB(1, -1 ,1) 이 두벡터의 각도를 구하시오,

 

 

 

내적이 가지는 기하적 의미를 알아봅시다.

 

1) A벡터와 B벡터가 수직이면, A, B벡터를 내적 하면 0 입니다.

- Cos(90) 값이 0이기 때문에 |A| |B| cos(x) == 0

 

2) 세타 값이 예각이면 A, B 벡터를 내적하면 0보다 큽니다.

- Cos(1~89) > 0 이기 때문에, |A| |B| cos(x) > 0

 

3) 세타 값이 둔각이면, A, B 벡터를 내적하면 0보다 작습니다.

- Cos(91 ~ 270 ) < 0 이기 때문에, |A| |B| cos (x) < 0 

 

내적을 구하는 코드 입니다.

public static float dotProduct(Vector2f v1, Vector2f v2)
{
    if (v1.values.Length != v2.values.Length)
    {
        return Constants.FLT_MIN;
    }
    float product = 0f;
    for (int i = 0; i < v1.values.Length; i++)
    {
        product += v1[i] * v2[i];
    }
    return product;
}