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++では配列とループを使うことで、これらの演算をシンプルかつ効率的に実装できます。
-
C++で直方体の体積と表面積を計算するプログラムの作成方法
直方体とは? 直方体とは、6つの長方形の面から構成される三次元の立体図形です。各面の縦と横の長さが異なるため、全体として異なる長さの辺を持っています。立方体と直方体の違いは、立方体では長さ・高さ・幅がすべて等しいのに対し、直方体ではこれら3つが必ずしも同じではないという点です。 直方体の主な性質は以下のとおりです。 6つの面 12本の辺 8つの頂点 以下は直方体のイメージ図です。 問題の概要 直方体の長さ(L)、幅(W)、高さ(H)が与えられたとき、その総表面積と体積を求めるのが課題です。表面積とは各面が占める空間の広さのことであり、体積とはその形状が内包できる空間の大きさのことです。
-
C++で立方体の体積と表面積を求めるプログラム
立方体とは? 立方体とは、正方形の面を6つ持つ三次元の立体図形です。すべての辺の長さが等しいという特徴があります。立方体は唯一の正六面体であり、以下のような性質を持ちます。 面の数:6つ 辺の数:12本 頂点の数:8つ 以下は立方体の図です。 問題の概要 立方体の一辺の長さが与えられたとき、その立方体の表面積と体積を求めることが課題です。ここで、表面積とは立方体の各面が占める面積の合計を指し、体積とはその図形が内包できる空間の大きさを指します。 立方体の表面積と体積を計算するには、次の公式を使用します。 表面積 = 6 × 辺 × 辺 体積 = 辺 × 辺 × 辺 入力例と出力例 入力