C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で2つのベクトルの内積と外積を求めるプログラム

ここでは、x・y・zの方向成分を持つ2つのベクトル(ベクトルAとベクトルB)が与えられ、その内積(ドット積)と外積(クロス積)を求める方法を解説します。

ベクトルとは?

数学において、大きさ(マグニチュード)と方向の両方を持つ量をベクトルと呼び、大きさのみを持つ量をスカラーと呼びます。ベクトルが始まる点を「始点」、ベクトルが終わる点を「終点」といい、始点と終点の間の距離がベクトルの大きさ(絶対値)となります。

ベクトルの主な種類

  • 単位ベクトル ― 大きさが1であるベクトルのことです。
  • ゼロベクトル ― NULLベクトルとも呼ばれ、始点と終点が同じ点であるベクトルです。
  • 共始点ベクトル ― 2つ以上のベクトルが同じ始点を持つ場合、それらを共始点ベクトルと呼びます。
  • 共線ベクトル ― 2つ以上のベクトルが同じ直線に平行な場合、それらを共線ベクトルと呼びます。
  • 相等ベクトル ― 2つのベクトルが同じ大きさと同じ方向を持つ場合、それらを相等ベクトルと呼びます。

内積(ドット積)とは?

内積はスカラー積とも呼ばれ、結果がスカラー値になる演算です。次のように定義されます。

2つのベクトル A = a1 * i + a2 * j + a3 * k と B = b1 * i + b2 * j + b3 * k があるとします。ここで i、j、k は大きさが1の単位ベクトルであり、各成分はベクトルの方向を表します。このとき、内積は次の式で求められます。

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

外積(クロス積)とは?

外積はベクトル積とも呼ばれ、結果がベクトルになる演算です。次のように定義されます。

2つのベクトル 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

ここで、a2 * b3 − a3 * b2、a1 * b3 − a3 * b1、a1 * b2 − a2 * b1 はそれぞれ単位ベクトル 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

アルゴリズム

開始
ステップ1 → 2つのベクトルの内積を計算する関数を宣言する
    int dot_product(int vector_a[], int vector_b[])
    int product = 0 を宣言する
    ループ: i = 0 から i < size まで i++
        product = product + vector_a[i] * vector_b[i] を設定する
    ループ終了
    product を返す
ステップ2 → 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] を設定する
ステップ3 → main() 内で
    ベクトル int vector_a[] = { 4, 2, -1 } を宣言する
    ベクトル int vector_b[] = { 5, 7, 1 } を宣言する
    変数 int temp[size] を宣言する
    内積関数 dot_product(vector_a, vector_b) を呼び出す
    外積関数 cross_product(vector_a, vector_b) を呼び出す
    ループ: i = 0 から i < size まで i++
        temp[i] を出力する
終了

C++での実装例

#include <bits/stdc++.h>
#define size 3
using namespace std;
// 2つのベクトルの内積を計算する関数
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;
}
// 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];
}
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

このように、内積は各成分同士を掛けて合計したスカラー値として、外積は3つの新しい成分を持つベクトルとして求めることができます。C++では配列とループを使うことで、これらの演算をシンプルかつ効率的に実装できます。


  1. C++で直方体の体積と表面積を計算するプログラムの作成方法

    直方体とは? 直方体とは、6つの長方形の面から構成される三次元の立体図形です。各面の縦と横の長さが異なるため、全体として異なる長さの辺を持っています。立方体と直方体の違いは、立方体では長さ・高さ・幅がすべて等しいのに対し、直方体ではこれら3つが必ずしも同じではないという点です。 直方体の主な性質は以下のとおりです。 6つの面 12本の辺 8つの頂点 以下は直方体のイメージ図です。 問題の概要 直方体の長さ(L)、幅(W)、高さ(H)が与えられたとき、その総表面積と体積を求めるのが課題です。表面積とは各面が占める空間の広さのことであり、体積とはその形状が内包できる空間の大きさのことです。

  2. C++で立方体の体積と表面積を求めるプログラム

    立方体とは? 立方体とは、正方形の面を6つ持つ三次元の立体図形です。すべての辺の長さが等しいという特徴があります。立方体は唯一の正六面体であり、以下のような性質を持ちます。 面の数:6つ 辺の数:12本 頂点の数:8つ 以下は立方体の図です。 問題の概要 立方体の一辺の長さが与えられたとき、その立方体の表面積と体積を求めることが課題です。ここで、表面積とは立方体の各面が占める面積の合計を指し、体積とはその図形が内包できる空間の大きさを指します。 立方体の表面積と体積を計算するには、次の公式を使用します。 表面積 = 6 × 辺 × 辺 体積 = 辺 × 辺 × 辺 入力例と出力例 入力