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

C++で3点を通る平面の方程式を求めるプログラム

このチュートリアルでは、C++を用いて「3つの点を通る平面の方程式」を求めるプログラムについて解説します。

3次元空間内の異なる3点が与えられたとき、その3点すべてを通る平面は一意に定まります。本記事では、与えられた3点から平面の方程式 ax + by + cz + d = 0 の形で求める方法を、数学的な考え方とサンプルコードの両面から紹介します。

平面の方程式を求める考え方

3点 P1(x1, y1, z1)、P2(x2, y2, z2)、P3(x3, y3, z3) を通る平面の方程式は、以下の手順で求められます。

まず、点P1からP2へのベクトル (a1, b1, c1) と、点P1からP3へのベクトル (a2, b2, c2) を計算します。これらはどちらも平面上に存在するベクトルです。

次に、この2つのベクトルの外積(クロス積)を取ると、平面に垂直な法線ベクトル (a, b, c) が得られます。外積の各成分は次の式で表されます。

a = b1×c2 − b2×c1
b = a2×c1 − a1×c2
c = a1×b2 − b1×a2

最後に、法線ベクトルと平面上の任意の1点(ここではP1)を用いて、定数項 d = −(a・x1 + b・y1 + c・z1) を計算すれば、平面の方程式 ax + by + cz + d = 0 が完成します。

C++による実装例

#include <bits/stdc++.h>
#include<math.h>
#include <iostream>
#include <iomanip>
using namespace std;
// 平面の方程式を求める関数
void equation_plane(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3){
   // ベクトルP1→P2
   float a1 = x2 - x1;
   float b1 = y2 - y1;
   float c1 = z2 - z1;
   // ベクトルP1→P3
   float a2 = x3 - x1;
   float b2 = y3 - y1;
   float c2 = z3 - z1;
   // 外積により法線ベクトルを求める
   float a = b1 * c2 - b2 * c1;
   float b = a2 * c1 - a1 * c2;
   float c = a1 * b2 - b1 * a2;
   // 定数項dを計算
   float d = (- a * x1 - b * y1 - c * z1);
   std::cout << std::fixed;
   std::cout << std::setprecision(2);
   cout << "Equation of plane is " << a << " x + " << b << " y + " << c << " z + " << d << " = 0";
}
int main(){
   float x1 =-1;
   float y1 = 2;
   float z1 = 1;
   float x2 = 0;
   float y2 =-3;
   float z2 = 2;
   float x3 = 1;
   float y3 = 1;
   float z3 =-4;
   equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3);
   return 0;
}

実行結果

Equation of plane is 26.00 x + 7.00 y + 9.00 z + 3.00 = 0

コードの解説

このプログラムでは、関数 equation_plane() の中でまず2つの方向ベクトルを計算し、続いて外積の公式を適用して法線ベクトルの各成分 a、b、c を求めています。その後、点 (x1, y1, z1) を代入することで定数 d を算出し、平面の方程式を出力します。

また、std::fixedstd::setprecision(2) を組み合わせることで、出力が小数点以下2桁に固定され、整った形式で結果を確認できます。

なお、与えられた3点が同一直線上にある場合(3点が同一平面上でも直線上にある場合)、外積の結果がゼロベクトルとなり平面が一意に定まらないため、実際の利用ではそのチェックを追加するとより堅牢なプログラムになります。

  1. 3D空間上の4点が同一平面上にあるかどうかを判定するC++プログラム

    共平面(コプラナー)とは3次元空間において、4つの点 (x1, y1, z1)、(x2, y2, z2)、(x3, y3, z3)、(x4, y4, z4) が与えられたとき、これらの点がすべて同一の平面上に存在するかどうかを判定する問題を考えます。すべての点が同じ平面上に乗っている場合、その点たちは「共平面(コプラナー)」であるといいます。逆に、点が異なる複数の平面にまたがっている場合は、共平面ではありません。下図は、4つの点がすべてxy平面上に存在する例です。この場合、点たちは共平面であるといえます。一方、下図のように4つの点がそれぞれ異なる平面上に存在する場合、点たちは共平面ではありませ

  2. 【C++入門】二次方程式のすべての解(根)を求めるプログラムの書き方

    二次方程式は一般に ax2 + bx + c = 0 の形で表されます。この方程式の解(根)は、以下に示す有名な「解の公式」によって求めることができます。判別式による3つの場合分け二次方程式の解の性質は、判別式 D = b2 − 4ac の値によって、次の3通りに分類されます。b2 < 4ac の場合:解は実数にならず、虚数を含む複素数になります。b2 = 4ac の場合:解は実数となり、両方の解が同じ値(重解)になります。b2 > 4ac の場合:解は実数となり、異なる2つの実数解を持ちます。それでは、これらすべての場合に対応した、二次方程式の解を求めるC++プログラムを見ていき