空間上の球体; 3D Sphere
概要
空間上の球体は中心ベクトル\(\boldsymbol{v_c}\)と半径\(r\)で表現される。
表面積
球の表面積\(S\)は以下で与えられる。
\(\quad \displaystyle S = 4 r^2 \pi \)
体積
球の体積\(V\)は以下で与えられる。
\(\quad \displaystyle V = \frac{4}{3} r^3 \pi \)
4点を通る球
4つのベクトル\(\boldsymbol{v_1}=(x_1, y_1, z_1)^T, \boldsymbol{v_2}=(x_2, y_2, z_2)^T, \boldsymbol{v_3}=(x_3, y_3, z_3)^T, \boldsymbol{v_4}=(x_4, y_4, z_4)^T\)を通る球面の中心ベクトル\(\boldsymbol{v_c}\)と半径\(r\)は以下で与えられる。
\( \quad \displaystyle \boldsymbol{v_c} = \frac{1}{2 d}(a, b, c)^T \\ \quad \displaystyle r = |\boldsymbol{v_1} - \boldsymbol{v_c} | \\ \quad a = \begin{vmatrix} t_1 & y_1 & z_1 & 1 \\ t_2 & y_2 & z_2 & 1 \\ t_3 & y_3 & z_3 & 1 \\ t_4 & y_4 & z_4 & 1 \end{vmatrix}, \quad \quad b = \begin{vmatrix} x_1 & t_1 & z_1 & 1 \\ x_2 & t_2 & z_2 & 1 \\ x_3 & t_3 & z_3 & 1 \\ x_4 & t_4 & z_4 & 1 \end{vmatrix}, \quad \quad c = \begin{vmatrix} x_1 & y_1 & t_1 & 1 \\ x_2 & y_2 & t_2 & 1 \\ x_3 & y_3 & t_3 & 1 \\ x_4 & y_4 & t_4 & 1 \end{vmatrix}, \quad \quad d = \begin{vmatrix} x_1 & y_1 & z_1 & 1 \\ x_2 & y_2 & z_2 & 1 \\ x_3 & y_3 & z_3 & 1 \\ x_4 & y_4 & z_4 & 1 \end{vmatrix} \quad \\ \quad t_1 = |v_1|^2, \quad t_2 = |v_2|^2, \quad t_3 = |v_3|^2, \quad t_4 = |v_4|^2 \)
ソースコード
namespace Geometry.Geometry3D {
/// <summary>球</summary>
public class Sphere3D {
/// <summary>コンストラクタ</summary>
public Sphere3D(Vector3D center, double radius) {
this.Center = center;
this.Radius = radius;
}
/// <summary>コンストラクタ</summary>
public Sphere3D(Vector3D vector1, Vector3D vector2, Vector3D vector3, Vector3D vector4) {
double x1 = vector1.X, y1 = vector1.Y, z1 = vector1.Z, t1 = vector1.SquareNorm;
double x2 = vector2.X, y2 = vector2.Y, z2 = vector2.Z, t2 = vector2.SquareNorm;
double x3 = vector3.X, y3 = vector3.Y, z3 = vector3.Z, t3 = vector3.SquareNorm;
double x4 = vector4.X, y4 = vector4.Y, z4 = vector4.Z, t4 = vector4.SquareNorm;
double a_det = Determinant(t1, y1, z1, t2, y2, z2, t3, y3, z3, t4, y4, z4);
double b_det = Determinant(x1, t1, z1, x2, t2, z2, x3, t3, z3, x4, t4, z4);
double c_det = Determinant(x1, y1, t1, x2, y2, t2, x3, y3, t3, x4, y4, t4);
double d_det = Determinant(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4);
this.Center = new Vector3D(a_det, b_det, c_det) / (2 * d_det);
this.Radius = Vector3D.Distance(vector1, this.Center);
}
/// <summary>中心</summary>
public Vector3D Center { get; set; }
/// <summary>半径</summary>
public double Radius { get; set; }
/// <summary>面積</summary>
public double Area => 4 * Radius * Radius * Math.PI;
/// <summary>体積</summary>
public double Volume => 4.0 / 3.0 * Radius * Radius * Radius * Math.PI;
/// <summary>不正な球</summary>
public static Sphere3D Invalid => new Sphere3D(Vector3D.Invalid, double.NaN);
/// <summary>有効な球であるか判定</summary>
public static bool IsValid(Sphere3D sphere) {
return Vector3D.IsValid(sphere.Center) && !double.IsNaN(sphere.Radius) && !double.IsInfinity(sphere.Radius);
}
/// <summary>行列式</summary>
private static double Determinant(double e11, double e12, double e13, double e21, double e22, double e23, double e31, double e32, double e33, double e41, double e42, double e43) {
return e11 * (e32 * e43 + e22 * (e33 - e43) - e33 * e42 - e23 * (e32 - e42)) - e21 * (e32 * e43 - e33 * e42)
- e12 * (e31 * e43 + e21 * (e33 - e43) - e33 * e41 - e23 * (e31 - e41)) + e22 * (e31 * e43 - e33 * e41)
+ e13 * (e31 * e42 + e21 * (e32 - e42) - e32 * e41 - e22 * (e31 - e41)) - e23 * (e31 * e42 - e32 * e41);
}
}
}
関連項目
空間ベクトル
空間上の同次変換行列
空間上の線分
空間上の直線
空間上の三角形
空間上の円
空間上の平面
空間上の四面体
空間上の交差
四元数
空間上の球 単体テスト