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

一方、下図のように4つの点がそれぞれ異なる平面上に存在する場合、点たちは共平面ではありません。

入力例と出力例
Input-: x1 = 2, y1 = 3, z1 = 1, x2 = 1, y2 = 9, z2 = 3, x3 = 3, y3 = 1, z3 = 5, x4 = 23, y4 = 21, z4 = 9 Output-: they are not coplanar(共平面ではない) Input-: x1 = 3, y1 = 2, z1 = -5, x2 = -1, y2 = 4, z2 = -3, x3 = -3, y3 = 8, z3 = -5, x4 = -3, y4 = 2, z4 = 1 Output-: they are coplanar(共平面である)
判定の考え方
本プログラムでは、以下の手順で共平面かどうかを判定します。
- 4つの点の座標を変数 (x1, y1, z1)、(x2, y2, z2)、(x3, y3, z3)、(x4, y4, z4) に入力する
- 最初の3点から平面の方程式を求め、4点目がその方程式を満たすかどうかを確認する
- 判定結果(共平面である/そうでない)を出力する
具体的には、点1を基準として点2へのベクトル (a1, b1, c1) と点3へのベクトル (a2, b2, c2) を求め、それらの外積から平面の法線ベクトル (a, b, c) を計算します。さらに定数 d を求めて平面の方程式 ax + by + cz + d = 0 を構築し、4点目の座標を代入した結果が0になれば、4点は同一平面上にあると判定できます。
アルゴリズム
START
Step 1-> 3D空間上の点が共平面かどうかを判定する関数を宣言する
void check_coplanar(int x1,int y1,int z1,int x2,int y2,int z2, int x3, int y3, int z3, int x, int y, int z)
変数 int a1 = x2 - x1 を宣言
変数 int b1 = y2 - y1 を宣言
変数 int c1 = z2 - z1 を宣言
変数 int a2 = x3 - x1 を宣言
変数 int b2 = y3 - y1 を宣言
変数 int c2 = z3 - z1 を宣言
変数 int a = b1 * c2 - b2 * c1 を宣言
変数 int b = a2 * c1 - a1 * c2 を宣言
変数 int c = a1 * b2 - b1 * a2 を宣言
変数 int d = (- a * x1 - b * y1 - c * z1) を宣言
判定処理
IF(a * x + b * y + c * z + d == 0) の場合
「coplanar(共平面である)」と出力
End
Else の場合
「not coplanar(共平面でない)」と出力
End
Step 2-> main() 内での処理
変数 int x1 = 2 , y1 = 3, z1 = 1, x2 = 1, y2 = 9, z2 = 3, x3 = 3, y3 = 1, z3 = 5, x4 = 23, y4 = 21, z4 = 9 を宣言・設定
check_coplanar(x1, y1, z1, x2, y2, z2, x3,y3, z3, x4, y4, z4) を呼び出す
STOPC++実装例
#include<bits/stdc++.h>
using namespace std ;
// 平面上の点が共平面かどうかを計算する
void check_coplanar(int x1,int y1,int z1,int x2,int y2,int z2, int x3, int y3, int z3, int x, int y, int z) {
int a1 = x2 - x1 ;
int b1 = y2 - y1 ;
int c1 = z2 - z1 ;
int a2 = x3 - x1 ;
int b2 = y3 - y1 ;
int c2 = z3 - z1 ;
int a = b1 * c2 - b2 * c1 ;
int b = a2 * c1 - a1 * c2 ;
int c = a1 * b2 - b1 * a2 ;
int d = (- a * x1 - b * y1 - c * z1) ;
if(a * x + b * y + c * z + d == 0)
cout << "they are coplanar" << endl;
else
cout << "they are not coplanar" << endl;
}
int main() {
int x1 = 2;
int y1 = 3 ;
int z1 = 1 ;
int x2 = 1 ;
int y2 = 9 ;
int z2 = 3 ;
int x3 = 3 ;
int y3 = 1 ;
int z3 = 5 ;
int x4 = 23 ;
int y4 = 21 ;
int z4 = 9 ;
check_coplanar(x1, y1, z1, x2, y2, z2, x3,y3, z3, x4, y4, z4) ;
return 0;
}実行結果
上記のコードを実行すると、次のような出力が得られます。
they are not coplanar
まとめ
このように、3点から求めた平面の方程式に4点目の座標を代入して評価することで、3D空間上の4点が同一平面上にあるかどうかを簡単に判定できます。外積による法線ベクトルの計算はコンピュータグラフィックスや幾何計算の基礎技術でもあるため、合わせて理解しておくと役立ちます。
-
C++で3つの点が同一直線上にあるかどうかを判定するプログラム
3つの異なる座標を持つ点が与えられ、それらの点が同一直線上に並んでいるかどうか(共線性・コリニア)を判定するのが本記事のテーマです。3つの点がすべて同じ直線上に乗っている場合、これらの点は「共線(collinear)」であるといいます。逆に、異なる直線上に配置されている場合は共線ではありません。以下の図は、共線な点と共線でない点の違いを示したものです。入力例と出力例入力1x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5出力1no points are not collinear入力2x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3
-
C++でべき等行列を判定するプログラムの作成方法
行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを