내적 (Dot Product)
내적은 두 벡터 간의 각도 관계를 표현하는 값으로, 두 벡터를 곱한 후 결과를 더하여 구합니다. "내적"이라는 이름은 이 연산을 나타내기 위해 자주 사용되는 중심 점 "·"에서 유래되었습니다. 대안 이름인 "스칼라 곱"은 결과의 스칼라적 성질을 강조합니다.
수학적 공식
2D에서 벡터 a[x1, y1]와 b[x2, y2]의 내적은 다음과 같이 계산됩니다:
a · b = (x1 * x2) + (y1 * y2);
내적의 흥미로운 점은 입력 벡터가 형성하는 각도와의 관계입니다. 이는 다음과 같이 표현할 수 있습니다:
a · b = (a의 길이) * (b의 길이) * cos(각도)
즉, 두 벡터의 내적은 그 벡터들 사이의 각도의 코사인에 각 벡터의 길이를 곱한 값과 같습니다.
내적의 성질
두 벡터 a와 b에 대해 내적의 결과와 관련하여 다음과 같은 사항을 알 수 있습니다:
조건 | 내적 결과 |
---|---|
a와 b가 수직일 때 (90도) | 0 |
a와 b의 각도가 90도 미만일 때 | 양수 |
a와 b의 각도가 90도 초과일 때 | 음수 |
게임에서의 활용
게임 개발자에게 이 수학적 관계는 여러 상황에서 유용하게 사용될 수 있습니다. 가장 간단한 예는 적의 "시야" 체크를 생성하는 것입니다. 예를 들어, 플랫폼 게임에서 적이 자신의 벡터 노멀의 양쪽 90도 이내에 플레이어가 있을 경우 "플레이어를 본다"고 판단할 수 있습니다.
이 과정은 다음과 같이 진행됩니다: 1. 적의 벡터 노멀을 가져옵니다 (즉, 방향과 시야 거리를 포함). 2. 플레이어에서 적까지의 벡터를 계산합니다. 3. 이 두 벡터의 내적을 구합니다. 4. 결과가 양수이면 플레이어가 보였고, 음수이면 보이지 않았습니다.
코드 예제
다음은 위의 설명을 바탕으로 한 코드 예제입니다:
var x1, y1, x2, y2;
x1 = lengthdir_x(1, image_angle);
y1 = lengthdir_y(1, image_angle);
x2 = o_Player.x - x;
y2 = o_Player.y - y;
if dot_product(x1, y1, x2, y2) > 0 {
seen = true;
} else {
seen = false;
}
위 코드는 인스턴스의 이미지 각도를 사용하여 벡터를 생성하고, 플레이어 객체 "o_Player"에서 자신까지의 벡터를 구합니다. 마지막으로 이 두 벡터의 내적을 계산하고, 결과가 0보다 크면 "seen" 변수를 true로 설정하고, 0 이하이면 false로 설정합니다.