幾何学幾何学
空間上の球体; 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);
        }
    }
}

関連項目
空間ベクトル
空間上の同次変換行列
空間上の線分
空間上の直線
空間上の三角形
空間上の円
空間上の平面
空間上の四面体
空間上の交差
四元数
空間上の球 単体テスト

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類