명백한 덧셈, 뺄셈, 상수 곱셈 외에도 벡터에는 우리의 작업을 수월하게 해 줄 고유한 특별 연산을 정의할 수 있습니다.
#내적
내적(영어: dot product)은 두 벡터의 길이와 그 사이 각의 코사인을 곱한 값과 같습니다. 내적에 대해서는 다음 공식이 성립합니다:
$$ a \cdot b = |a| \cdot |b| \cdot \cos \theta = x_a x_b + y_a y_b $$이 공식은 증명 과정이 번거롭고 순전히 기술적이므로, 여기서는 증명하지 않겠습니다.
기하학적으로, 이는 벡터 $b$를 벡터 $a$ 위에 사영한 것에 $а$의 길이를 곱한 값과 같습니다:

유용한 성질:
- 내적은 대칭적입니다($a \cdot b = b \cdot a$).
- 수직인 벡터들의 내적은 0이어야 합니다.
- 각이 예각이면 내적은 양수입니다.
- 각이 둔각이면 내적은 음수입니다.
우리 구현에 이를 위한 별도의 연산자를 추가합시다:
int operator*(r a, r b) { return a.x * b.x + a.y * b.y; }
#외적
두 벡터의 외적(영어: cross product, 사곱 또는 유사스칼라곱이라고도 합니다)은 두 벡터의 길이와 두 벡터 사이 각의 사인을 곱한 값과 같으며, 이 사인의 부호는 피연산자의 순서에 따라 달라집니다. 벡터곱 역시 좌표로 편리하게 나타낼 수 있습니다:
$$ a \times b = |a| \cdot |b| \cdot \sin \theta = x_a y_b - y_a x_b $$스칼라곱과 마찬가지로, 좌표 공식의 증명은 독자에게 연습 문제로 남겨 둡니다. 직접 해 보고 싶은 분을 위해 덧붙이자면, 이는 두 곱의 선형성(이 또한 따로 증명해야 합니다)과 기저 벡터 $\overline{(0, 1)}$ 및 $\overline{(1, 0)}$에 대한 분해로부터 도출됩니다.
기하학적으로 이는 벡터 $a$와 $b$가 이루는 평행사변형의 유향 넓이입니다:

그 성질은 다음과 같습니다:
- 외적은 반대칭입니다: $a \times b = - (b \times a)$.
- 공선 벡터의 외적은 0입니다.
- $b$가 $a$의 「왼쪽」에 있으면 외적은 양수입니다.
- $b$가 $a$의 «오른쪽»에 있으면 외적은 음수입니다.
이에 대해서도 보통 연산자를 오버로딩하는데, ^ 또는 %를 사용합니다.
int operator^(r a, r b) { return a.x*b.y - b.x*a.y; }
참고. 엄밀히 말하면, 외적의 정식 정의는 이와 다릅니다. 벡터곱은 같은 길이를 가지면서 두 원래 벡터 모두에 수직인 벡터로 정의됩니다. 이는 3차원 기하학과 물리학에서 활용되지만, 2차원 세계를 다루는 지금은 이에 대해 생각할 필요가 없습니다.
스칼라곱과 벡터곱은 벡터 사이의 각과 밀접하게 관련되어 있으며, 방향이 있는 각이나 넓이처럼 보통 여러 가지 판별에 쓰이는 값을 계산하는 데 사용할 수 있습니다.
일단 구현해 두면, 대수에 의존하는 것보다 곱을 사용하는 것이 훨씬 간단합니다. 예를 들어, 익숙한 atan2에 벡터곱과 내적을 넣으면 두 벡터 사이의 각을 쉽게 계산할 수 있습니다:
double angle(r a, r b) {
return atan2(a ^ b, a * b);
}
앞으로 곱의 성질은 점과, 예를 들어 직선의 상대적 위치를 판별하는 데 도움이 될 것이므로, 이 성질들을 이해하고 확실히 기억해 두는 것이 중요합니다.