Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

두 벡터의 내적과 외적을 계산하는 C++ 프로그램

이 글에서는 x, y, z 성분을 가진 두 벡터 A와 B가 주어졌을 때, 두 벡터의 내적(dot product)외적(cross product)을 구하는 C++ 프로그램을 다룹니다.

벡터란 무엇인가?

수학에서 크기(magnitude)와 방향(direction)을 모두 가지는 양을 벡터(vector)라고 하며, 반대로 크기만 가지고 방향이 없는 양은 스칼라(scalar)라고 합니다. 벡터가 시작되는 점을 시점(initial point), 끝나는 점을 종점(terminal point)이라 하며, 시점과 종점 사이의 거리가 곧 벡터의 크기가 됩니다.

벡터의 종류

  • 단위 벡터(Unit vector) — 크기가 1인 벡터를 말합니다.
  • 영벡터(Zero vector) — NULL 벡터라고도 불리며, 시점과 종점이 같은 벡터입니다.
  • 동시점 벡터(Coinitial vector) — 두 개 이상의 벡터가 같은 시작점을 공유할 때 동시점 벡터라고 합니다.
  • 공선 벡터(Collinear vector) — 두 개 이상의 벡터가 같은 직선에 평행할 때 공선 벡터라고 합니다.
  • 등벡터(Equal vector) — 두 벡터의 크기와 방향이 모두 같을 때 등벡터라고 합니다.

내적(Dot Product)이란?

내적은 스칼라곱(scalar product)이라고도 하며, 그 결과는 스칼라 값입니다.

두 벡터 A = a1 * i + a2 * j + a3 * k 와 B = b1 * i + b2 * j + b3 * k 가 있을 때, i, j, k는 각각 크기가 1인 단위 벡터이며 벡터의 x, y, z 방향을 나타냅니다. 이때 내적은 다음과 같이 정의됩니다.

A · B = a1 * b1 + a2 * b2 + a3 * b3
입력 -: A = 2 * i + 7 * j + 2 * k
        B = 3 * i + 1 * j + 5 * k
출력 -: 2 * 3 + 7 * 1 + 2 * 5 = 23

외적(Cross Product)이란?

외적은 벡터곱(vector product)이라고도 하며, 그 결과 역시 벡터입니다.

두 벡터 A = a1 * i + a2 * j + a3 * k 와 B = b1 * i + b2 * j + b3 * k 가 있을 때, 외적은 다음과 같이 계산됩니다.

A × B = (a2 * b3 − a3 * b2) * i − (a1 * b3 − a3 * b1) * j + (a1 * b2 − a2 * b1) * k

여기서 각 괄호 안의 식은 단위 벡터 i, j, k의 계수에 해당합니다.

입력 -: A = 2 * i + 7 * j + 2 * k
        B = 3 * i + 1 * j + 5 * k
출력 -: (7 * 5 − 2 * 1)i + (2 * 5 − 2 * 3)j − (2 * 1 − 7 * 3)k

알고리즘

Start
Step 1 -> 두 벡터의 내적을 계산하는 함수 선언
    int dot_product(int vector_a[], int vector_b[])
    int product = 0 으로 초기화
    for (i = 0; i < size; i++)
        product = product + vector_a[i] * vector_b[i]
    return product
Step 2 -> 두 벡터의 외적을 계산하는 함수 선언
    void cross_product(int vector_a[], int vector_b[], int temp[])
    temp[0] = vector_a[1] * vector_b[2] - vector_a[2] * vector_b[1]
    temp[1] = -(vector_a[0] * vector_b[2] - vector_a[2] * vector_b[0])
    temp[2] = vector_a[0] * vector_b[1] - vector_a[1] * vector_b[0]
Step 3 -> main() 함수에서
    vector_a[] = { 4, 2, -1 } 선언
    vector_b[] = { 5, 7, 1 } 선언
    int temp[size] 선언
    dot_product(vector_a, vector_b) 호출하여 내적 출력
    cross_product(vector_a, vector_b, temp) 호출하여 외적 저장
    for (i = 0; i < size; i++)
        temp[i] 출력
End

C++ 구현 예제

#include <bits/stdc++.h>
#define size 3
using namespace std;

// 두 벡터의 내적을 계산하는 함수
int dot_product(int vector_a[], int vector_b[]) {
    int product = 0;
    for (int i = 0; i < size; i++)
        product = product + vector_a[i] * vector_b[i];
    return product;
}

// 두 벡터의 외적을 계산하는 함수
void cross_product(int vector_a[], int vector_b[], int temp[]) {
    temp[0] = vector_a[1] * vector_b[2] - vector_a[2] * vector_b[1];
    temp[1] = -(vector_a[0] * vector_b[2] - vector_a[2] * vector_b[0]);
    temp[2] = vector_a[0] * vector_b[1] - vector_a[1] * vector_b[0];
}

int main() {
    int vector_a[] = { 4, 2, -1 };
    int vector_b[] = { 5, 7, 1 };
    int temp[size];

    cout << "Dot product:";
    cout << dot_product(vector_a, vector_b) << endl;

    cout << "Cross product:";
    cross_product(vector_a, vector_b, temp);
    for (int i = 0; i < size; i++)
        cout << temp[i] << " ";

    return 0;
}

실행 결과

Dot product:33
Cross product:9 -9 18

위 프로그램에서 벡터 A = {4, 2, -1}과 B = {5, 7, 1}의 내적은 4×5 + 2×7 + (-1)×1 = 33으로 계산되며, 외적은 각 성분별 공식에 따라 {9, -9, 18}이 됩니다. 내적은 스칼라 하나로, 외적은 세 성분을 가진 새로운 벡터로 결과가 나온다는 점이 두 연산의 가장 큰 차이입니다.