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

C++で2つのベクトルの外積(クロス積)を計算するプログラムの書き方

はじめに

本記事では、2つの3次元ベクトルの外積(クロス積)を計算するC++プログラムを紹介します。まず外積の数式的な定義を確認し、その後アルゴリズムとサンプルコード、実行結果まで順番に解説します。

外積の定義

いま、次のような2つのベクトルを考えます。

M = m1i + m2j + m3k
N = n1i + n2j + n3k

このとき、MとNの外積は次の式で表されます。

M × N = (m2n3 − m3n2)i − (m1n3 − m3n1)j + (m1n2 − m2n1)k

ここで、各括弧内の値がそれぞれ i、j、k 方向の単位ベクトルに掛かる係数(成分)となります。なお、外積の結果はスカラーではなく、入力した2つのベクトルのどちらにも垂直な方向を向くベクトルになる点に注意してください。

アルゴリズム

  1. 関数 crossProduct() を宣言します。引数として、整数型の配列 v_A[](1つ目のベクトル)、v_B[](2つ目のベクトル)、c_P[](結果格納用)を受け取ります。
  2. c_P[0] = v_A[1] * v_B[2] − v_A[2] * v_B[1](x成分)
  3. c_P[1] = −(v_A[0] * v_B[2] − v_A[2] * v_B[0])(y成分)
  4. c_P[2] = v_A[0] * v_B[1] − v_A[1] * v_B[0](z成分)
  5. ベクトル v_A[] の各成分に値を設定します。
  6. ベクトル v_B[] の各成分に値を設定します。
  7. 結果格納用の配列 c_P[] を用意します。
  8. 「Cross product:」という文字列を出力します。
  9. 関数 crossProduct() を呼び出し、v_A[] と v_B[] の外積を計算します。
  10. for文を使って、配列 c_P[] の各成分を順に出力します。

サンプルコード

#include <iostream>
#define n 3
using namespace std;

void crossProduct(int v_A[], int v_B[], int c_P[]) {
    c_P[0] = v_A[1] * v_B[2] - v_A[2] * v_B[1];
    c_P[1] = -(v_A[0] * v_B[2] - v_A[2] * v_B[0]);
    c_P[2] = v_A[0] * v_B[1] - v_A[1] * v_B[0];
}

int main() {
    int v_A[] = { 7, 6, 4 };
    int v_B[] = { 2, 1, 3 };
    int c_P[n];

    cout << "Cross product:";
    crossProduct(v_A, v_B, c_P);

    for (int i = 0; i < n; i++)
        cout << c_P[i] << " ";

    return 0;
}

実行結果

Cross product: 14 -13 -5

計算過程の解説

サンプルコードでは、v_A = {7, 6, 4}、v_B = {2, 1, 3} としています。各成分は次のように計算されます。

  • x成分: 6 × 3 − 4 × 1 = 14
  • y成分: −(7 × 3 − 4 × 2) = −(21 − 8) = -13
  • z成分: 7 × 1 − 6 × 2 = 7 − 12 = -5

このように、関数 crossProduct() 内で各成分の計算を行い、その結果を配列 c_P[] に格納して出力しています。3×3の行列式(サラスの方法)を展開することでも同じ式が導けるため、理解を深めたい方は合わせて確認しておくとよいでしょう。

  1. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁

  2. C++で2本の直線の交点を求めるプログラムの書き方

    直線ABを定義する2点A・Bと、直線CDを定義する2点C・Dが与えられたとき、この2つの直線の交点を求めるのが課題です。 注意 − すべての点は、X座標とY座標を持つ2次元平面上にあるものとします。 図では、A(a1, a2)とB(b1, b2)を通る直線、C(c1, c2)とD(d1, d2)を通る直線という、互いに異なる2つの直線が描かれており、P(p1, p2)がその交点を表しています。 交点の求め方 まず、2点を通る直線を「ax + by = c」の形の方程式で表します。各点の座標を使って、次のように係数を計算します。 A1 = b2 - a2 B1 = a1 - b1 C1 =