已知三维空间中的一堆点,拟合平面平面的方程为 a x + b y + c z = d ax + by + cz = d ax+by+cz=d,为了容易得到平面到原点距离,需要使 a 2 + b 2 + c 2 = 1 a^{2}+b^{2}+c^{2}=1 a2+b2+c2=1。
首先计算这些点 ( x i , y i , z i ) (x_{i},y_{i},z_{i}) (xi,yi,zi)的平均坐标 ( x ˉ , y ˉ , z ˉ ) (\bar x,\bar y,\bar z) (xˉ,yˉ,zˉ),显然,有 a x ˉ + b y ˉ + c z ˉ = d a\bar x + b\bar y + c\bar z = d axˉ+byˉ+czˉ=d
与平面方程相减,并写为矩阵形式,得到
[ x 1 − x ˉ y 1 − y ˉ z 1 − z ˉ x 2 − x ˉ y 2 − y ˉ z 2 − z ˉ x 3 − x ˉ y 3 − y ˉ z 3 − z ˉ . . . x n − x ˉ y n − y ˉ z n − z ˉ ] [ a b c ] = 0 \begin{bmatrix} {{x_1} - \bar x} & {{y_1} - \bar y} & {{z_1} - \bar z} \\ {{x_2} - \bar x} & {{y_2} - \bar y} & {{z_2} - \bar z} \\ {{x_3} - \bar x} & {{y_3} - \bar y} & {{z_3} - \bar z} \\ {} & {...} & {} \\ {{x_n} - \bar x} & {{y_n} - \bar y} & {{z_n} - \bar z} \\ \end{bmatrix} \begin{bmatrix} a \\ b \\ c \\ \end{bmatrix} =0 ⎣⎢⎢⎢⎢⎡x1−xˉx2−xˉx3−xˉxn−xˉy1−yˉy2−yˉy3−yˉ...yn−yˉz1−zˉz2−zˉz3−zˉzn−zˉ⎦⎥⎥⎥⎥⎤⎣⎡abc⎦⎤=0
另左边矩阵为 A A A,右边矩阵为 X X X,则拟合的目标函数为 min ∣ ∣ A X ∣ ∣ \min ||AX|| min∣∣AX∣∣,并具有约束 ∣ X ∣ ∣ = 1 |X|| = 1 ∣X∣∣=1。
对 A A A做奇异值分解
A = U D V T A = UD{V^T} A=UDVT
其中, D D D是对角矩阵, U U U和 V V V均为酉矩阵。
所以 ∣ ∣ A X ∣ ∣ = ∣ ∣ U D V T X ∣ ∣ = ∣ ∣ D V T X ∣ ∣ ||AX|| = ||UD{V^T}X|| = ||D{V^T}X|| ∣∣AX∣∣=∣∣UDVTX∣∣=∣∣DVTX∣∣(酉矩阵性质),其中 V T X V^TX VTX为列矩阵,并且 ∣ V T X ∣ ∣ = ∣ ∣ X ∣ ∣ = 1 |{V^T}X|| = ||X|| = 1 ∣VTX∣∣=∣∣X∣∣=1。
因为 D D D的对角元素为奇异值,最后一个对角元素为最小奇异值,当且仅当
V T X = [ 0 0 1 ] {V^T}X = \begin{bmatrix} 0 \\ 0 \\ 1 \\ \end{bmatrix} VTX=⎣⎡001⎦⎤
时, ∣ ∣ A X ∣ ∣ ||AX|| ∣∣AX∣∣ 取到最小值,此时
X = [ a b c ] = V [ 0 0 1 ] X =\begin{bmatrix} a\\b\\c \end{bmatrix}= {V}\begin{bmatrix} 0 \\ 0 \\ 1 \\ \end{bmatrix} X=⎣⎡abc⎦⎤=V⎣⎡001⎦⎤
而 ( a , b , c ) (a,b,c) (a,b,c)即为平面 a x + b y + c z = d ax + by + cz = d ax+by+cz=d的法向量。
该方法的代码实现可以参考笔者以前的博客
https://blog.csdn.net/iamqianrenzhan/article/details/103463932。