Zenn
📏

複数直線の近傍点を求める

2022/04/04に公開

その一(愚直に)

c\bm cを複数直線の近傍点,ui\bm u_iを直線上のある点,vi\bm v_iを直線の方向ベクトルとする.

複数直線の近傍点を求めるには,以下の式を最小化すればよい.

f(c,ki)=ic(ui+kivi)2 f(\bm c, k_i) = \sum_i ||\bm c - (\bm u_i + k_i \bm v_i)||^2

上式を偏微分して解く.

dfdc=0c=1nin(ui+kivi)dfdki=0ki=cTviuiTviviTvi \begin{align} \frac{df}{d\bm c} = 0 &\Leftrightarrow \bm c = \frac{1}{n} \sum_i^n (\bm u_i + k_i \bm v_i) \\ \frac{df}{dk_i} = 0 &\Leftrightarrow k_i = \frac{\bm c^T \bm v_i - \bm u_i^T \bm v_i}{\bm v_i^T \bm v_i} \end{align}

式(1)に式(2)を代入し,c\bm cについて解けば近傍点が求まる.

その二(少しお洒落に)

複数直線の近傍点c\bm cと直線の距離did_iは,以下の式で表すことができる.

di=cuisinθ=v×(cui) \begin{align*} d_i &= ||\bm c - \bm u_i||\sin \theta \\ &= ||\bm v \times (\bm c - \bm u_i)|| \end{align*}

複数直線の近傍点は,以下の式で表される.

c=arg minidi2 \bm c = \mathop{\rm arg~min} \sum_i d_i^2

idi2\sum_i d_i^2c\bm cの成分ごとに偏微分して解けば,近傍点が求まる.

参考文献

Point cloud to point cloud rigid transformations
Nearest approaches to multiple lines in n-dimensional space

GitHubで編集を提案

Discussion

ログインするとコメントできます